简体   繁体   中英

JMS Difference between transacted flag and acknowledgement mode

Message producer component has this :

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

I am using AWS SQS to send messages async

I was under the assumption that the message will be in the queue until it is acknowledged explicitly.(because of the client acknowledgement mode)

However it is removed off the queue.

Message consumer component:

I have written an async consumer to pull messages from the queue. Here is the spring config file;

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

i configured my consumer with client acknowledgemode using the property sessionAcknowledgeMode. But still the message is removed off the queue without the consumer explicitly acknowledging using message.acknowledge()

Per AbstractMessageListenerContainer (super class of DefaultMessageListenerContainer) doc:

"sessionAcknowledgeMode" set to "CLIENT_ACKNOWLEDGE": Automatic message acknowledgment after successful listener execution; best-effort redelivery in case of a user exception thrown as well as in case of other listener execution interruptions (such as the JVM dying).

So when using DefaultMessageListenerContainer, if onMessage() method in your listener returns without exception, spring acknowledges the message automatically.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM