Ich versuche manuell JMS Listener in meiner Spring Boot App zu starten/stoppen. Ich bin derzeit die folgende Konfiguration zu meinem Container Fabrik mit:Spring Boot JMS AutoStartup
@EnableJms
public class ConfigJms {
...
@Bean(name = "queueContainerFactory")
public JmsListenerContainerFactory<?> queueContainerFactory(ConnectionFactory cf) {
ActiveMQConnectionFactory amqCf = (ActiveMQConnectionFactory) cf;
amqCf.setTrustAllPackages(true);
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(amqCf);
**factory.setAutoStartup(false);**
return factory;
}
...
}
Nach factory.setAutoStartup(false);
Prüfung Ich bin ganz verwirrt, weil auch keine Zuhörer für dieses Werk Behälter beginnen angibt zu tun, werden die Zuhörer bereits registriert und gestartet, wenn Sie den Kontext beginnt.
Ich habe diese Situation mit einem jmsListenerEndpointRegistry
getestet.
jmsListenerEndpointRegistry.isAutoStartup() is true
und jmsListenerEndpointRegistry. isRunning() is true
vor jmsListenerEndpointRegistry.start();
ausführen Ist es notwendig, etwas anderes zu konfigurieren? Vielleicht unterlasse ich es, einige Autokonfigurationen zu überschreiben.
EDIT 1: Ungültige von JmsListenerEndpointRegistry Zuhörer
entdeckte ich ein paar Inkonsistenzen in meine Bohnen:
jmsListenerEndpointRegistry.getListenerContainerIds().size()
immer 0. jmsListenerEndpointRegistry.isAutoStartup()
nur eine Rückkehr wahre Methode ist.
Auch wenn ich ein paar Zuhörer mit Anmerkungen wie folgt registrieren:
@JmsListener(containerFactory="queueContainerFactory", destination = "${dest}")
jmsListenerEndpointRegistry
keine Informationen über diese Zuhörer Status zeigen nicht, aber sie sind zu ActiveMQ beim Start verbunden. (Überprüfung der ActiveMQ Admin-Konsole)
EDIT 2: @JmsListener startet auch Auto-Startup auf false gesetzt ist
ich die jmsListenerEndpointRegistry
für jeden Behälter überprüft und ich weiß nicht, ob dies ein Fehler ist oder ich Ich definiere die Konfiguration nicht richtig. Ich definiere jedoch nur die Container-Fabrik wie zuvor erklärt, wobei AUTO-START auf "falsch" gesetzt ist und beide Listener gestartet sind und Nachrichten konsumieren (laufen).
Aus meiner Log-Datei:
jmsListenerEndpointRegistry ID <org.springframework.jms.JmsListenerEndpointContainer#1>, Auto-Startup <false>, Running <true>
jmsListenerEndpointRegistry ID <org.springframework.jms.JmsListenerEndpointContainer#0>, Auto-Startup <false>, Running <true>
Machst du eine explizite 'start()' auf dem Anwendungskontext? 'autoStartup' bezieht sich nur auf den Start des Kontextaufrufs während der Kontextinitialisierung. Es hat keine Bedeutung, wenn Sie 'start()' für den Kontext aufrufen, nachdem er erstellt wurde, wodurch alle Beans gestartet werden, unabhängig von 'autoStartup'. –
Nein. Ich rufe nur run() auf Spring Boot. Könnte von einem untergeordneten run() aufgerufen werden? – crm86
Bitte teilen Sie auf der GitHub eine einfache Spring Boot-Anwendung von unserer Seite. Ich erinnere mich, dass es ein 'start()' Problem mit Spring Cloud Stream gab, BTW ... –