【问题标题】:JMS Difference between transacted flag and acknowledgement modeJMS事务标志和确认模式之间的区别
【发布时间】:2016-04-28 11:27:23
【问题描述】:

消息生产者组件有这个:

session = connection.createSession(false,
                    Session.CLIENT_ACKNOWLEDGE);
producer = session.createProducer(session.createQueue(queueName));

我正在使用 AWS SQS 异步发送消息

我假设消息将在队列中,直到它被明确确认。(因为客户端确认模式)

但是它被从队列中删除了。

消息消费者组件:

我编写了一个异步消费者来从队列中提取消息。 这是spring的配置文件;

<bean id="ConnectionFactoryBuilder"
    class="com.amazon.sqs.javamessaging.SQSConnectionFactory$Builder">
    <property name="regionName" value="us-east-1" />
    <property name="numberOfMessagesToPrefetch" value="1" />
    <property name="awsCredentialsProvider" ref="CredentialsProviderBean" />
</bean>

<bean id="ConnectionFactory" class="com.amazon.sqs.javamessaging.SQSConnectionFactory"
    factory-bean="ConnectionFactoryBuilder" factory-method="build" />

<bean id="Connection" class="javax.jms.Connection" factory-bean="ConnectionFactory"
    factory-method="createConnection" init-method="start" destroy-method="close" />

<bean id="QueueName" class="java.lang.String">
    <constructor-arg value="${sqs.queueName}" />
</bean>

<bean id="amazonMessageListener" class="com.myapp.AsyncMessageListener" />

<bean id="messageListener"
    class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
    <property name="delegate" ref="amazonMessageListener" />
    <property name="defaultListenerMethod" value="onMessage" />
    <property name="messageConverter">
        <null />
    </property>
</bean>

<bean id="jmsContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="ConnectionFactory" />
    <property name="destinationName" ref="QueueName" />
    <property name="messageListener" ref="messageListener" />
    <property name="sessionAcknowledgeMode" value="2"/>
</bean>

我使用属性 sessionAcknowledgeMode 为我的消费者配置了客户端确认模式。但是消息仍然被从队列中删除,而消费者没有使用 message.acknowledge() 明确确认

【问题讨论】:

    标签: java spring queue jms amazon-sqs


    【解决方案1】:

    根据AbstractMessageListenerContainer(DefaultMessageListenerContainer 的超类)文档:

    “sessionAcknowledgeMode”设置为“CLIENT_ACKNOWLEDGE”:监听执行成功后自动消息确认;在引发用户异常以及其他侦听器执行中断(例如 JVM 死亡)的情况下,尽最大努力重新交付。

    所以当使用 DefaultMessageListenerContainer 时,如果你的监听器中的 onMessage() 方法无异常返回,spring 会自动确认消息。

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 1970-01-01
      • 2011-04-07
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多