Rabbit 通过方式获取消息:订阅方式事实上是向queue注冊consumer,通过rpc向queue server发送注冊consumer的消息。rabbitMQ Server在收到消息后,依据消息的内容类型推断这是一个订阅消息。这样当MQ 中queue有消息时,会自己主动把消息通过该socket(长连接)通道发送出去。

能够通过

  1. channel.basicQos(1);

设置RabbitMQ调度分发消息的方式。也就是告诉RabbitMQ每次仅仅给消费者处理一条消息。也就是等待消费者处理完而且已经对刚才处理的消息进行确认之后, 才发送下一条消息。防止消费者太过于忙碌。例如以下图所看到的:

整理代码例如以下:

Produce

  1. public class RabbitMQProduce {
  2. public static void main(String[] args) throws IOException, InterruptedException {
  3. ConnectionFactory factory =new ConnectionFactory();
  4. String routingKey="test";
  5. String exchange="test";
  6. factory.setHost("localhost");
  7. Connection conn = factory.newConnection();
  8. Channel channel =conn.createChannel();
  9.  
  10. //发送消息
  11. for(int i=0;i<8000;i++){
  12. if(i%5==0){
  13. Thread.sleep(200);
  14. }
  15. byte[] messageBodyBytes =(i+"").getBytes();
  16. //假设将队列设置为持久化之后,还须要将消息也设为可持久化的。MessageProperties.PERSISTENT_TEXT_PLAIN
  17. //也就是将队列设置为持久化之后。还须要将发送的消息也要设置为持久化才干保证队列和消息一直存在
  18. //消费者在声明时也要做持久化声明
  19. channel.basicPublish(exchange, routingKey, null, messageBodyBytes);
  20. System.out.println("发送.."+i);
  21. }
  22. channel.close();
  23. conn.close();
  24. }
  25. }

Customer

  1. public class RabbitMqCustomer {
  2. private static ConnectionFactory factory;
  3. private static String QueryName="test";
  4. private static Connection conn;
  5. private static Channel channel;
  6. private static String exchange="test";
  7. private static String routingKey="test";
  8. public static void main(String[] args) throws Exception {
  9. start();
  10. /**
  11. * 採用订阅的方式获取消息
  12. */
  13. channel.basicConsume(QueryName, false, new DefaultConsumer(channel){
  14. @Override
  15. public void handleShutdownSignal(String consumerTag,
  16. ShutdownSignalException sig) {
  17. System.out.println("==="+consumerTag+"====="+sig.getMessage());
  18. boolean isOpenConnect = conn!=null&&conn.isOpen();
  19. boolean isOpenChannel = channel != null && channel.isOpen();
  20. while(!isOpenChannel||!isOpenConnect){
  21. try {
  22. System.out.println("连接失败重连接....");
  23. start();
  24. Thread.sleep(3000);
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30.  
  31. @Override
  32. public void handleDelivery(String consumerTag, Envelope envelope,
  33. BasicProperties properties, byte[] body) throws IOException {
  34. //消息序号
  35. long deliveryTag = envelope.getDeliveryTag();
  36. String mes = new String(body,"UTF-8");
  37. System.out.println("接受到消息:"+mes);
  38. //确认收到,消息回执
  39. channel.basicAck(deliveryTag, true);
  40. }
  41. });
  42. }
  43.  
  44. public static void start() throws IOException {
  45. factory = new ConnectionFactory();
  46. factory.setHost("localhost");
  47. factory.setUsername("test");
  48. factory.setPassword("test");
  49. conn = factory.newConnection();
  50. channel = conn.createChannel();
  51. channel.exchangeDeclare(exchange, "topic");
  52. channel.queueDeclare(QueryName, false, false, false, null);//声明消息队列,且为可持久化的
  53. channel.queueBind(QueryName, exchange, routingKey);
  54. channel.basicQos(1); //消息分发处理
  55. }
  56. }

Rabbit mq订阅方式获取消息并可设置持久化的更多相关文章

  1. Spring Boot and Rabbit MQ 异常的时候消息的状态

    我们有一个处理消息的方法. 在处理消息的时候出现了异常,那出现异常后这个消息会怎么处理呢. 根据我们的实际情况的观察,如果出现了异常. 但是你没有捕获或者处理异常,这个消息会一直存在,并且你的系统会持 ...

  2. rabbit MQ 消息队列

    为什么会需要消息队列(MQ)? 一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ...

  3. Rabbit MQ 消息确认和持久化机制

    一:确认种类 RabbitMQ的消息确认有两种.一种是消息发送确认,用来确认生产者将消息发送给交换器,交换器传递给队列的过程中消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是确认是否到 ...

  4. 在 Windows 上安装Rabbit MQ 指南

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ...

  5. (转)在 Windows 上安装Rabbit MQ 指南

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ...

  6. Rabbit MQ 入门指南

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ...

  7. Rabbit MQ 面试题相关

    项目中的MQ: #rabbitmq spring.rabbitmq.host=127.0.0.1 主机 spring.rabbitmq.port=5672 端口 spring.rabbitmq.use ...

  8. Spring boot集成Rabbit MQ使用初体验

    Spring boot集成Rabbit MQ使用初体验 1.rabbit mq基本特性 首先介绍一下rabbitMQ的几个特性 Asynchronous Messaging Supports mult ...

  9. JMS学习(八)-ActiveMQ Consumer 使用 push 还是 pull 获取消息

    ActiveMQ是一个消息中间件,对于消费者而言有两种方式从消息中间件获取消息: ①Push方式:由消息中间件主动地将消息推送给消费者:②Pull方式:由消费者主动向消息中间件拉取消息.看一段官网对P ...

随机推荐

  1. Git:远程仓库的使用

    查看当前的远程库 要查看当前配置有哪些远程仓库,可以用git remote 命令,它会列出每个远程库的简短名字.在克隆完某个项目后,至少可以看到一个名为origin 的远程库,Git 默认使用这个名字 ...

  2. 广告狂人第一至七季/全集Mad Men迅雷下载

    广告狂人 第一季 Mad Men Season 1 (2007) 本季看点:你是谁?你想要什么?你爱乾什么?这些都不重要,重要的是你怎么把东西卖出去.凡是了解纽约的人都知道,今天,在麦迪逊大道(Mad ...

  3. cocos2d-x 保持屏幕点亮及自动变灰

    很早之前遇到的问题,现在记录一下.有一家Android渠道(抱歉,时间太长了已经记不大清楚是哪一家了 oppo/联想/酷派?)在我们提交新版本时拒绝了,理由是:手机背光状态下,屏幕不会自动变灰. 这里 ...

  4. Java泛型的一些限制

    本文主要參考<Java编程思想(第4版)>的Java泛型章节,仅当一个简单的读书笔记. 和C++泛型对照,Java泛型仅仅是一种编译期间的擦拭机制. 这是因为考虑到和曾经的兼容而考虑的一种 ...

  5. Orchard模块开发全接触6:自定义用户注册

    我们都知道 Orchard 的用户注册相当简单,现在,我们需要一个自定义的用户注册,现在,开始吧. 一:定义实体 Models/CustomerPartRecord.cs: public class ...

  6. .Net Core Bitmap位图处理

    截止.Net Core 2.0 目前官方类库的API中不支持Bitmap System.Drawing.Primitives 这是官方的一个Drawing库,但是没有Bitmap.Graphics等很 ...

  7. Eclipse中的特殊注释:TODO、XXX、FIXME

    特殊注释: 1. TODO表示需要实现,但目前还未实现的功能 2 .XXX勉强可以工作,但是性能差等原因 3 .FIXME代码是错误的,不能工作,需要修复 TODO: + 说明:如果代码中有该标识,说 ...

  8. 数学图形(1.49)Nephroid曲线

    昨天IPhone6在国内发售了,我就顺手发布个关于肾的图形.Nephroid中文意思是肾形的.但是这种曲线它看上去却不像个肾,当你看到它时,你觉得它像什么就是什么吧. The name nephroi ...

  9. git: error while loading shared libraries: libiconv.so.2

    git安装之后出现:git: error while loading shared libraries: libiconv.so.2: cannot open shared object file: ...

  10. Linux修改终端显示前缀及环境变量

    Linux终端前面默认显示一长串,如: [work@aaa.baidu.com dir]$ 这是由PS1环境变量决定的: [work@aaa.baidu.com dir]$ echo $PS1 [\u ...