前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于ActiveMQ的请求-应答模式

基于ActiveMQ的请求-应答模式

作者头像
张申傲
发布2020-09-03 15:31:40
5680
发布2020-09-03 15:31:40
举报
文章被收录于专栏:漫漫架构路

基于ActiveMQ的请求-应答模式

一. 使用场景

基于ActiveMQ的请求-应答模式,相当于通过消息队列,请求端注册了一个异步回调,在发送消息时指定回调消息的目的地和关联的id,这样应答端在收到请求消息时,可以在处理后,将处理结果的应答消息发送到回调的目的地中。

二. 代码实例

首先是请求和响应的消息定义:

代码语言:javascript
复制
/**
 * @Auther: ZhangShenao
 * @Date: 2019/2/12 18:40
 * @Description:请求消息
 */
@Getter
@Setter
@ToString
public class RequestDto {
    //业务id
    private String uid;

    //业务数据
    private String payload;
}
代码语言:javascript
复制
/**
 * @Auther: ZhangShenao
 * @Date: 2019/2/12 18:33
 * @Description:响应消息
 */
@Getter
@Setter
@ToString
public class ResponseDto {
    //业务id
    private String uid;

    //处理结果
    private boolean success;
}

请求端:

代码语言:javascript
复制
/**
 * @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);
    }
}

响应端:

代码语言:javascript
复制
/**
 * @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);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/02/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于ActiveMQ的请求-应答模式
    • 一. 使用场景
      • 二. 代码实例
      相关产品与服务
      消息队列
      腾讯云消息队列 TDMQ 是分布式架构中的重要组件,提供异步通信的基础能力,通过应用解耦降低系统复杂度,提升系统可用性和可扩展性。TDMQ 产品系列提供丰富的产品形态,包含 CKafka、RocketMQ、RabbitMQ、Pulsar、CMQ 五大产品,覆盖在线和离线场景,满足金融、互联网、教育、物流、能源等不同行业和场景的需求。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档