2013-07-03 12 views
7

Ho una classe java che crea un database MongoDB pulito con collezioni seed. Identifica automaticamente se il database è mancante e lo crea. Vorrei eseguire questo quando avvio MuleEsb. In questo modo non ho bisogno di ricordarmi di invocarlo prima di iniziare il mulo. Speravo di metterlo dentro un flusso ed eseguire quel flusso una volta, automaticamente quando il mulo si avvia.Come eseguire un flusso una volta, automaticamente all'avvio del mulo?

Esiste un modo per eseguire questa operazione una volta sola all'avvio del mulo?

--- --- Aggiornamento

Come per la conversazione qui sotto ho aggiunto il seguente al mio config mulo e il flusso si attiva automaticamente.

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

risposta

12

ho creato un JIRA un mese fa per richiedere tale caratteristica: http://www.mulesoft.org/jira/browse/MULE-6877

Per il momento, è possibile utilizzare un trucco: a Quartz inbound endpoint with an event generator jobrepeatCount = 0 che attiverà il flusso di solo una volta in fase di avvio.

In alternativa, è possibile ascoltare gli eventi di contesto e richiamare un flusso quando viene attivato un evento specifico. Quanto segue mostra un ascoltatore che richiama un avvio e un flusso di arresto:

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

configurato con:

<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

Nizza risposta! Grazie. Se creo un endpoint inbound quarzo, non è necessario specificare un endpoint in uscita? – TERACytE

+0

No, non lo farai, un singolo endpoint in quarzo in entrata nel tuo flusso lo farà. –

+0

Poiché utilizzo la v3.2.1, il costruttore DefaultMuleMessage() non ha un'opzione FlowConstruct. Inoltre, penso che la soluzione al quarzo sia un po 'più pulita dato che sembra che posso mettere il quarzo: endpoint in entrata all'interno del flusso che voglio eseguire automaticamente. Non ho familiarità con l'esecuzione di un flusso attraverso il quarzo però. Ci sono esempi di questo? – TERACytE

Problemi correlati