[英]How to consume activemq message asynchronously using JMS, and also maintain transaction?
如何異步使用 JMS 消息(使用任務執行器),同時維護事務? 如果在 messageHandler 中發生任何異常,則應回滾並在 activemq 中重新排隊。 目前我正在這樣做,但它不會從隊列中選擇下一條消息,直到消息處理程序使用消息。(如果任何消息花費大量時間,隊列中的其他消息將被迫等待..)
return IntegrtionFlows.from(Consumer.class, gatewayProxySpec -> gatewayProxySpec.beanName(gatewayBeanName))
.channel(Jms.pollableChannel(connectionFactory)
.destination(destinationQueue)
.jmsMessageConverter(jmsMessageConverter)
.sessionTransacted(true))
.handle(messageHandler, e->e.poller(Pollers.fixedDelay(5,TimeUnit.SECONDS).taskExecutor(consumerTaskExecutor).maxMessagesPerPoll(10).transactional(transactionManager()))).get()
我也試過這個,它是真正異步的,但由於它打破了事務邊界,所以它對我的用例沒有用。
return IntegrtionFlows.from(Consumer.class, gatewayProxySpec -> gatewayProxySpec.beanName(gatewayBeanName))
.channel(Jms.channel(connectionFactory)
.destination(destinationQueue)
.jmsMessageConverter(jmsMessageConverter))
.channel(MessageChannels.executor(consumerTaskExecutor))
.handle(messageHandler)
.get()
根據您的要求,我真的會遠離MessageChannels.executor()
甚至Jms.pollableChannel()
。
只需使用Jms.channel()
並查看其concurrentConsumers()
選項:
/**
* Only applies if the {@link #containerType(Class)} is a
* {@link org.springframework.jms.listener.DefaultMessageListenerContainer}
* or a {@link org.springframework.jms.listener.SimpleMessageListenerContainer}.
* @param concurrentConsumers the concurrentConsumers.
* @return the current {@link JmsMessageChannelSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setConcurrentConsumers(int)
* @see org.springframework.jms.listener.SimpleMessageListenerContainer#setConcurrentConsumers(int)
*/
public S concurrentConsumers(int concurrentConsumers) {
默認情況下它是一個 - 正是您在當前解決方案中看到的行為所解釋的內容。
所以,只要增加並發消費者的數量,你就會看到不同的畫面!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.