rabbitMQ 的交换器有四种类型:direct、fanout、topic、headers

以下是具体的代码:

direct:路由键只能全部匹配,才能进入到指定队列中。其他使用

direct生产者

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; import java.util.Arrays;
import java.util.List; /**
* direct 生产者
*/
public class DirectPro { public final static String EXCHANGE_NAME = "direct_exchange";//direct交换器名称
public final static Integer SEND_NUM = 10;//发送消息次数 public static void main(String[] args) throws Exception {
//创建连接工厂,连接RabbitMQ
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("IP");//端口号、用户名、密码可以使用默认的
connectionFactory.setUsername("用户名");
connectionFactory.setPassword("密码");
connectionFactory.setPort(5672);
//创建连接
Connection connection = connectionFactory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//在信道中设置交换器
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
//交换器和队列绑定放到消费者进行
//自定义路由键
List<String> routeKey = Arrays.asList("key1","key2","key3");
//发送消息
for (int i=0;i<SEND_NUM;i++){
String key = routeKey.get(i%routeKey.size());//发送的key
String msg = "hello rabbitmq"+i;//发送的消息
//消息进行发送
channel.basicPublish(EXCHANGE_NAME,key,null,msg.getBytes());
System.out.println("send:"+key+"==="+msg);
}
channel.close();
connection.close();
} }

direct消费者

import com.rabbitmq.client.*;

import java.io.IOException;

/**
* direct 消费者
*/
public class DirectCon { public final static String EXCHANGE_NAME = "direct_exchange";//direct交换器名称 public final static String QUEUE_NAME = "queue_name"; public static void main(String[] args) throws Exception {
//创建连接工厂,连接RabbitMQ
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("IP");//端口号、用户名、密码可以使用默认的
connectionFactory.setUsername("用户名");
connectionFactory.setPassword("密码");
connectionFactory.setPort(5672);
//创建连接
Connection connection = connectionFactory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//在信道中设置交换器
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
//声明队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//交换器和队列绑定
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"key1");
System.out.println("waiting message....."); //声明消费者
final 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("Received:"+envelope.getRoutingKey()+"========"+message);
}
};
//消费者在指定的对队列上消费
channel.basicConsume(QUEUE_NAME,true,consumer); } }

3:执行结果:首先启动消费者,再启动发送者

生产者

消费者

fanout:消息能发送到所有队列上,跟路由键没有任何关系。

fanout生产者:重新定义一个交换器,只需将交换器设置成fanout就可以

  //在信道中设置交换器

  channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);

fanout消费者:重新定义一个交换器和队列,将交换器设置成fanout,绑定的key可以随便写。

  //在信道中设置交换器
  channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
  //声明队列
  channel.queueDeclare(QUEUE_NAME,false,false,false,null);
  //交换器和队列绑定
  channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"abc");

结果

生产者都一样

消费者

topic:按照*、#的匹配规则,进入到对应的队列

topic生产者:只需将交换器设置成topic,路由键的设置必须是用点. 进行分割("key1.k","key2.k","key3.k")

topic消费者:重新定义一个交换器和队列

//交换器和队列绑定
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"key2.*");

这样子就只能匹配key2.开头的

结果:生产者都一样

消费者

headers:是根据头部的消息映射到队列的。特殊的值x-match:all(全部匹配)、any(任何一个)。

生产者

        //在信道中设置交换器
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.HEADERS);
//设置要发送headers值
Map<String, Object> heardersMap = new HashMap<String, Object>();
heardersMap.put("api", "login");
heardersMap.put("version", 1.0);
heardersMap.put("radom", UUID.randomUUID().toString());
//设置消息的属性
AMQP.BasicProperties pro = new AMQP.BasicProperties.Builder()
.headers(heardersMap)
.build(); //发送消息
for (int i=0;i<SEND_NUM;i++){
String msg = "hello rabbitmq"+i;//发送的消息
//消息进行发送
channel.basicPublish(EXCHANGE_NAME,"",pro,msg.getBytes());
System.out.println("send:"+msg);
}
消费者
        //在信道中设置交换器
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.HEADERS); Map<String, Object> arguments = new HashMap<String, Object>();
arguments.put("x-match", "any");
arguments.put("api", "login");
arguments.put("version", 1.0);
arguments.put("dataType", "json"); //交换器和队列绑定
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName,EXCHANGE_NAME,"",arguments);
System.out.println("waiting message....."); //声明消费者
final 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(" [HeaderRecv] Received '" +
properties.getHeaders() + "':'" + message + "'");
}
};
结果:发送者一样
消费者

以上就是Java对原生的RabbitMQ基本使用。

RabbitMQ java 原生代码的更多相关文章

  1. Ionic 添加java原生代码 报support.v4不存在问题

    在做Ionic Hybird app开发过程中不可避免的使用一些原生代码的问题,那么怎么添加原生代码呢? 答案很简单:1.将原生代码直接拷贝到项目下的 你的项目名/platforms/android/ ...

  2. 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式

    由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...

  3. Android NDK开发之C调用Java及原生代码断点调试(二)

    上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了.点击:Android NDK开发之从Java与 ...

  4. Android NDK开发篇(六):Java与原生代码通信(异常处理)

    一.捕获异常 异常处理是Java中的功能.在Android中使用SDK进行开发的时候常常要用到.Android原生代码在运行过程中假设遇到错误,须要检測,并抛出异常给Java层.运行原生代码出现了问题 ...

  5. Android NDK开发篇(五):Java与原生代码通信(数据操作)

    尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用 ...

  6. Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)

    Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.訪问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次具体分析一 ...

  7. 使用JNA,让java调用原生代码

    JNA定义: JNA:java Native Access,是SUN公司开发的基于JNI的框架.JNI使得Java可以调用原生的c或者c++代码. JNA与JNI(Java Native Interf ...

  8. Android NDK开发篇:Java与原生代码通信(异常处理)

    一.捕获异常 异常处理是Java中的功能,在Android中使用SDK进行开发的时候经常要用到.Android原生代码在执行过程中如果遇到错误,需要检测,并抛出异常给Java层.执行原生代码出现了问题 ...

  9. Android NDK开发篇:Java与原生代码通信(原生方法声明与定义与数据类型)

    Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.访问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次详细分析一 ...

随机推荐

  1. mysql-connector-java(6.0以上)的时差问题

    一.背景 通过mybatis日志观察插入数据库的时间为当前时间,但是打开数据库表发现时间滞后了8个小时. 二.推论及解决 很容易猜到这是时区的问题. 三.最后找到的问题点如下: jdbc:mysql: ...

  2. (6)Flask项目之会员注册页面

    一.添加注册页面的路由 修改app/home/views.py内容,追加注册("/regist/")页面的路由: # coding:utf8 from . import home ...

  3. IDEA 如何搭建maven 安装、下载、配置(图文)

    1.下载 maven 压缩包 输入网址 www.apache.org 会看到以下界面 住下划看到以下界面 然后看到这个界面 选择下载这个版本 下载后 解压 maven 压缩包 (文件路径不建议用有中文 ...

  4. Mysql查询的执行顺序

    顺序: FROM JOIN ON WHERE GROUP BY (从此处开始可以使用select中指定的别名) AVG.SUM.MAX HAVING SELECT DISTINCT ORDER BY ...

  5. byte类型的取值为什么是-128~127

    参考:https://blog.csdn.net/qq_22771739/article/details/84496115 https://blog.csdn.net/boatalways/artic ...

  6. oracle 添加字段

    alter table 表名 add 新增字段名(类型+长度); #添加字段 alter table asset_orders add remark varchar2(255); #查看 descri ...

  7. swoole实战1-初识swoole

    原文地址:https://www.jianshu.com/p/008d5702d01f 安装swoole 以mac操作系统为例,如果你是mac新手,推荐阅读 程序员如何优雅使用mac 环境要求:php ...

  8. Dynamic Property Wizard 添加类提示 ATL类只能添加到MFC EXE 和MFC规则DLL项目或完全支持ATL的项目 错误提示解决方式

    在重新打开OPM项目添加ATL动态属性向导Dynamic Property Wizard提示错误 ATL类只能添加到MFC EXE 和MFC规则DLL项目或完全支持ATL的项目. 有效的解决方式,右键 ...

  9. Apache ZooKeeper在Kafka中的角色 - 监控和配置

    1.目标 今天,我们将看到Zookeeper在Kafka中的角色.本文包含Kafka中需要ZooKeeper的原因.我们可以说,ZooKeeper是Apache Kafka不可分割的一部分.在了解Zo ...

  10. win10 远程连接怎么设置快捷方式

    在桌面空白处右键,选择新建快捷方式,然后输入命令:C:\windows\system32\mstsc.exe,点击下一步,然后输入快捷方式名称:远程连接,点击确定即可.