我有:
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>
所以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();
}
}
我的问题:
答案 0 :(得分:5)
当客户关闭或回滚时,任何非确认消息都将被发送回队列。
如果服务器崩溃,如果该消息是非持久性的,则该消息将被重新传递,就像没有发生任何事情一样。
请注意,系统可能会在您调用ack时但在ack实际到达服务器之前崩溃。
通过更改连接工厂上的callTimeout来配置确认超时。
请注意,如果您有两个要更新的资源,并且希望保证ack和数据库插入之间的单个提交(或者您接下来要做的任何事情),那么您需要执行XA事务以保证两个分支都将被提交
崩溃后将重新发送该消息。如果您需要100%保证收据,则需要XA。