基于ActiveMQ的请求-应答模式
时间:2022-07-24
本文章向大家介绍基于ActiveMQ的请求-应答模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
基于ActiveMQ的请求-应答模式
一. 使用场景
基于ActiveMQ的请求-应答模式,相当于通过消息队列,请求端注册了一个异步回调,在发送消息时指定回调消息的目的地和关联的id,这样应答端在收到请求消息时,可以在处理后,将处理结果的应答消息发送到回调的目的地中。
二. 代码实例
首先是请求和响应的消息定义:
/**
* @Auther: ZhangShenao
* @Date: 2019/2/12 18:40
* @Description:请求消息
*/
@Getter
@Setter
@ToString
public class RequestDto {
//业务id
private String uid;
//业务数据
private String payload;
}
/**
* @Auther: ZhangShenao
* @Date: 2019/2/12 18:33
* @Description:响应消息
*/
@Getter
@Setter
@ToString
public class ResponseDto {
//业务id
private String uid;
//处理结果
private boolean success;
}
请求端:
/**
* @Auther: ZhangShenao
* @Date: 2019/2/12 18:09
* @Description:Request-Response模式的请求端
*/
@Service
public class Producer {
//保存所有请求的业务id和响应结果
private static final Map<String, Boolean> replies = new ConcurrentHashMap<>();
@Autowired
@Qualifier(Constants.JMS_QUEUE_TEMPLATE)
private JmsTemplate queueTemplat;
public void sendMessage(RequestDto dto) {
queueTemplat.send(Constants.QueueNames.REQUEST_QUEUE, session -> {
TextMessage message = session.createTextMessage(dto.getPayload());
//设置消息关联id,将请求和应答消息关联起来
message.setJMSCorrelationID(dto.getUid());
//设置消息回复的目的地
message.setJMSReplyTo(new ActiveMQQueue(Constants.QueueNames.RESPONSE_QUEUE));
//记录发送的请求
replies.putIfAbsent(dto.getUid(), false);
return message;
});
}
@JmsListener(destination = Constants.QueueNames.RESPONSE_QUEUE, containerFactory = Constants.QUEUE_LISTENER_CONTAINER_FACTORY)
public void onReply(ResponseDto dto) {
replies.put(dto.getUid(), dto.isSuccess());
System.err.println("On Reply: " + dto);
}
}
响应端:
/**
* @Auther: ZhangShenao
* @Date: 2019/2/12 18:42
* @Description:Request-Response模式的响应端
*/
@Service
public class Consumer {
@Autowired
@Qualifier(Constants.JMS_QUEUE_TEMPLATE)
private JmsTemplate queueTemplat;
@JmsListener(destination = Constants.QueueNames.REQUEST_QUEUE, containerFactory = Constants.QUEUE_LISTENER_CONTAINER_FACTORY)
public void onRequest(TextMessage message) throws JMSException {
//获取消息回复目的地和关联id,向回复目的地发送回复消息
Destination replyTo = message.getJMSReplyTo();
ResponseDto response = new ResponseDto();
response.setUid(message.getJMSCorrelationID());
response.setSuccess(true);
queueTemplat.convertAndSend(replyTo,response);
}
}
- [接口测试 - 基础篇] 06 好吧也来解析下html
- [接口测试 - 基础篇] 05 好讨厌的xml解析
- 【专知-关关的刷题日记17】Leetcode 268. Missing Number
- 【专知-关关的刷题日记18】Leetcode 35. Search Insert Position
- [接口测试 - http.client篇] 15 常用API说明及基本的示例
- [接口测试 - http.client篇] 14 源码初探及其工作机制分析
- 【专知-关关的刷题日记19】Leetcode 118. Pascal's Triangle
- 每周学点大数据 | No.3算法设计与分析理论
- HDU 1874 畅通工程续【Floyd算法实现】
- 接口测试 | 21 基于flask弄个restful API服务出来
- 数论部分第二节:埃拉托斯特尼筛法 埃拉托斯特尼筛法
- [接口测试 -基础篇] 20 用flask写一个简单server用于接口测试
- 接口测试 | urllib篇 19 urllib基本示例
- 接口测试 | urllib篇 18 urllib介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 「干货」你需要了解的六种渲染模式
- 分享两个操作Java枚举的实用方法
- 从零开始强化学习:在Python笔记本中设计和解决一个任务
- 基于深度学习的新闻推荐算法(1)
- 以复现图表的方式来学习一篇文章
- 盘点 Python 10 大常用数据结构(上篇)
- (长文预警) 你还在烦工作中碰到的拖拽问题?一个框架jiejue
- 重磅 | 青藤与腾讯安全隆重举办容器安全平台新品战略合作发布会
- 如何使用强化学习玩21点?
- 这3个Scikit-learn的特征选择技术,能够有效的提高你的数据预处理能力
- 使用神经网络解决拼图游戏
- 用机器学习预测收益
- 一种基于深度学习的低成本细胞生物学研究方法
- 从零搭建Spring Boot脚手架(2):增加通用的功能
- Qt官方示例-K线图