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

以下是具体的代码:

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

direct生产者

  1. import com.rabbitmq.client.BuiltinExchangeType;
  2. import com.rabbitmq.client.Channel;
  3. import com.rabbitmq.client.Connection;
  4. import com.rabbitmq.client.ConnectionFactory;
  5.  
  6. import java.util.Arrays;
  7. import java.util.List;
  8.  
  9. /**
  10. * direct 生产者
  11. */
  12. public class DirectPro {
  13.  
  14. public final static String EXCHANGE_NAME = "direct_exchange";//direct交换器名称
  15. public final static Integer SEND_NUM = 10;//发送消息次数
  16.  
  17. public static void main(String[] args) throws Exception {
  18. //创建连接工厂,连接RabbitMQ
  19. ConnectionFactory connectionFactory = new ConnectionFactory();
  20. connectionFactory.setHost("IP");//端口号、用户名、密码可以使用默认的
  21. connectionFactory.setUsername("用户名");
  22. connectionFactory.setPassword("密码");
  23. connectionFactory.setPort(5672);
  24. //创建连接
  25. Connection connection = connectionFactory.newConnection();
  26. //创建信道
  27. Channel channel = connection.createChannel();
  28. //在信道中设置交换器
  29. channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
  30. //交换器和队列绑定放到消费者进行
  31. //自定义路由键
  32. List<String> routeKey = Arrays.asList("key1","key2","key3");
  33. //发送消息
  34. for (int i=0;i<SEND_NUM;i++){
  35. String key = routeKey.get(i%routeKey.size());//发送的key
  36. String msg = "hello rabbitmq"+i;//发送的消息
  37. //消息进行发送
  38. channel.basicPublish(EXCHANGE_NAME,key,null,msg.getBytes());
  39. System.out.println("send:"+key+"==="+msg);
  40. }
  41. channel.close();
  42. connection.close();
  43. }
  44.  
  45. }

direct消费者

  1. import com.rabbitmq.client.*;
  2.  
  3. import java.io.IOException;
  4.  
  5. /**
  6. * direct 消费者
  7. */
  8. public class DirectCon {
  9.  
  10. public final static String EXCHANGE_NAME = "direct_exchange";//direct交换器名称
  11.  
  12. public final static String QUEUE_NAME = "queue_name";
  13.  
  14. public static void main(String[] args) throws Exception {
  15. //创建连接工厂,连接RabbitMQ
  16. ConnectionFactory connectionFactory = new ConnectionFactory();
  17. connectionFactory.setHost("IP");//端口号、用户名、密码可以使用默认的
  18. connectionFactory.setUsername("用户名");
  19. connectionFactory.setPassword("密码");
  20. connectionFactory.setPort(5672);
  21. //创建连接
  22. Connection connection = connectionFactory.newConnection();
  23. //创建信道
  24. Channel channel = connection.createChannel();
  25. //在信道中设置交换器
  26. channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
  27. //声明队列
  28. channel.queueDeclare(QUEUE_NAME,false,false,false,null);
  29. //交换器和队列绑定
  30. channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"key1");
  31. System.out.println("waiting message.....");
  32.  
  33. //声明消费者
  34. final Consumer consumer = new DefaultConsumer(channel){
  35. @Override
  36. public void handleDelivery(String consumerTag, Envelope envelope,
  37. AMQP.BasicProperties properties, byte[] body) throws IOException {
  38. String message = new String(body,"utf-8");
  39. System.out.println("Received:"+envelope.getRoutingKey()+"========"+message);
  40. }
  41. };
  42. //消费者在指定的对队列上消费
  43. channel.basicConsume(QUEUE_NAME,true,consumer);
  44.  
  45. }
  46.  
  47. }

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消费者:重新定义一个交换器和队列

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

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

结果:生产者都一样

消费者

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

生产者

  1. //在信道中设置交换器
  2. channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.HEADERS);
  3. //设置要发送headers值
  4. Map<String, Object> heardersMap = new HashMap<String, Object>();
  5. heardersMap.put("api", "login");
  6. heardersMap.put("version", 1.0);
  7. heardersMap.put("radom", UUID.randomUUID().toString());
  8. //设置消息的属性
  9. AMQP.BasicProperties pro = new AMQP.BasicProperties.Builder()
  10. .headers(heardersMap)
  11. .build();
  12.  
  13. //发送消息
  14. for (int i=0;i<SEND_NUM;i++){
  15. String msg = "hello rabbitmq"+i;//发送的消息
  16. //消息进行发送
  17. channel.basicPublish(EXCHANGE_NAME,"",pro,msg.getBytes());
  18. System.out.println("send:"+msg);
  19. }
  1. 消费者
  1. //在信道中设置交换器
  2. channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.HEADERS);
  3.  
  4. Map<String, Object> arguments = new HashMap<String, Object>();
  5. arguments.put("x-match", "any");
  6. arguments.put("api", "login");
  7. arguments.put("version", 1.0);
  8. arguments.put("dataType", "json");
  9.  
  10. //交换器和队列绑定
  11. String queueName = channel.queueDeclare().getQueue();
  12. channel.queueBind(queueName,EXCHANGE_NAME,"",arguments);
  13. System.out.println("waiting message.....");
  14.  
  15. //声明消费者
  16. final Consumer consumer = new DefaultConsumer(channel){
  17. @Override
  18. public void handleDelivery(String consumerTag, Envelope envelope,
  19. AMQP.BasicProperties properties, byte[] body) throws IOException {
  20. String message = new String(body,"utf-8");
  21. System.out.println(" [HeaderRecv] Received '" +
  22. properties.getHeaders() + "':'" + message + "'");
  23. }
  24. };
  1. 结果:发送者一样
    消费者

以上就是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. windows10 dos窗口输出卡住

    https://blog.csdn.net/u013866090/article/details/82790864 原本每间隔一秒就会输出一次数据,但是当鼠标点击窗口的其他区域后输出就停止了,在点击键 ...

  2. jxls:用jx:if实现字典值格式化

    用JXLS导出excel非常方便,但是我们往往需要把字典值转为中文名称,例如1转为男,这个时候就需要用到jx:if来完成. 请见下图: jx:if(condition="obj.way==1 ...

  3. Swift编码总结3

    1.编码转换: dataString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" re ...

  4. python:日期计算

    python语言中的datetime模块可以利用其中的方法获取不同的日期,比如获取当前日期.明天.昨天.上个月.下个月和明年.下面利用几个实例说明这些日期的获取方法,操作如下: 第一步,利用datet ...

  5. Survey of single-target visual tracking methods based on online learning 翻译

    基于在线学习的单目标跟踪算法调研 摘要 视觉跟踪在计算机视觉和机器人学领域是一个流行和有挑战的话题.由于多种场景下出现的目标外貌和复杂环境变量的改变,先进的跟踪框架就有必要采用在线学习的原理.本论文简 ...

  6. web基础---->session的使用

    前几天在博问中,看到有人提到了有关session的问题,决定自己整理写一下有关session的原理!说起session,cookie必须是要谈的! 目录 Cookie的介绍 Cookie的使用 Ses ...

  7. OpenJudge 4152 最佳加法表达式

    总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放 ...

  8. [案例一] Spring中的事件驱动模型(机制)

    事件驱动模型是观察者模式的另一种形态,观察者相当于监听器,被观察者相当于事件源 事件源产生事件,监听器监听事件 以用户注册时候,要发送邮件和发送短信举例说明 定义一个事件 /** * spring会自 ...

  9. dubbo学习之路-SPI机制

    dubbo学习之路-SPI机制 1.SPI 1.1Java SPI 原理 SPI是service provider interface简称.在java JDK中 内置的一种服务提供发现机制.它解决在一 ...

  10. 20191210-RobotFramework常见问题解决

    附加-问题解决 1.   执行robot用例的时候提示WebDriverException: Message: invalid argument: can't kill an exited proce ...