2013-07-03 18 views
7

Posiadam klasę java, która tworzy czystą bazę danych MongoDB z zaimplementowanymi kolekcjami. Automatycznie określa, czy brakuje bazy danych i tworzy ją. Chciałbym uruchomić to, gdy uruchamiam MuleEsb. W ten sposób nie muszę pamiętać, aby go wywołać, zanim zacznę muła. Miałem nadzieję, że wsadzę go do strumienia i przepłynę, który przepłynie raz, automatycznie, gdy mule się uruchomią.Jak uruchomić przepływ raz, automatycznie po uruchomieniu muła?

Czy jest sposób na zrobienie tej jednorazowej operacji, kiedy zaczyna się muł?

--- Aktualizacja ---

Jak na rozmowie poniżej dodałem następujące do mojego mule config, a przepływ jest automatycznie uruchamiany.

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

Odpowiedz

12

stworzyłem JIRA miesiąc temu do żądania takiej funkcji: http://www.mulesoft.org/jira/browse/MULE-6877

Teraz można użyć trick: a Quartz inbound endpoint with an event generator jobrepeatCount = 0 które będą powodować przepływ tylko raz przy starcie.

Można również odsłuchać zdarzenia kontekstowe i wywołać przepływ po wywołaniu określonego zdarzenia. Poniżej przedstawiono słuchacza, który powołuje się na starcie i przepływ zamykania:

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

skonfigurowany z:

<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

Nicea odpowiedź! Dziękuję Ci. Jeśli utworzę kwanty przychodzące-punkt końcowy, czy nie muszę również określać punktu końcowego wychodzącego? – TERACytE

+0

Nie, nie, pojedynczy kwarcowy punkt wejściowy w twoim strumieniu to zrobi. –

+0

Ponieważ używam wersji 3.2.1, konstruktor DefaultMuleMessage() nie ma opcji FlowConstruct. Plus myślę, że roztwór kwarcu jest trochę czystszy, ponieważ wydaje się, że mogę umieścić kwarc: punkt końcowy wejściowy wewnątrz strumienia, który chcę automatycznie uruchomić. Nie jestem jednak zaznajomiony z przepływaniem przez kwarc. Czy są jakieś przykłady tego? – TERACytE

Powiązane problemy