동일한 'main'스레드에서 DefaultMessageListenerContainer를 실행하려는 경우가 있습니다. 지금은 SimpleAsyncTaskExecutor를 사용하여 메시지를받을 때마다 새 스레드를 생성합니다.'main'스레드에서 DefaultMessageListenerContainer를 실행하는 방법
우리는 다른 분산 시스템에 연결하여 처리를 수행하고 결국에는 몇 가지 것을 주장하는 테스트 케이스를 가지고 있습니다. DefaultMessageListenerContainer는 별도의 스레드에서 실행되므로 DefaultMessageListenerContainer가 완료되기 전에 주 스레드가 반환하고 실행을 시작합니다. 이로 인해 테스트 케이스가 실패하게됩니다. 해결 방법으로 주 스레드를 몇 초 동안 잠자기 상태로 만들었습니다.
샘플 설정
<int-jms:message-driven-channel-adapter
id="mq.txbus.publisher.channel.adapter"
container="defaultMessageListenerContainer"
channel="inbound.endpoint.publisher"
acknowledge="transacted"
extract-payload="true" />
<beans:bean id="defaultMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<beans:property name="connectionFactory" ref="mockConnectionFactory"/>
<beans:property name="destination" ref="publisherToTxmQueue"/>
<beans:property name="taskExecutor" ref="taskExecutor"/>
<beans:property name="maxMessagesPerTask" value="10"/>
<beans:property name="sessionTransacted" value="true"/>
</beans:bean>
<beans:bean id="taskExecutor" class="org.springframework.scheduling.timer.TimerTaskExecutor" />
나는 그것이 하나의 스레드를 만들지 만 문제가 해결되지 않은, 그래서 그 스레드가 메인 스레드가 아닌 별도이기 때문에 여기 TimerTaskExecutor를 사용하는 것을 시도하고있다. SyncTaskExecutor를 사용하여 시도했지만 그 중 하나가 작동하지 않습니다 (또는 dint가 올바른 속성 값을 제공 할 수 있습니까?).
답변 :
우리는 SimpleMessageListenerContainer를 사용하여이 문제를 해결했다. 이 새로운 설정
<int-jms:message-driven-channel-adapter
id="mq.txbus.publisher.channel.adapter"
container="messageListenerContainer"
channel="inbound.endpoint.publisher"
acknowledge="transacted"
extract-payload="true" />
<beans:bean id="messageListenerContainer" class="org.springframework.jms.listener.SimpleMessageListenerContainer">
<beans:property name="connectionFactory" ref="mockConnectionFactory"/>
<beans:property name="destination" ref="publisherToTxmQueue"/>
<beans:property name="sessionTransacted" value="true"/>
<beans:property name="exposeListenerSession" value="false"/>
</beans:bean>
감사합니다. 토마스! 이것은 매우 도움이됩니다. 또한 Mark Fisher가 메인 스레드에서이 리스너를 실행할 수 없다는 것을 분명히 한 곳에서 springforum에이 내용을 게시했습니다. http://forum.springsource.org/showthread.php?126158-How-to-run-DefaultMessageListenerContainer-on-the-main-thread –