2016-07-20 8 views
1

hier Newbie ..Java Akka Schauspieler - Nachrichten Drosselung und Priorität

Mit Akka Version: akka-actor_2.11 (2.4.8) über den Java-API.

Ich versuche, einen Akteur für die Generierung von PDF-Dokumenten zu entwickeln. Diese PDF-Dokumente können groß sein, also möchte ich offensichtlich die Rate drosseln, mit der der Akteur die Anfrage bearbeitet. Als Nebenbedingung benötige ich auch einen "priorisierbaren" Posteingang, mit dem die PDF-Generierungsanfragen nach Priorität von den zugrunde liegenden Akteuren bearbeitet werden können.

In meinem Start der Anwendung, erstelle ich eine globale Requisiten wie folgt aus:

Props.create(PdfGeneratorActor.class).withDispatcher("prio-dispatcher").withRouter(new RoundRobinPool(1)) 

Dann erstelle ich Schauspieler pro pdf Anfrage wie folgt aus:

actorSystem.actorOf(propsObjShownAbove, actorType.getCanonicalName() + "_" + UUID.randomUUID()); 

Meine application.conf wie folgt aussieht:

prio-dispatcher { 
    mailbox-type = "com.x.y.config.PriorityMailbox" 
} 

Mein PriorityMailbox sieht wie folgt aus:

public class PriorityMailbox extends UnboundedPriorityMailbox { 
    // needed for reflective instantiation 
    public PriorityMailbox(final ActorSystem.Settings settings, final Config config) { 
     super(new PriorityGenerator() { 
      @Override 
      public int gen(final Object message) { 
       System.out.println("Here is my message to be prioritized: "+message); 
       if (message instanceof Prioritizable) { 
        Prioritizable prioritizable = (Prioritizable) message; 
        if (prioritizable.getReportPriorityType() == ReportPriorityType.HIGH) { 
         return 0; 
        } else if (prioritizable.getReportPriorityType() == ReportPriorityType.LOW) { 
         return 2; 
        } else if (message.equals(PoisonPill.getInstance())) { 
         return 3; // PoisonPill when no other left 
        } else { 
         return 1; 
        } 
       } else { 
        // Default priority for any other messages. 
        return 1; 
       } 
      } 
     }); 
    } 
} 

Ist dies die richtige Konfiguration, um das zu erreichen, was ich wollte? Ich bin mir nicht sicher, ob ich etwas verpasse. Erstens kann ich keine System.out.prints in meiner Mailbox-Implementierung sehen. Ich könnte mir vorstellen, dass es dorthin kommen sollte, um die Priorität zu vergleichen.

Zweitens würde ich erwarten, dass der PdfGenerationActor sequenziell ausgeführt wird (eins nach dem anderen), weil es im Wesentlichen eine einzige Instanz über das System ist. Aber ich sehe das nicht. Ich sehe mehrere Akteure, die die Anfragen gleichzeitig bearbeiten.

Ich denke, ich vermisse etwas Grundlegendes hier.

Antwort

0

Ich denke, was in Ihrem Fall passiert, ist, dass jeder Akteur, den Sie erstellen, seinen eigenen Router hat, aber ansonsten sind sie unabhängig - also werden sie parallel ausgeführt.

Wenn Sie möchten, dass Ihre Anfragen sequentiell ausgeführt werden, besteht die Idee darin, einen Router mit einem "Worker"/routee zu haben, der jede Anfrage nacheinander ausführt. (Natürlich können Sie die Anzahl der Anforderungen konfigurieren Sie parallel ausführen wollen)

So würden Sie so etwas wie dieses:

im conf:

mypriority-mailbox { 
     mailbox-type = "com.x.y.config.PriorityMailbox" 
     mailbox-capacity = 500 #some stuff - you may want to check what you want here - if you want something 
     mailbox-push-timeout-time = 100s #some other stuff - check if it makes sense for you 
} 

actor { 
    /pdfRouter{ 
     router = round-robin-pool 
     nr-of-instances = 1 
     mailbox = mypriority-mailbox 
     } 
} 

im Code:

system.actorOf(
      FromConfig.getInstance().props(PdfGeneratorActor.class), 
      "pdfRouter"); 
} 

Überprüfen Sie auch die Dokumentation für mailboxes und routers

Verwandte Themen