簡體   English   中英

如何使用JMS異步消費activemq消息,同時維護事務?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM