Как вызвать выполнение частного потока из основного потока, когда настроен Quartz планировщик? - PullRequest
1 голос
/ 26 марта 2012
<flow name="Flow1">
   <quartz:inbound-endpoint jobName="ReadQ1" cronExpression="* 30 15 * * ?">
     <quartz:endpoint-polling-job>
     <quartz:job-endpoint address="jms://Q1"/>
     </quartz:endpoint-polling-job>
   </quartz:inbound-endpoint>
   <component>
     <singleton-object class="MyComponenet"/>
   </component>
   <choice>
      <when expression="payload==200" evaluator="groovy">
         <flow-ref name="Flow2"/>
      </when>
   </choice>
</flow>
<flow name="Flow2">
  <jms:inbound-endpoint queue="Q2"/>
  <component class="AnotherComponent"/>
  <jms:outbound-endpoint queue="Q3"/>
</flow>

Я ожидаю, что Flow1 будет выполняться по заданному графику кварца (15:30).И основываясь на возврате полезной нагрузки от MyComponent, я называю Flow2 для выполнения.Но Flow2 выполняется еще до запуска Flow1.

Как реализовать потоки, чтобы Flow2 всегда вызывался из Flow1?

Ответы [ 3 ]

0 голосов
/ 06 июня 2012

На самом деле Flow2 не является частным. Чтобы сделать его закрытым, вы должны удалить входящую конечную точку.

Без такого подхода поток не будет вызываться из элемента flow-ref.

С учетом сказанного вы можете использовать 3 подхода

  1. Подпоток (представлен в муле 3.2 и рекомендуется в настоящее время): он будет вести себя как исключение совместного использования подпрограммы в контексте вызывающего потока (например, стратегия исключения и пул потоков)
  2. Частный поток (для mule 3.1.x): он создаст новый поток с собственным контекстом, который будет обрабатывать сообщение, сгенерированное вызывающим потоком
  3. Опубликовать сообщение в очереди (например, jms Q2 или vm) и использовать его из текущего потока
0 голосов
/ 04 августа 2015

Вы можете объявить начальное состояние Flow2 как «остановленное»:

Это предотвратит запуск Flow2 до Flow1 (или вообще его запуск).

Тогда выможет программно запустить его с помощью скрипта groovy:

if (muleContext.registry.lookupFlowConstruct('Flow2').isStopped())
{
    muleContext.registry.lookupFlowConstruct('Flow2').start()
}

Как только вы запустите его, очередь jms начнет опрашивать.

Надеюсь, это поможет.

0 голосов
/ 29 марта 2012

Если вы используете flow-ref в flow1, то сделайте ваш flow2 в подпотоке. Затем удалите входящую в jms конечную точку из flow2

<sub-flow name="Flow2">
  <component class="AnotherComponent"/>
  <jms:outbound-endpoint queue="Q3"/>
</sub-flow>

И замените также flow3 на sub-flow, если вы хотите использовать flow-ref.

Другой вариант - заменить ваш поток-ref-вызов на <jms:outbound-endpoint queue="Q2"/> и оставить ваш поток2 таким же, как в вашем примере.

...