2017-04-07 4 views
0

우리는 봄 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(); 

우리는 메시지를 다시 처리 할 기대하지만 그렇지 않다, 아무것도 일어나지 (우리는 또한 예외를 얻을하지 않습니다 및/또는 오류).

Google 빈에서 잘못 구성 되었습니까? 컨테이너를 수동으로 중지/시작하려면 무엇이 누락 되었습니까?

답변

0

음 ... 나 자신에게 대답하는 중 ... 실종 된 것은 afterPropertiesSet() 메서드 호출입니다.

+0

'shutdown()'대신'stop()'을 사용할 수도 있습니다. –