2017-04-07 80 views
0

我們使用Spring 4.3.1,並使用以下豆都可以從一個隊列中的消息:無法重新啓動使用DefaultMessageListenerContainer

@Bean(name="listenerContainer") 
public SprMessageListenerContainer listenerContainer() throws JMSException, SQLException { 
    SprMessageListenerContainer listenerContainer = new SprMessageListenerContainer(); 
    listenerContainer.setConnectionFactory((ConnectionFactory) connectionFactory()); 
    listenerContainer.setMessageListener(messageListener()); 
    listenerContainer.setSessionTransacted(true); 
    listenerContainer.setCacheLevel(0); 
    listenerContainer.setMaxConcurrentConsumers(3); 
    listenerContainer.setDestinationName("ourQueue"); 
    // (April 2017): we provide the possibility to manually stop/start the listner container > autostart needs to be set to false, otherwise we can only stop the container, but not restart it anymore 
    //     see: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/AbstractJmsListeningContainer.html#setAutoStartup-boolean- 
    listenerContainer.setTransactionManager(jmsTransactionManager()); 
    listenerContainer.setAutoStartup(false); 
    listenerContainer.start(); 
    Assert.isTrue(listenerContainer.isRunning()); 
    return listenerContainer; 
} 

@Bean(name="connectionFactory") 
public ConnectionFactory connectionFactory() throws JMSException, SQLException { 
    return AQjmsFactory.getConnectionFactory(dataSourceConfig.gpDataSourceAdapter()); 
} 

    private JmsTransactionManager jmsTransactionManager() throws JMSException, SQLException { 
    JmsTransactionManager transactionManager = new JmsTransactionManager(); 
    transactionManager.setConnectionFactory(connectionFactory()); 
    return transactionManager; 
} 

SprMessageListenerContainer是:

public class SprMessageListenerContainer extends DefaultMessageListenerContainer { 

@Override 
protected MessageConsumer createConsumer(Session session, Destination destination) throws JMSException { 
    return ((AQjmsSession) session).createConsumer(destination, null, new SprORADataFactory(), null, false); 
} 

@Override 
protected void doShutdown() throws JMSException { 
    logger.info("Shutting done."); 
} 

}

在我們的應用程序中,我們正確地獲得了對listenerContainer bean的引用。當應用程序啓動時,監聽器被正確啓動,並且我們看到正在處理的消息。

在我們的代碼,只要我們做到:

listenerContainer.shutdown(); 

,再沒有消息將不再>處理的預期。

但是,進一步在我們的代碼,我們這樣做:

listenerContainer.start(); 

我們希望消息被再次處理,但它不是這種情況,沒有發生(我們還沒有得到任何的異常和/或錯誤)。

是否在我們的bean中配置了錯誤?爲了手動停止/啓動我們的容器,可能會丟失什麼?

回答

0

呃......回答自己......缺少的是對afterPropertiesSet()方法的調用。

+0

你也可以使用'stop()'而不是'shutdown()'。 –