JmsTemplate CLIENT_ACKNOWLEDGE 模式下receive消息的问题

用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我

你可能感兴趣的:(JmsTemplate CLIENT_ACKNOWLEDGE 模式下receive消息的问题)