2017-03-14 3 views
0

Ich habe eine Bean in Mule, die eine Nachricht senden muss, bevor ein TCP-Endpunkt beim Herunterfahren getrennt wird. Die Bean implementiert Lifecycle und ist mit "depends-on = connector" konfiguriert, aber es scheint so, als hätte die "abhängigkeit" keine Auswirkung auf die Abschaltreihenfolge. Der Endpunkt ist nicht mehr verbunden, wenn die Methode stop für meine Bean aufgerufen wird. Gibt es eine Möglichkeit, die Methode "stop" für meine Bean aufzurufen, bevor sie auf dem Endpunkt oder Connector aufgerufen wird? Ich benutze Mule 3.7 CE.Spring Bean ist abhängig von Mule Endpunkt

Antwort

0

Versuch zum MuleContextNotification und warten Sie auf eine CONTEXT_STOPPING Aktion zu hören TCP Anruf auslösen.

Siehe Beispiel unten:

public class MuleContextListener implements MuleContextNotificationListener<MuleContextNotification>,MuleContextAware { 

    private MuleContext context; 
    private final static Logger logger = LogManager.getLogger(MuleContextListener.class); 

    @Override 
    public void onNotification(MuleContextNotification notification) { 
     logger.info("NOTIFICATION RECEIVED!!!!!"); 
     logger.info(MuleContextNotification.getActionName(notification.getAction())); 
     if(notification.getAction() == MuleContextNotification.CONTEXT_STOPPING){ 
      //replace with your tcp call 
      logger.info(" MY ACTION HAS BEEN TRIGGER"); 
     } 
    } 

    @Override 
    public void setMuleContext(MuleContext context) { 
     this.context = context; 
    } 
} 

Zum Testen ich eine andere Bohne haben, dass implementiert Lifecycle aufhaltbare ...

public class ClassStopLc implements Stoppable { 

    @Override 
    public void stop() throws MuleException { 
     logger.info(" ClassStopLC Stopping"); 
    } 

Wenn ich meine Protokolle überprüfen:

2017-03-22 16:08:26,827 [[mulecontextaware].mulecontextawareFlow.1.02] INFO mulecontextaware.MuleContextListener - NOTIFICATION RECEIVED!!!!! 
2017-03-22 16:08:26,827 [[mulecontextaware].mulecontextawareFlow.1.02] INFO mulecontextaware.MuleContextListener - mule context stopping 
2017-03-22 16:08:26,827 [[mulecontextaware].mulecontextawareFlow.1.02] INFO mulecontextaware.MuleContextListener - MY ACTION HAS BEEN TRIGGER 
. 
. 
. 
2017-03-22 16:08:32,077 [[mulecontextaware].mulecontextawareFlow.1.02] INFO org.mule.util.queue.QueueXaResourceManager - Stopping ResourceManager 
2017-03-22 16:08:32,077 [[mulecontextaware].mulecontextawareFlow.1.02] INFO org.mule.util.queue.QueueXaResourceManager - Stopped ResourceManager 
2017-03-22 16:08:32,080 [[mulecontextaware].mulecontextawareFlow.1.02] INFO mulecontextaware.ClassStopLc - ClassStopLC Stopping 
2017-03-22 16:08:32,082 [[mulecontextaware].mulecontextawareFlow.1.02] INFO mulecontextaware.MuleContextListener - NOTIFICATION RECEIVED!!!!! 
2017-03-22 16:08:32,082 [[mulecontextaware].mulecontextawareFlow.1.02] INFO mulecontextaware.MuleContextListener - mule context stopped 
2017-03-22 16:08:32,083 [[mulecontextaware].mulecontextawareFlow.1.02] INFO mulecontextaware.MuleContextListener - NOTIFICATION RECEIVED!!!!! 
2017-03-22 16:08:32,083 [[mulecontextaware].mulecontextawareFlow.1.02] INFO mulecontextaware.MuleContextListener - mule context disposing 

Nicht sicher, wenn die stoppstufe erlaubt es Ihnen, den TCP-anruf ohne irgendein problem zu machen, könnten sie versuchen und lassen sie mich wissen? Ich bin ziemlich neugierig :)

+0

Die Implementierung von MuleContextNotificationListener löste das Problem. Betrachtet man den Mule-Source-Code für 3.7, so sind es aufgrund der Reihenfolge Komponenten, die heruntergefahren werden. Ab Zeile 61 von org.mule.lifecycle.phanes.MuleContextStopPhase werden Objekte in der folgenden Reihenfolge heruntergefahren: FlowConstruct, Model, Agent, Connector, Config, QueueManager und schließlich Stoppable. [Link] (http://grepcode.com/file/repo1.maven.org/maven2/org.mule/mule-core/3.7.0/org/mule/lifecycle/phases/MuleContextStopPhase.java) – user1932673

0

Können Sie angeben, welchen Lebenszyklus Ihr Bean implementiert? Ist das auch eine Singleton Bean oder Prototyp Bean?

Laut Dokumentation - https://docs.mulesoft.com/mule-user-guide/v/3.7/developing-components#component-lifecycle

Sie könnten die Schnittstelle org.mule.api.lifecycle.Callable implementieren und nur mit der Methode ONCALL auslösen jede Operation.

Beispiel:

public class MyClass implements Callable { 

@Override 
public Object onCall(MuleEventContext eventContext) throws Exception { 
    //DO SOMETHING 
    //Call STOP method 
    return eventContext.getMessage().getPayload(); 
}} 
+0

Die Bean ist ein Singleton und implementiert org.mule.api.lifecycle.Lifecycle. Beim Herunterfahren ruft mule stop() für meine Klasse wie erwartet auf, aber ich muss es aufrufen, bevor stop() für den Connector aufgerufen wird, damit ich eine Nachricht senden kann, bevor der Endpunkt des Connectors getrennt wird. – user1932673