2013-07-03 4 views
7

У меня есть класс java, который создает чистую базу данных MongoDB с посеянными коллекциями. Он автоматически определяет отсутствие базы данных и ее создание. Я хотел бы запустить это, когда запустил MuleEsb. Таким образом, мне не нужно забывать призывать его, прежде чем я начну мул. Я надеялся поместить его в поток и запустить этот поток один раз, автоматически, когда мул запускается.Как запустить поток один раз, автоматически при запуске мула?

Есть ли способ сделать это одноразовую операцию при запуске мула?

--- Update ---

По разговору ниже я добавил следующее в мой мул конфигурации и поток запускается автоматически.

<quartz:connector name="Quartz" validateConnections="true"/> 

<flow name="testService1"> 
    <quartz:inbound-endpoint name="runOnce" repeatCount="0" repeatInterval="1" jobName="job1" connector-ref="Quartz"> 
     <quartz:event-generator-job> 
      <quartz:payload>foo</quartz:payload> 
     </quartz:event-generator-job> 
    </quartz:inbound-endpoint> 

    <logger message="INBOUND HEADERS = #[headers:inbound:*]" level="WARN"/> 
</flow> 

ответ

12

Я создал JIRA месяц назад, чтобы запросить такую ​​особенность: http://www.mulesoft.org/jira/browse/MULE-6877

На данный момент, вы можете использовать трюк: a Quartz inbound endpoint with an event generator jobrepeatCount = 0, что будет инициировать поток только один раз при запуске.

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

package com.acme; 

import org.mule.DefaultMuleEvent; 
import org.mule.DefaultMuleMessage; 
import org.mule.MessageExchangePattern; 
import org.mule.api.MuleException; 
import org.mule.api.MuleRuntimeException; 
import org.mule.api.context.notification.MuleContextNotificationListener; 
import org.mule.config.i18n.MessageFactory; 
import org.mule.construct.Flow; 
import org.mule.context.notification.MuleContextNotification; 

public class FlowInvokingContextListener implements MuleContextNotificationListener<MuleContextNotification> 
{ 
    private Flow startingFlow; 
    private Flow stoppingFlow; 

    public void onNotification(final MuleContextNotification notification) 
    { 
     if (notification.getAction() == MuleContextNotification.CONTEXT_STARTED) 
     { 
      sendNotificationToFlow(notification, startingFlow); 
     } 
     else if (notification.getAction() == MuleContextNotification.CONTEXT_STOPPING) 
     { 
      sendNotificationToFlow(notification, stoppingFlow); 
     } 
    } 

    private void sendNotificationToFlow(final MuleContextNotification notification, final Flow flow) 
    { 
     try 
     { 
      final DefaultMuleEvent event = new DefaultMuleEvent(new DefaultMuleMessage(notification, 
       notification.getMuleContext()), MessageExchangePattern.REQUEST_RESPONSE, startingFlow); 
      flow.process(event); 
     } 
     catch (final MuleException me) 
     { 
      throw new MuleRuntimeException(MessageFactory.createStaticMessage("Failed to invoke: " 
                       + startingFlow), me); 
     } 
    } 

    public void setStartingFlow(final Flow startingFlow) 
    { 
     this.startingFlow = startingFlow; 
    } 

    public void setStoppingFlow(final Flow stoppingFlow) 
    { 
     this.stoppingFlow = stoppingFlow; 
    } 
} 

настроенный с:

<spring:beans> 
    <spring:bean name="flowInvokingContextListener" 
     class="com.acme.FlowInvokingContextListener" 
     p:startingFlow-ref="startFlow" p:stoppingFlow-ref="stopFlow" /> 
</spring:beans> 

<notifications> 
    <notification event="CONTEXT" /> 
    <notification-listener ref="flowInvokingContextListener" /> 
</notifications> 
+0

Ниццы ответ! Спасибо. Если я создаю входную конечную точку кварца, не нужно ли мне также указывать исходящую конечную точку? – TERACytE

+0

Нет, вы этого не сделаете, в вашем потоке будет только один входящий конец кварца. –

+0

Поскольку я использую v3.2.1, конструктор DefaultMuleMessage() не имеет опции FlowConstruct. Плюс я думаю, что решение кварца немного чище, так как кажется, что я могу поставить кварц: входящий-конечный пункт внутри потока, который я хочу автоматически запустить. Однако я не знаком с управлением потоком через кварц. Есть ли примеры этого? – TERACytE

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