简单activemq 应答模式

2024-04-27 11:58
文章标签 简单 模式 activemq 应答

本文主要是介绍简单activemq 应答模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、序言JMS 用于系统解耦有一定帮助,像我们 iteye 的一些系统消息,可能非重要要消息,就没那么严格的限制,统一异步发送就行了,反正上线你就能看到。有些情况下我们需要消息两端进行确认,比如一些比较重要的金额之类的信息。二、实例场景我们ERP系统中的财务模块是分开的,当成一个单独的财务系统,那么从ERP那么那送的财务信息,或者财务系统接收了,需要给ERP 那边一个确认信息,不然消息没处理成功或者其他异常,导致金额数据出问题,这个麻烦比较大的。三、JMS 场景对应场景一:1.Producer  -----> 发送消息到broker2.Customer------> 从broker 收到消息3.Customer------> 向broker 确认消息收到对于场景一,可能没有完全满足我么你的实例场景,但是可以通过broker 获得,也算是一种异步通知,下面来看看对应的伪代码:场景1.1 :开启事务的情况,是根据session 的commit 和 rollback 进行处理确认消息Java代码  收藏代码
// 这是我们消息生产者伪代码,初始化过程这里暂时不贴了,参考前面的  
// true : 表示开启事务,开启事务,必须的commit  
Session session =  InitJms.connection.createSession(true,Session.AUTO_ACKNOWLEDGE);  // 创建一个文本消息  TextMessage message =  session.createTextMessage("测试消息");  // 创建发送消息目的地  Destination send_destination = session.createQueue("order_queue");  // 生产者  MessageProducer producer = session.createProducer(send_destination);  // 发送  producer.send(message);  // 这里必须提交,因为开启了事务,不然broker 里面是看不到消息的  session.commit();  Java代码  收藏代码
// 这是消费者代码,同样用true  Session session =  InitJms.connection.createSession(true,Session.CLIENT_ACKNOWLEDGE);  // 指定接收消息的地方  Destination destination = session.createQueue("order_queue");  // 创建消费者  MessageConsumer consumer = session.createConsumer(destination);  try {  // 接收消息  TextMessage message = (TextMessage)consumer.receive(1000);  System.out.println(message.getText());    // 收到消息之后进行确认      session.commit();  }finally {  session.close();  InitJms.connection.close();  }  注意,上面由于没用messageListener 而且关闭了连接,因此控制台看不到消费者存在了:场景1.2 我们自动响应服务器 和 非事务,客户端响应服务器的情况Java代码  收藏代码// 消费端 在这里默认 采用AUTO 就会自动响应了  
Session session =  InitJms.connection.createSession(false,Session.AUTO_ACKNOWLEDGE);  // 同理,如果设置   
InitJms.connection.createSession(false,Session.CLIENT_ACKNOWLEDGE);  
// 就需要手动响应  
message.acknowledge();  注意:如果没有按要求响应broker,消费端还是能拿到消息的,而且能重复拿到,5.11的版本可以拿到7次,可以通过下面的检查一些信息:Java代码  收藏代码
// 是否收到过消息,第一次fasle,第二次开始就是true  
message.getJMSRedelivered();  
// 消息发送时间:毫秒  
message.getJMSTimestamp();  
// 从broker 重复获取消息的次数,5.11最多6次。  
// 参考 RedeliveryPolicy  DEFAULT_MAXIMUM_REDELIVERIES 可以更改  
message.getStringProperty("JMSXDeliveryCount")  
// 消息存活时间:0 一直存在  
message.getJMSExpiration();  当然还有很多,可以参考官方文档:  
http://activemq.apache.org/activemq-message-properties.html  
以及  
http://activemq.apache.org/features.html  四、双向应答的场景:双向应答可以这样描述1.producer-->发送消息到broker, 然后等待确认消息2.customer-->从broker 获得消息,然后发送确认消息--->broker3.producer --> 从broker 获得确认消息举个栗子:张三写封信送到邮局中转站,然后李四从中转站获得信,然后在写一份回执信,放到中转站,然后张三去取,当然张三写信的时候就得写明回信地址,看代码Java代码  收藏代码
// 承接刚才的代码,发送消息的时候,需要填写一个回执的地址  Destination recall_destination = session.createQueue("recall_queue");  // 将回执地址写在消息里面,方便李四知道  message.setJMSReplyTo(recall_destination);  producer.send(message);   // 发送之后,某个地方这里变成消息消费者,等待那边给我发送确认消息  MessageConsumer replyConsumer =session.createConsumer(recall_destination);  // 这里我们用个消息监听  replyConsumer.setMessageListener(new MessageListener() {  @Override  public void onMessage(Message message) {  TextMessage textMessage = (TextMessage) message;  try {  System.out.println(textMessage.getText());  } catch (JMSException e) {  e.printStackTrace();  }  }  });  消费者:Java代码  收藏代码
// 获得回执地址  Destination recall_destination = message.getJMSReplyTo();  // 创建回执消息  TextMessage textMessage = session.createTextMessage("张三,我已经收到消息了");  // 以上收到消息之后,从新创建生产者,然后在回执过去  MessageProducer producer = session.createProducer(recall_destination);  producer.send(textMessage);  OK,这样就能相互通信了,你可以理解为通过两个通道进行的。注意:这种方式毕竟会慢一些了,除非有及时性的,需要两端处理另外的事情,才这么多,因为涉及2步,都会有类似于“拜占庭将军问题”,因此解决还需要 持久化、多点部署,反而麻烦,按前面的场景还好。小结:1.这里大概介绍了activemq 的一些应答的及时,关于有些属性可以参考文档,具体问题具体分析~。~脱离场景谈性能都是耍流氓,这里也不会介绍性能问题,有测试的朋友可以告知一声。2.如果有问题的,请大家指出,非常感谢。

 

这篇关于简单activemq 应答模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940449

相关文章

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要