消息生产者组件具有以下内容:
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()
明确确认答案 0 :(得分:0)
Per AbstractMessageListenerContainer(DefaultMessageListenerContainer的超类)doc:
&#34; SessionAcknowledgeMode来&#34;设置为&#34; CLIENT_ACKNOWLEDGE&#34;:成功侦听器执行后自动确认消息;在抛出用户异常的情况下以及在其他侦听器执行中断(例如JVM死亡)的情况下尽力重新进行重新传递。
因此,当使用DefaultMessageListenerContainer时,如果侦听器中的onMessage()方法无异常返回,则spring会自动确认该消息。