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
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 :)
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();
}}
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
- 1. Definieren Sie Bean abhängig von Spring's Bean
- 2. Mule sftp-Endpunkt mit dynamischen Eigenschaften
- 3. Spring 3.1 Bean Sichtbarkeit mit Bean Definitionsprofile
- 4. Apache CXF Spring Bean ist nicht injiziert
- 5. Spring Custom Converter - Bean oder nicht Bean
- 6. Spring: @Component versus @Bean
- 7. Spring Bean destroyMethod
- 8. Spring MVC Bean-Konvertierung
- 9. Spring Bean Eigenschaften persistent
- 10. Spring Bean Scopes
- 11. Spring keystore bean
- 12. Spring Bean Zerstörungsmethode
- 13. Session aware spring bean
- 14. Abhängig von einem Spring-Projekt von einem Nicht-Spring-Projekt
- 15. Spring inject Eigenschaftswerte von einer Bean in eine andere Bean
- 16. Spring ApplicationContext-Bean-Bereich
- 17. Spring 3 Bean-Instanziierungssequenz
- 18. Spring Bean Tag Fehler
- 19. Spring Framework Bean Fehler
- 20. Spring Bean Instanziierung Bestellung
- 21. Optional Spring-Bean Referenzen
- 22. Spring request Bean
- 23. Spring Bean Umfang. Singleton und Prototyp
- 24. Spring Boot Actuator Endpunkt Override
- 25. Spring MVC: Wie funktioniert Spring Bean?
- 26. Erstellen Sie eine Bean abhängig von der Eigenschaft, die der Factory-Bean zugewiesen wird
- 27. Reinitialisierung von Spring Bean während der Laufzeit?
- 28. Spring von enum zu Bean Konfigurationseigenschaften
- 29. Spring Security OAuth2 check_token Endpunkt
- 30. XSLT Hinzufügen von Spring Bean zu beans.xml
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