RabbitMQ之消费者Demo(队列参数详细说明)
package com.jiefupay; import java.io.IOException;
import java.util.HashMap;
import java.util.Map; 8
import org.apache.log4j.Logger; import com.jiefupay.dao.Dao; import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope; public class App{ private static final Logger log = Logger.getLogger(App.class); 26
private static final String EXCHANGE_NAME = "refreshDispatcherMemoryExchange"; private static String QUEUE_NAME = "refreshDispatcherMemoryhfQueue"; public static void main(String[] args) throws Exception { ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("yourusername");
factory.setPassword("yourpassword"); //0.创建连接和通道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel(); //1.声明一个死信交换机(扇形交换机)
channel.exchangeDeclare("refreshDispatcherDeadExchange", "fanout"); //2.创建队列的参数
Map<String, Object> queueArgs = new HashMap<String, Object>();
queueArgs.put("x-dead-letter-exchange", "refreshDispatcherDeadExchange"); //死信队列
queueArgs.put("x-message-ttl", 10000); // 消息超时:让发布的message在队列中可以存活多长时间,以毫秒为单位。
queueArgs.put("x-expires", 1000); // 队列超时:当前的queue在指定的时间内,没有消费者订阅就会被删除,以毫秒为单位。
queueArgs.put("x-max-length", 100); // 队列最大长度:当超过了这个大小的时候,会删除之前最早插入的消息为本次的留出空间。
queueArgs.put("x-queue-mode", "lazy"); //延迟加载:queue的信息尽可能的都保存在磁盘上,仅在有消费者订阅的时候才会加载到RAM中。 //3.声明队列。-将队列参数传到队列 (队列名字,是否持久化,是否排外,是否自动清理,参数)
channel.queueDeclare(QUEUE_NAME, true, false, false, queueArgs); //4.队列绑定交换机。 绑定键的意义依赖于转发器的类型,对于fanout类型,忽略此参数(第三个参数为binding key)。
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); 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"); try {
//消息处理(自己实现的方法)
messageHandler(message); //消息确认
channel.basicAck(envelope.getDeliveryTag(), false); }catch (Exception e) { //出现异常,置为true,重新入队。
channel.basicAck(envelope.getDeliveryTag(), true); //出现异常,不重新入队,而是reject入死信队列。
//channel.basicReject(envelope.getDeliveryTag(), false); }
}
};
//第二个参数值为false代表关闭RabbitMQ的自动应答机制,改为手动应答。
channel.basicConsume(QUEUE_NAME, false, consumer);
} public static void messageHandler(String message) {
switch (message) {
case "loadQDProductData": // 渠道信息 渠道产品
Dao.loadQDProductDataToSystem();
break;
case "loadQDGroupData": //渠道组
Dao.loadQDGroupDataToSystem();
break;
case "loadCustomerData": // 客户信息
Dao.loadCustomerDataToSystem();
break;
case "loadUserProductData": // 客户产品
Dao.loadUserProductDataToSystem();
break;
default:
break;
}
log.info( message + " Done" ); }
}
RabbitMQ之消费者Demo(队列参数详细说明)的更多相关文章
- RabbitMQ五:生产者--队列--多消费者
一.生成者-队列-多消费者(前言) 上篇文章,我们做了一个简单的Demo,一个生产者对应一个消费者,本篇文章就介绍 生产者-队列-多个消费者,下面简单示意图 P 生产者 C 消费者 中间队列 ...
- (四)RabbitMQ消息队列-服务详细配置与日常监控管理
原文:(四)RabbitMQ消息队列-服务详细配置与日常监控管理 RabbitMQ服务管理 启动服务:rabbitmq-server -detached[ /usr/local/rabbitmq/sb ...
- Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型
Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: 每个对象都对应于一个可称为" 互斥锁&qu ...
- AMQP协议与RabbitMQ、MQ消息队列的应用场景
什么是AMQP? 在异步通讯中,消息不会立刻到达接收方,而是被存放到一个容器中,当满足一定的条件之后,消息会被容器发送给接收方,这个容器即消息队列,而完成这个功能需要双方和容器以及其中的各个组件遵守统 ...
- RabbitMQ AMQP (高级消息队列协议)
目录 RabbitMQ AMQP (高级消息队列协议) Message Queue 简介 概念 基本组成 场景及作用 AMQP简介 模型架构 基础组件 AMQP-RabbitMQ 简介 模型 特性 参 ...
- rabbitmq消息消费者
pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...
- RabbitMq学习3-工作队列(Work queues)
工作队列(又称:任务队列——Task Queues)是为了避免等待一些占用大量资源.时间的操作.当我们把任务(Task)当作消息发送到队列中,一个运行在后台的工作者(worker)进程就会取出任务然后 ...
- RabbitMQ使用 prefetch_count优化队列的消费,使用死信队列和延迟队列实现消息的定时重试,golang版本
RabbitMQ 的优化 channel prefetch Count 死信队列 什么是死信队列 使用场景 代码实现 延迟队列 什么是延迟队列 使用场景 实现延迟队列的方式 Queue TTL Mes ...
- RabbitMQ如何实现延迟队列?(转)
什么是延迟队列 延迟队列存储的对象肯定是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 场景一 ...
随机推荐
- Python函数中如何定义参数
一.位置参数:根据函数定义时的参数位置传递参数#形参和实参的个数必须一致def fun1(): print("运行结果") print("this is fun1(),n ...
- MySQL修改表
一.给表mytablename添加新字段newcolumn alter table mytablename add newcolumn varchar(50) COMMENT '新字段备注信息' 二. ...
- FreeRTOS--堆内存管理
因为项目需要,最近开始学习FreeRTOS,一开始有些紧张,因为两个星期之前对于FreeRTOS的熟悉度几乎为零,经过对FreeRTOS官网的例子程序的摸索,和项目中问题的解决,遇到了很多熟悉的身影, ...
- 浅谈canvas绘画王者荣耀--雷达图
背景: 一日晚上下班的我静静的靠在角落上听着歌,这时"滴!滴!"手机上传来一阵qq消息.原来我人在问王者荣耀的雷达图在页面上如何做出来的,有人回答用canvas绘画.那么问题来了, ...
- SQL图像查看器 —— SQL Image Viewer
有时候往数据库里面存储了一些图片,但是如果不写读取程序的话,就不知道存储的对不对. 或者查看SQL数据库里面二进制看不懂,这个看图片很直观的. 就需要SQL Image Viewer这么一个
- SQL Server插入数据和删除数据
首先在我的Student表中插入几条数据,由于我的表已经创建完成了,所以就没有创建表的 sql 语句了,不过可以看我的上一篇文章: http://www.cnblogs.com/Brambling/p ...
- VSCode插件及用户设置
第一部分:插件 VSCode内置"emmet"插件,"convert to utf-8"等插件效果!十分强大!代码提示功能特别强悍! 插件地址:点击此处! 推荐 ...
- 手动搭建express框架
创建相应的文件夹 在根路径下创建package.json文件并在命令面板里安装相应的模块包(如下) 2. 在根路径下创建app.js, 在根路径下创建routes文件夹,并在文件夹中创建index. ...
- Emoji表情符号录入MySQL数据库报错的解决方式
前言:手机app应用评论的时候,恢复表情符号.提示失败.1,查看tomcat后台日志,核心报错信息例如以下: Caused by: java.sql.SQLException: Incorrect ...
- MongoDB学习笔记<一>
今天学习了shell的主要的操作,例如以下: 1.创建一个数据库foobar use foobar 2.给指定的数据库加入集合,并加入记录 db.person.insert({"name&q ...