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). 这样发消息者 ...
随机推荐
- SAS 读取数据文件
每次读取数据时需要告诉SAS3件事:1:数据存在哪里?2:数据的形式3:创建的数据集的类型(永久/临时) 1 读取SAS数据集 DATA temp; /*temp 为创建的数据集名称*/ INFILE ...
- linux基础知识汇总(二)-vi/vim
转:http://blog.csdn.net/sky04/article/details/5662582 vi与vim一样都是编辑器,不同的是vim更高级一些,可以理解是vi的高级版本.vi就像Win ...
- VMware 安装CenterOS
虚拟机安装CenterOS 简介:在VMware里安装Linux虚拟机,这里使用的是(Center OS 6.9). 一.准备工作: 安装 VMware Workstation Pro,很简单不哔哔了 ...
- 78、tensorflow滑动平均模型,用来更新迭代的衰减系数
''' Created on 2017年4月21日 @author: weizhen ''' #4.滑动平均模型 import tensorflow as tf #定义一个变量用于计算滑动平均,这个变 ...
- XStream教程
XStream是一个简单的基于Java库,Java对象序列化到XML,反之亦然(即:可以轻易的将Java对象和xml文档相互转换). 特点 使用方便 - XStream的API提供了一个高层次外观,以 ...
- pip安装任何包都出现问题
<!DOCTYPE html> { margin: 0; padding: 0; } body { background: url(images/body_bg.png) repeat-x ...
- 递归,装饰器,python常用内置方法
**递归** def calc(n): print(n) if int(n / 2) == 0: 条件判断 r ...
- 深信服杯ctf部分wp
CRYPTO1,NO SOS题目给了一段由.和-构成的密码由于题目提示不是摩斯码,将.和-化为0和1,长度为65位无法与8或7整除,无法转换为ascii,但可以被5整除,猜测为培根密码,将0化为a,1 ...
- 自定义servlet重写doGet或者doPost方法时,405 method not allowed
自定义servlet public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServlet ...
- Java对象什么时候可以被垃圾回收?JVM的永久代中会发生垃圾回收么?
当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了.垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC).如果你仔细查看垃圾收集器 ...