0

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

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'. –

+0

Nein. Ich rufe nur run() auf Spring Boot. Könnte von einem untergeordneten run() aufgerufen werden? – crm86

+0

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

Antwort

1

Sie etwas haben, müssen anderes passiert - ich schrieb nur einen schnellen Boot-App (1.4.1) und der Behälter nicht gestartet ...

@SpringBootApplication 
public class So39654027Application { 

    public static void main(String[] args) { 
     ConfigurableApplicationContext context = SpringApplication.run(So39654027Application.class, args); 
     JmsListenerEndpointRegistry reg = context.getBean(JmsListenerEndpointRegistry.class); 
     MessageListenerContainer listenerContainer = reg.getListenerContainer("foo"); 
     System.out.println(listenerContainer.isRunning()); 
    } 

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

    @JmsListener(id="foo", destination = "so39654027", containerFactory = "queueContainerFactory") 
    public void listen(String foo) { 
     System.out.println(foo); 
    } 

} 

und ...

2016-09-23 09:24:33.428 INFO 97907 --- [   main] com.example.So39654027Application  : Started So39654027Application in 1.193 seconds (JVM running for 2.012) 
false 

ich schlage vor, Sie einen Debugger in dem start() Methode des Containers verwenden, um zu sehen, warum es gestartet werden.

+0

Es war mein Fehler. Ich habe die JmsListenerEndpointRegistry zweimal ausgeführt. Debug bei Start() war auch nützlich. – crm86