RabbitMQ 交换器、持久化
一、 交换器
RabbitMQ交换器(Exchange)分为四种
- direct
- fanout
- topic
- headers
- direct
默认的交换器类型,消息的RoutingKey与队列的bindingKey匹配,消息就投递到相应的队列
- fanout
一种发布/订阅模式的交换器,发布一条消息时,fanout把消息广播附加到fanout交换器的队列上
接收类(订阅):
import com.rabbitmq.client.*; import java.io.IOException; public class ReceiveLogs {
private static final String EXCHANGE_NAME = "logs"; public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel(); channel.exchangeDeclare(EXCHANGE_NAME, "fanout");//一旦创建exchange,RabbitMQ不允许对其改变,否则报错
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, EXCHANGE_NAME, "");//绑定是交换器与队列之间的关系,可以理解为,队列对此交换器的消息感兴趣 System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
}
};
channel.basicConsume(queueName, true, consumer);
}
}
发布类:
import java.io.IOException;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel; public class ReceiveLog { private static final String EXCHANGE_NAME = "log"; public static void main(String[] argv)
throws java.io.IOException { ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout"); String message = "hi"; channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'"); channel.close();
connection.close();
}
}
- topic
topic类似于fanout交换器,但更加具体化,用routingKey进行规则匹配,更灵活的匹配出用户想要接收的消息
routingKey形如:com.company.module.demo,具体匹配规则:
"*"与"#"可以匹配任意字符,区别是"*"只能匹配由"."分割的一段字符,而"#"可以匹配所有字符
发布一条"com.abc.test.push"的消息,能匹配的routingKey:
com.abc.test.*
#.test.push
#
不能匹配的:
com.abc.*
*.test.push
*
发布类:
声明队列时,需要注意队列的属性,虽然队列的声明由消费者或生产者完成都可以,但如果由消费者声明,由于生产者生产消息时,可能队列还没有声明,会造成消息丢失,所以推荐由生产者声明队列
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import java.io.IOException; public class RabbitMqSendTest {
private static String queue = "test_queue";
private static String exchange = "TestExchange";
private static String routingKey = "abc.test";
public static void main(String[] args) {
ConnectionFactory factory = new com.rabbitmq.client.ConnectionFactory();
factory.setHost("172.16.67.60");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin");
Connection mqConnection = null;
try {
mqConnection = factory.newConnection();
Channel mqChannel = mqConnection.createChannel();
if (null != mqChannel && mqChannel.isOpen()) {
mqChannel.exchangeDeclare(exchange, "topic");
// String queueName = mqChannel.queueDeclare().getQueue();
// mqChannel.queueBind(queueName, exchange, routingKey);
//声明队列名称与属性
//durable持久队列,mq重启队列可恢复 exclusive独占队列,仅限于声明它的连接使用操作
//autoDelete 自动删除 arguments 其他属性
mqChannel.queueDeclare(queue, false, false, false, null);
mqChannel.queueBind(queue, exchange, routingKey); //*******************************************
mqChannel.basicPublish(exchange, routingKey, null,
("hello").getBytes());
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
mqConnection.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
}
接收类
import com.rabbitmq.client.*;
import java.io.IOException; public class ReceiveTopic {
private static String queue = "consume_queue";
private static String exchange = "TestExchange";
private static String routingKey = "*.test"; public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("172.16.67.60");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin"); Connection connection = factory.newConnection();
Channel channel = connection.createChannel(); // channel声明Exchange,名称与类型
channel.exchangeDeclare(exchange, "topic");
// String queuename = channel.queueDeclare().getQueue(); channel.queueDeclare(queue, false, false, false, null);
channel.queueBind(queue, exchange, "*.test"); //消费者指定消息队列,并选择特定的RoutingKey
System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); Consumer client = new DefaultConsumer(channel) {
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body)throws IOException {
String msgString = new String(body, "UTF-8");
System.out.println(" [x] Received '" + envelope.getRoutingKey() + "':'" + msgString + "'");
}
};
channel.basicConsume(queue, true,client);
System.out.println();
}
}
二、持久化
RabbitMQ默认情况下重启消息服务器时,会丢失消息,为了尽量保证消息在服务器宕机时不丢失,就需要把消息持久化,但是也只是尽量不丢失,由于涉及磁盘写入,当消息量巨大时,mq性能也会被严重拉低。
RabbitMQ 交换器、持久化的更多相关文章
- RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
- RabbitMQ交换器Exchange介绍与实践
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
- rabbitmq 消息持久化
rabbitmq 消息持久化 2016-02-18 11:19 224人阅读 评论(0) 收藏 举报 分类: 综合(15) 版权声明:本文为博主原创文章,未经博主允许不得转载. 二: 任务分发 & ...
- Python RabbitMQ消息持久化
RabbitMQ消息持久化:就是将队列中的消息永久的存放在队列中. 处理方案: # 在实例化时加入durable=True来确认消息的实例化,客户端服务端都要写 channel.queue_dec ...
- RabbitMQ的持久化机制
一.问题的引出 RabbitMQ的一大特色是消息的可靠性,那么它是如何保证消息可靠性的呢?——消息持久化.为了保证RabbitMQ在退出,服务重启或者crash等异常情况下,也不会丢失消息,我们可以将 ...
- RabbitMQ的持久化(六)
RabbitMQ的持久化主要体现在三个方面,即交换机持久化,队列持久化及消息持久化 注意,因公司使用php-amqplib来实现RabbitMQ,故之后举例说明的代码均使用的php-amqplib,而 ...
- RabbitMQ的持久化
RabbitMQ的持久化主要体现在三个方面,即交换机持久化,队列持久化及消息持久化 注意,因公司使用php-amqplib来实现RabbitMQ,故之后举例说明的代码均使用的php-amqplib ...
- (3)RabbitMQ交换器(Exchange)
1.前言 上个章节也有简单介绍过RabbitMQ交换器,这里主要了解下它的类型和如何使用.交换器有四种类型,分别是direct.fanout.topic.headers. 2.Virtual host ...
- Rabbitmq交换器Exchange和消息队列
通常我们谈到队列服务, 会有三个概念: 发消息者.队列.收消息者,RabbitMQ 在这个基本概念之上, 多做了一层抽象, 在发消息者和 队列之间, 加入了交换器 (Exchange). 这样发消息者 ...
随机推荐
- POI教程
很多时候,一个软件应用程序需要生成Microsoft Excel文件格式的报告.有时,一个应用程序甚至希望将Excel文件作为输入数据.例如,一个公司开发的应用程序将财务部门需要所有输出生成自己的Ex ...
- tushare下载安装教程与版本更新步骤
使用前提 安装Python 安装pandas:pip install pandas 安装lxml:pip install lxml 下载安装 方式1:pip install tushare,如果安装网 ...
- python图像特征提取
这里使用的是python 3.5 .opencv_python-3.4.0+contrib,特征提取的代码如下: import cv2 img = cv2.imread("feature.j ...
- php调用系统命令的函数的比较
了解命令的区别并进行直观的选择 这是一篇翻译文章,原作者通过表格的形式更加直观的展现出差异并进行选择 前言 PHP有众多调用系统命令的函数,大致如下: system() exec() passthru ...
- 【学术篇】The Xuanku Inversion Magic学习笔记
退役之前写的 然后因为退役就咕咕咕了... 后来发现数学考试能用的到个鬼就发布出来了QwQ 主要是方便自己没登录的时候查阅... 显然子集什么的是没有学会的QwQ 所以学OI的话不要看本文!!!!!& ...
- anyka安凯微电子
http://www.anyka.com/ 幼教机
- 笔记61 Spring Boot快速入门(一)
IDEA+Spring Boot快速搭建 一.IDEA创建项目 略 项目创建成功后在resources包下,属性文件application.properties中,把数据库连接属性加上,同时可以设置服 ...
- java中文乱码转换
String str=URLDecoder.decode(String, "UTF-8")
- 转载 如何理解API,API 是如何工作的
本文转载于https://blog.csdn.net/cumtdeyurenjie/article/details/80211896 感谢作者 仁杰兄 大家可能最近经常听到 API 这个概念,那什么是 ...
- getElementsBy 系列方法相比querySelector系列的区别
最近在做的项目中,使用querySelectorAll获取了同class名的元素后,绑定onmouseover事件和onmouseout后,多次在几个元素上移入移出操作时,控制台出现了报错的问题,最后 ...