posts - 88, comments - 3, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
用Spring JMS 的JmsTemplate从消息队列消费消息时发现,使用了CLIENT_ACKNOWLEDGE模式,消息返回后总是自动被ack,也就是被broker "Dequeued"

    protected Message doReceive(Session session, MessageConsumer consumer) throws JMSException {
        
try {
            
// Use transaction timeout (if available).
            long timeout = getReceiveTimeout();
            JmsResourceHolder resourceHolder 
=
                    (JmsResourceHolder) TransactionSynchronizationManager.getResource(getConnectionFactory());
            
if (resourceHolder != null && resourceHolder.hasTimeout()) {
                timeout 
= Math.min(timeout, resourceHolder.getTimeToLiveInMillis());
            }
            Message message 
= doReceive(consumer, timeout);
            
if (session.getTransacted()) {
                
// Commit necessary - but avoid commit call within a JTA transaction.
                if (isSessionLocallyTransacted(session)) {
                    
// Transacted session created by this template -> commit.
                    JmsUtils.commitIfNecessary(session);
                }
            }
            
else if (isClientAcknowledge(session)) {
                
// Manually acknowledge message, if any.
                if (message != null) {
                    message.acknowledge();
                }
            }
            
return message;
        }
        
finally {
            JmsUtils.closeMessageConsumer(consumer);
        }
    }

但是使用异步listener 就不会出现这个情况,搜了下google,发现果然存在这个问题

     https://jira.spring.io/browse/SPR-12995
     https://jira.spring.io/browse/SPR-13255
     http://louisling.iteye.com/blog/241073

同步方式拉取消息,暂时没找到好的封装,只能暂时用这。或者尽量用listener, 这个问题暂时标记下,或者谁有更好的解决方案可以comment我

只有注册用户登录后才能发表评论。


网站导航: