使用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. (二 -3-3) 天猫精灵接入Home Assistant-自动发现Mqtt设备-自动生成配置信息

    http://www.hassmart.com/products/switches/#tab=config switch: - platform: mqtt name: keting state_to ...

  2. docker 6 docker运行的底层原理

    docker是一个client-server结构的系统,docker守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器,是一个运行时的环境,就 ...

  3. 使用BBED跳过归档进行恢复

    https: 使用BBED跳过归档进行恢复 数据库启动异常,提示6号文件丢失 SQL> startup ORACLE instance started. Total System Global ...

  4. Sphinx 生成 Windows 帮助文件 (.chm文件)

    本文不介绍 Sphinx 的用法,只简要罗列 Windows 下生成 .chm 文件的步骤. 0. 首先检查机器是否安装了 HTML Help Workshop 软件,一般安装路径应该是 C:\Pro ...

  5. 接口测试,获取登录后的cookies

    参见: http://www.cnblogs.com/testwang/p/6023394.html

  6. Tomcat的九个内置对象

    在之前学习过程中使用的对象大部分都是我们自己使用new关键字或者反射创建的,现在容器中会自动创建对象,我们只要直接使用即可,不需要我们再去创建这些对象,在Tomcat容器中提供了九种内置对象,有一些不 ...

  7. 洛谷 P1451 求细胞数量

    题目链接 https://www.luogu.org/problemnew/show/P1451 题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字 ...

  8. a2dp播放流程源码分析

    之前分析了a2dp profile 的初始化的流程,这篇文章分析一下,音频流在bluedroid中的处理流程. 上层的音频接口是调用a2dp hal 里面的接口来进行命令以及数据的发送的. 关于控制通 ...

  9. 【原创】一个线程oom,进程里其他线程还能运行吗?

    引言 这题是一个网友@大脸猫爱吃鱼给我的提问,出自今年校招美团三面的一个真题.大致如下 一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么? 先说一下答案,答案是还能运行 不瞒大家说, ...

  10. 面试(一)-HashMap

    一.前言       其实这一面来的挺突然,也是意想不到的,这个要起源于BOSS直聘,很巧,其实也算是一种缘分吧,谢谢BOSS那个哥们,还是那句话来滨江我请你吃饭,身怀感激你总会遇到帮助你的人,只是这 ...