gpt4 book ai didi

java - 如果未完成客户确认会怎样?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:50:53 24 4
gpt4 key购买 nike

我有:

  • hornetq-2.2.14-final 独立服务器
  • 将消息发送到队列 A 的客户端应用程序 C1
  • 客户端应用程序 C2 使用队列 A 中的消息

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();
}
}

我的问题:

  • 当客户端 C2 收到该消息但在确认之前崩溃时,消息会发生什么情况?
  • 有超时机制吗?如果是,确认的默认超时是多少?我该如何修改它?

最佳答案

任何未确认的消息都将在客户关闭或回滚时发送回队列。

在服务器崩溃的情况下,如果消息不是持久的,则将重新传递,就好像什么都没发生一样。

请注意,系统可能会在您调用 ack 时但在 ack 实际到达服务器之前崩溃。

通过更改连接工厂上的 callTimeout 来配置确认超时。

请注意,如果您有两个资源要更新,并且希望保证在 ack 和您的数据库插入之间进行一次提交(或者您接下来要做的任何事情),那么您需要执行 XA 事务以保证两个分支都将被提交.

消息将在崩溃后重新发送。如果您需要 100% 保证该收据,则需要 XA。

关于java - 如果未完成客户确认会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15243991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com