使用RabbitMQ进行消息发布和订阅,生产者将消息发送给转发器(exchange),转发器根据路由键匹配已绑定的消息队列并转发消息,主题模式支持路由键的通配。

生产者代码:

 package org.study.exchange3.topic3;

 import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import org.junit.Test;
import org.study.utils.ConnectionUtils; import java.io.IOException;
import java.util.concurrent.TimeoutException; /**
* topic-主题模式(分发订阅)
* exchange只转发消息,但是没有存储能力,只有队列才有存储能力
* 主题模式支持路由键的通配符
* “#”表示0个或若干个关键字,“*”表示一个关键字。
*/
public class Sender {
public static final String QUEUE_NAME = "test_topic_queue";
public static final String EXCHANGE_NAME = "topic_exchange"; @Test
public void send() throws IOException, TimeoutException, InterruptedException {
// 获取连接
Connection conn = ConnectionUtils.getConnection();
// 获取通道
Channel channel = conn.createChannel();
// //创建队列
// channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//声明转发器
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
//每个消费者发送确认消息前,只发送一条消息
channel.basicQos(1); String msg = "hello rabbitmq topic !";
//发送消息至转发器,指定路由键
channel.basicPublish(EXCHANGE_NAME, "key.key", null, msg.getBytes());
System.out.println("[send] msg " + msg); channel.close();
conn.close();
}
}

消费者代码:

 package org.study.exchange3.topic3;

 import com.rabbitmq.client.*;
import org.junit.Test;
import org.study.utils.ConnectionUtils; import java.io.IOException;
import java.util.concurrent.TimeoutException; /**
* 主题模式-接收消息
*/
public class Recv {
public static final String QUEUE_NAME = "test_topic_queue";
public static final String EXCHANGE_NAME = "topic_exchange"; @Test
public void recv() throws IOException, TimeoutException, InterruptedException {
Connection conn = ConnectionUtils.getConnection();
Channel channel = conn.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);
/*
* 队列绑定转发器,路由键通配符#和*
* #:表示0个或多个字符
* *:表示一个字符
* */
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "key.#"); //定义消费者
DefaultConsumer consumer = new DefaultConsumer(channel) {
//重写获取到达消息
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg = new String(body, "utf-8");
System.out.println("[1] recv: " + msg); try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("[1] done!");
// 回执
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
}; while (true) {
//监听队列
channel.basicConsume(QUEUE_NAME, false, consumer);
Thread.sleep(1000);
} }
}

Java使用RabbitMQ之订阅分发(Topic)的更多相关文章

  1. Java使用RabbitMQ之公平分发

    发送消息: package org.study.workfair; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Con ...

  2. (八)RabbitMQ消息队列-通过Topic主题模式分发消息

    原文:(八)RabbitMQ消息队列-通过Topic主题模式分发消息 前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过 ...

  3. 查询订阅某topic的所有consumer group(Java API)

    在网上碰到的问题,想了下使用现有的API还是可以实现的. 首先,需要引入Kafka服务器端代码,比如加入Kafka 1.0.0依赖: Maven <dependency> <grou ...

  4. RabbitMQ 发布订阅持久化

    RabbitMQ是一种重要的消息队列中间件,在生产环境中,稳定是第一考虑.RabbitMQ厂家也深知开发者的声音,稳定.可靠是第一考虑,为了消息传输的可靠性传输,RabbitMQ提供了多种途径的消息持 ...

  5. RabbitMQ学习(二):Java使用RabbitMQ要点知识

    转  https://blog.csdn.net/leixiaotao_java/article/details/78924863 1.maven依赖 <dependency> <g ...

  6. RabbitMQ学习第一记:用java连接RabbitMQ

    1.什么是RabbitMQ MQ(Message Queue):消息队列,是服务端设计的一个可以存储大量消息的队列,并提供客户端操作队列的方法:生产队列(向队列中添加数据).消费队列(从队列中取数据) ...

  7. RabbitMQ 发布订阅

    互联网公司对消息队列是深度使用者,因此需要我们了解消息队列的方方面面,良好的设计及深入的理解,更有利于我们对消息队列的规划. 当前我们使用消息队列中发现一些问题: 1.实际上是异步无返回远程调用,由发 ...

  8. Kafka获取订阅某topic的所有consumer group【客户端版】

    之前写过如何用服务器端的API代码来获取订阅某topic的所有consumer group,参见这里.使用服务器端的API需要用到kafka.admin.AdminClient类,但是这个类在0.11 ...

  9. RabbitMQ (五) 订阅者模式之分发模式 ( fanout )

    前面讲到了简单队列和工作队列. 这两种队列有个非常明显的缺点 : 生产者发送的消息,只能进入到一个队列. 消息只能进入到一个队列就意味着消息只能被一个消费者消费. 尽管工作队列模式中,一个队列中的消息 ...

随机推荐

  1. 仿照wtform自定义Form组件

    仿照wtforms自定义Form组件 1.wtforms 点击查看源码分析及使用方法 2.自定义Form组件 #!usr/bin/env python # -*- coding:utf-8 -*- f ...

  2. ogg BR – BOUNDED RECOVERY 测试案例

    首先,我们来看两个OGG同步中可能的问题: l oracle在线日志包含已提交的和未提交的事务,但OGG只会将已提交的事务写入到队列文件.因此,针对未提交的事务,特别是未提交的长事务,OGG会怎样处理 ...

  3. Node.js读取文件内容并返回值(非异步)

    主要解决的问题的,以最近VsCode插件开发为例,每次请求都需要token,而vscode并不支持cookie这样的存储,所以就采用粗暴点办法,存到某个用户目录下并读取. 源码如下: var fs=r ...

  4. 阿里云轻量应用服务器debian8.9用apache多端口搭建多站点

    前几天想要再搭个网站玩玩,就用阿里的服务器,apache本地搭建站点和服务器相差不多,然而却踩了大坑,差点耗死在这儿. 先进入apache这个目录,有如下文件夹: 打开ports.conf,  添加 ...

  5. 深入理解mongodb查询条件语句

    阅读目录 1. 理解:"$lt"."$lte"."$gt" 和 "$gte" 2. 理解 '$ne' 3. 理解 &qu ...

  6. Echo团队Alpha冲刺随笔 - 第五天

    项目冲刺情况 进展 前端:布局,内容等方面基本完成. 后端:基本功能基本实现. 计划:准备进行前后端对接,进行测试 问题 有部分代码冗余,需要着手修改 心得 团队分工明确,互相协作,开发进度比预想的要 ...

  7. 关于 js tofixed()保留小数位数问题

    保留位数必须是数字 const num = parseFloat ('123456.33').tofixed(2); !!!! 注意 现在的的 num 是 字符串类型, 如果给它加数字的话,就会报错 ...

  8. CF1103D Professional layer 状压DP

    传送门 首先对于所有数求gcd并求出这个gcd含有的质因子,那么在所有数中,只有这一些质因子会对答案产生影响,而且对于所有的数,每一个质因子只会在一个数中被删去. 质因子数量不会超过\(11\),所以 ...

  9. asp.net调用前台js调用后台代码分享

    asp.net调用前台js调用后台代码分享 C#前台js调用后台代码前台js<script type="text/javascript" language="jav ...

  10. Leetcode 2. Add Two Numbers(medium)

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...