我有:
C1使用jmstemplate在CLIENT_ACKNOWLEDGE模式下发送消息:
<bean name="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE" />
<property name="sessionTransacted" value="true" />
</bean>
Run Code Online (Sandbox Code Playgroud)
所以C2应该手动确认消息:
@Override
@Transactional
public void onMessage(Message message)
{
try
{
messageHandlerService.handleReceivedMessage(message);
message.acknowledge();
}
catch (DeserializeXmlException e)
{
// TODO log
e.printStackTrace();
}
catch (InvalidMessageException e)
{
//TODO log
e.printStackTrace();
}
catch (JMSException e)
{
//TODO log
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
客户关闭或回滚时,任何非确认消息都将被发送回队列.
在崩溃的服务器的情况下,如果消息是非持久性的,则将重新传递该消息,就像没有发生任何事情一样.
请注意,系统可能会在您调用ack时但在ack实际到达服务器之前崩溃.
通过更改连接工厂上的callTimeout来配置ack超时.
请注意,如果您有两个要更新的资源,并且希望保证ack和数据库插入之间的单个提交(或者您接下来要做的任何事情),那么您需要执行XA事务以保证两个分支都将被提交.
崩溃后将重新发送该消息.如果您需要100%保证收据,则需要XA.
| 归档时间: |
|
| 查看次数: |
1694 次 |
| 最近记录: |