当前位置: 首页 > 知识库问答 >
问题:

如果客户确认未完成,会发生什么?

杜阳炎
2023-03-14

我有:

  • hornetq-2.2.14-final独立服务器

C1使用jmstemboard在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>

因此指挥与控制应手动确认消息:

@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收到该消息但在确认之前崩溃时,消息会发生什么?
  • 是否有超时机制?如果是,确认的默认超时是什么?我如何修改它?

共有1个答案

宋华美
2023-03-14

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

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

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

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

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

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

 类似资料:
  • 如果在ActiveMQ中创建了一个队列,该队列具有一个生产者(即客户端确认模式)和一个侦听器,在成功处理消息后,其onMessage方法中仅对其进行确认。假设存在异常,并且消息未被确认,因此仍在队列中。是否会再次发送给消费者?或者这些信息会发生什么?

  • 问题内容: 假设我创建了一个对象,该对象具有ID,firstName,lastName和email,用于实例变量和相应的setter / getter方法。如何,如果我不重写计算中时,它存储在集合对象的对象? 问题答案: 如果不重写hashcode(),则集合将使用Object类中的默认实现。即使根据equals()方法它们相等,此实现也会为不同的对象提供不同的值。 一些集合(例如HashSet,

  • 首先登录小米账号,进入【管理平台】,未认证的用户会进入【认证页面】。 认证时需要填写企业与联系人信息: 企业名称 工商营业执照注册号 企业工商营业执照 手机号 email 法人姓名 法人身份证号 法人身份证正反面照片 并且同意协议后,可提交认证申请。 提交认证申请后,会有专人审核,审核通过后就成为认证企业。审核不通过,可以再次提交审核。

  • 问题内容: 用户单击执行某些Ajax请求的链接-假设此请求需要20秒钟。 在请求完成之前,用户单击oder链接,该链接会将整个页面重定向(无ajax)到另一个页面。 ajax请求会发生什么?它总是在服务器端完成,但是响应不会在任何地方出现?还是服务器端的ajax请求将立即被“杀死? 我问是因为我有一些脚本需要花费一些时间才能运行,但是用户现在不必知道结果-只是一发不可收拾-也许ajax中甚至有一些

  • 我是RxJava的新手,我知道flatmaps用于将发出的项映射到可观察项。我还知道,基于文档,发出的可观测数据都被合并(扁平化)为一个单一的可观测数据流。 我在想,如果这些内在的可观察到的东西都完成了,会发生什么? 例如:我有一个可观察的,它发出一个项数据键。我必须进行另一个异步http调用才能从服务器获取项数据,所以我使用另一个Observable调用它。我使用一个平面地图来连接这两个,并创建

  • 编辑问题,以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。这将帮助其他人回答这个问题。 我们知道:load with memory_order_acquire,store with memory_order_release但是,我发现用gcc4.8.2,open -O2时,抛出了一个编译错误,/usr/include/c/4 . 8 . 2/atomic:199:9:error:对于