2016-07-20 3 views
1

Новичок здесь ..Java Akka Актеры - дроссельные сообщений и приоритета

Использование AKKA версии: Акка-actor_2.11 (2.4.8) с помощью API Java.

Я пытаюсь разработать актера для создания PDF-документов. Эти PDF-документы могут быть большими, поэтому, очевидно, я хочу уменьшить скорость, с которой актер обрабатывает запрос. Также в качестве побочного требования мне также нужен «приоритетный» почтовый ящик, с помощью которого запросы генерации PDF могут обрабатываться на основе приоритета подчиненными участниками.

В моем запуске приложения, я создать глобальный реквизит, как это:

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

Затем я создаю актер одного запроса в формат PDF, как это:

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

Моего application.conf выглядит следующим образом:

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

My PriorityMailbox выглядит так:

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; 
       } 
      } 
     }); 
    } 
} 

Действительно ли это правильная конфигурация для достижения того, что я хотел? Я не уверен, что я что-то упустил. Во-первых, я не вижу никаких System.out.prints в моей реализации почтового ящика. Я бы предположил, что он должен прийти туда, чтобы сравнить приоритет.

Во-вторых, я ожидал бы, что PdfGenerationActor будет выполняться последовательно (один за другим), потому что это по существу один экземпляр в системе. Но я этого не вижу. Я вижу несколько участников, обрабатывающих запросы одновременно.

Я думаю, что здесь отсутствует что-то принципиальное.

ответ

0

Я думаю, что в вашем случае происходит то, что каждый созданный вами актер имеет собственный маршрутизатор, но в остальном они независимы - поэтому они выполняются параллельно.

Если вы хотите, чтобы ваши запросы выполнялись последовательно, идея заключалась бы в том, чтобы иметь один маршрутизатор с одним «рабочим»/маршрутом, который выполняет каждый запрос один за другим. (Конечно, вы можете настроить количество запросов, который вы хотите выполнить параллельно)

Таким образом, вы бы что-то вроде этого:

в конф:

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 
     } 
} 

в коде:

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

проверка также документация для mailboxes и routers

 Смежные вопросы

  • Нет связанных вопросов^_^