当前位置: 首页 > news >正文

RabbitMQ入门-路由-有选择的接受消息

比如一个日志系统,之前的处理方式呢,是各种类型(info,error,warning)的消息都发给订阅者,可是实际情况上不一定都需要。可能A需要error,其他的都不需要。那么就引入了今天的处理方式--路由(直接交换)

(兔子的官网真心良心,图文并茂,通俗易懂)这种处理方式你只需记住一个字:有选择的接受消息

 首先,我们将消息绑定在不同的路由键上,然后消费者根据需要绑定对应的路由键即可收到消息。路由键随便取名字

生产者代码:

package com.example.demo;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 有选择的接受消息
 */
public class RoutingSend {

    private static final String EXCHANGE_NAME = "logs";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();    // 连接工厂
        factory.setHost("localhost");
        Connection connection = factory.newConnection();        // 获取连接
        Channel channel = connection.createChannel();

        // 当我们发送时,需要一个路由密钥,这里选择直接交换
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");

        String[] msg = {"错误","信息","警告"};
        // 第二个参数为路由密钥
        channel.basicPublish(EXCHANGE_NAME, "error", null, msg[0].getBytes());
        channel.basicPublish(EXCHANGE_NAME, "info", null, msg[1].getBytes());
        channel.basicPublish(EXCHANGE_NAME, "warning", null, msg[2].getBytes());
        System.out.println("PS-Send:" + msg.toString());

        channel.close();
        connection.close();

    }
}

 

消费者代码:

package com.example.demo;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class RoutingReceive {

    private static final String EXCHANGE_NAME = "logs";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();    // 连接工厂
        factory.setHost("localhost");
        Connection connection = factory.newConnection();        // 获取连接
        Channel channel = connection.createChannel();

        // 声明一个direct交换类型
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");

        // 当声明队列,不加任何参数,产生的将是一个临时队列,getQueue返回的是队列名称
        String queueA = channel.queueDeclare().getQueue();
        String queueB = channel.queueDeclare().getQueue();
        System.out.println("临时队列:" + queueA);
        System.out.println("临时队列:" + queueB);

        // 第三个参数为“绑定建”
        channel.queueBind(queueA, EXCHANGE_NAME, "error");
        channel.queueBind(queueB, EXCHANGE_NAME, "info");
        channel.queueBind(queueB, EXCHANGE_NAME, "warning");

        Consumer consumerA = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String recv = new String(body, "UTF-8");
                System.out.println("Direct-Receive-A:" + recv);
            }
        };
        Consumer consumerB = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String recv = new String(body, "UTF-8");
                System.out.println("Direct-Receive-B:" + recv);
            }
        };
        channel.basicConsume(queueA, true, consumerA);
        channel.basicConsume(queueB, true, consumerB);
    }
}

 

 

先启动消费者:再启动生产者,查看控制台:

..

 

转载于:https://www.cnblogs.com/LUA123/p/8477189.html

相关文章:

  • 报告称国产智能手机全球市场份额33.1% 超过韩国
  • iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge
  • 深入理解java虚拟机 精华总结(面试)
  • Spring框架
  • DTS-071007 表结构在源库和目标库中不一致
  • 算法学习之路|聪明的打字员
  • [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第二章~第七章
  • MongoDB入门(二)——MongoDB下载与安装
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • centos7设置静态IP
  • 64位x86的函数调用栈布局
  • 纯文本配置还是注册表
  • “你的优势是什么?
  • 记录项目代码迁移后,UI测试框架的搭建(配置文件的修改、测试脚本试运行)...
  • QComboBox 树形视图选择
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • extract-text-webpack-plugin用法
  • Js基础知识(四) - js运行原理与机制
  • laravel 用artisan创建自己的模板
  • Linux快速复制或删除大量小文件
  • Redash本地开发环境搭建
  • Web标准制定过程
  • 百度小程序遇到的问题
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 高性能JavaScript阅读简记(三)
  • 精彩代码 vue.js
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 三栏布局总结
  • 双管齐下,VMware的容器新战略
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • gunicorn工作原理
  • Linux权限管理(week1_day5)--技术流ken
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #100天计划# 2013年9月29日
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (JS基础)String 类型
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .Family_物联网
  • .Net 6.0 处理跨域的方式
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET/C# 使窗口永不获得焦点
  • .Net程序帮助文档制作
  • .NET程序员迈向卓越的必由之路