rabbit工作队列模式
工作队列比简单队列在消费者这边多了一个方法。
channel.basicQos(1);公平队列消费(参数设置为1,表示消费者消费完一条才会去接受再次发来的消息)
生产者:
package com.kf.queueDemo.fairQueue; import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.kf.utils.RabbitConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
/**
* 公平模式发送消息
* @author kf
*
*/
public class FairProducer { //队列名称
private static String QUEUENAME = "SIMPLEQUEUE"; public static void main(String[] args) throws IOException, TimeoutException{
Connection connection = RabbitConnectionUtils.getConnection(); //创建通道
Channel channel = connection.createChannel(); //通道里放入队列
/**
* 第一个参数是 队列名称
* 第二个参数指 要不要持久化
*/
channel.queueDeclare(QUEUENAME, false, false, false, null); /* //消息体
String mes = "demo_message汉字"; //发送消息
*//**
* 参数为 exchange, routingKey, props, body
* exchange 交换机
* routingKey 路由键
*
* body 消息体
*//*
channel.basicPublish("", QUEUENAME, null, mes.getBytes());*/ /**
* 集群环境下,多个消费者情况下。消费者默认采用均摊
*/
for(int i=1; i<11; i++){
String mes = "demo_message汉字"+i;
System.out.println("发送消息"+mes);
channel.basicPublish("", QUEUENAME, null, mes.getBytes());
} // System.out.println("发送消息"+mes); channel.close();
connection.close();
} }
消费者1:
package com.kf.queueDemo.fairQueue; import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.kf.utils.RabbitConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
/**
* 公平模式消费者
* @author kf
*
*/
public class FairConsumer1 {
//队列名称
private static String QUEUENAME = "SIMPLEQUEUE"; public static void main(String[] args) throws IOException, TimeoutException{
System.out.println("01开始接收消息");
Connection connection = RabbitConnectionUtils.getConnection(); //创建通道
final Channel channel = connection.createChannel(); //通道里放入队列
/**
* 第一个参数是 队列名称
* 第二个参数指 要不要持久化
*/
channel.queueDeclare(QUEUENAME, false, false, false, null); //公平队列消费(参数设置为1,表示消费者消费完一条才会去接受再次发来的消息)
channel.basicQos(1); DefaultConsumer consumer = new DefaultConsumer(channel){
//监听队列
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
byte[] body) throws IOException {try {
Thread.sleep(500);
} catch (Exception e) {
}finally {
System.out.println("------------进入监听---------");
String s = new String(body, "utf-8");
System.out.println("获取到的消息是:"+s);
//手动应答。
/**
* 当 channel.basicConsume(QUEUENAME, true, consumer);第二个参数为false时 是手动应答模式
*/
channel.basicAck(envelope.getDeliveryTag(), false);
}}
}; //设置应答模式
/**
* 参数: 对列名,是否自动签收,监听的类
*/
System.out.println("获取消息的方法之前");
channel.basicConsume(QUEUENAME, false, consumer);
System.out.println("获取消息的方法之后"); } }
消费者2:
package com.kf.queueDemo.fairQueue; import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.kf.utils.RabbitConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
/**
* 公平模式消费者
* @author kf
*
*/
public class FairConsumer2 {
//队列名称
private static String QUEUENAME = "SIMPLEQUEUE"; public static void main(String[] args) throws IOException, TimeoutException{
System.out.println("02开始接收消息");
Connection connection = RabbitConnectionUtils.getConnection(); //创建通道
final Channel channel = connection.createChannel(); //通道里放入队列
/**
* 第一个参数是 队列名称
* 第二个参数指 要不要持久化
*/
channel.queueDeclare(QUEUENAME, false, false, false, null); //公平队列消费(参数设置为1,表示消费者消费完一条才会去接受再次发来的消息)
channel.basicQos(1); DefaultConsumer consumer = new DefaultConsumer(channel){
//监听队列
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
byte[] body) throws IOException {
try {
Thread.sleep(1000);
} catch (Exception e) {
}finally {
System.out.println("------------进入监听---------");
String s = new String(body, "utf-8");
System.out.println("获取到的消息是:"+s);
//手动应答。
/**
* 当 channel.basicConsume(QUEUENAME, true, consumer);第二个参数为false时 是手动应答模式
*/
channel.basicAck(envelope.getDeliveryTag(), false);
} }
}; //设置应答模式
/**
* 参数: 对列名,是否自动签收,监听的类
*/
System.out.println("获取消息的方法之前");
channel.basicConsume(QUEUENAME, false, consumer);
System.out.println("获取消息的方法之后"); } }
rabbit工作队列模式的更多相关文章
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_7.RabbitMQ研究-工作模式-工作队列模式
RabbitMQ有以下几种工作模式 : 1.Work queues 2.Publish/Subscribe 3.Routing 4.Topics 5.Header 6.RPC 1.Work queue ...
- Python Rabbit 广播模式
Exchange 在RabbitMQ下进行广播模式需要用到,exchange这个参数,它会把发送的消息推送到queues队列中,exchange必须要知道,它接下来收到的消息要分给谁,是要发给一个qu ...
- RabbitMQ六种队列模式-工作队列模式
前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列 [本文]RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
- python使用rabbitMQ介绍二(工作队列模式)
一模式介绍 第一章节的生产-消费者模式,是非常简单的模式,一发一收.在实际的应用中,消费者有的时候需要工作较长的时间,则需要增加消费者. 队列模型: 这时mq实现了一下几个功能: rabbitmq循环 ...
- 【RabbitMQ】3、工作队列模式(work模式)
上一篇博客的作为rabbitMQ的入门程序,也是简单队列模式,一个生产者,一个消费者,今天这篇博客介绍work模式,一个生产者,多个消费者,下面的例子模拟两个消费者的情况. 图示: 一 ...
- RabbitMQ指南之三:发布/订阅模式(Publish/Subscribe)
在上一章中,我们创建了一个工作队列,工作队列模式的设想是每一条消息只会被转发给一个消费者.本章将会讲解完全不一样的场景: 我们会把一个消息转发给多个消费者,这种模式称之为发布-订阅模式. 为了阐述这个 ...
- RabbitMQ六种队列模式-简单队列模式
前言 RabbitMQ六种队列模式-简单队列 [本文]RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
- SpringCloudStream学习(二)RabbitMQ中的交换机跟工作模式
知识储备: 交换机: RabbitMQ中有4中交换机,分别是 (FANOUT)扇形交换机: 扇形交换机是最基本的交换机类型,它所能做的事情非常简单---广播消息.扇形交换机会把能接收到的消息全部发 ...
- RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解
一.RabbitMQ简介 是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用Erlang(高并发语言)语言来编写的,并且RabbitMQ是基于AMQ ...
随机推荐
- 爬虫开发7.scrapy框架简介和基础应用
scrapy框架简介和基础应用阅读量: 1432 scrapy 今日概要 scrapy框架介绍 环境安装 基础使用 今日详情 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数 ...
- Linux centos 6.4安装
Linux系统安装: 开启虚拟机: 界面说明:Install or upgrade an existing system 安装或升级现有的系统install system with basic vid ...
- 经典排序的python实现
具体原理我这里就不解释了,可以查看数据结构课本或者百度百科 这里只给出相应的代码(很简洁) 1 __author__ = "WSX" class sort: def __init_ ...
- C++默认构造函数的问题
C++ defaul construct :缺省构造函数(默认构造函数) 定义:第一种 构造函数没有参数,即是 A()形式的 第二种 构造函数的全部参数由缺省值提供,A(int a=0,int ...
- xcode - iPhone Debugging: How to resolve 'failed to get the task for process'? - Stack Overflow
The program being debugged is not being run. Everyone sees this once in a while during Xcode develop ...
- C#获取当前程序集的完整路径
//获取当前程序集的完整路径加上EXE的名称 string binPath = Assembly.GetExecutingAssembly().Location; Console.WriteLine( ...
- 海思3519A 移植 Qt 5.5.1
源码下载 网址:qt-everywhere-opensource-src-5.5.1.tar.gz 配置生成MakeFile 文件 解压源码包,在源码包路径下生成配置 MakeFile : ./con ...
- java设计模式学习笔记
简介 设计模式可以分为五类 接口型 模式:适配器模式,外观模式,合成模式,桥接模式 职责型 模式:单例模式,观察者模式,调停者模式,代理模式,职责链模式,享元模式 构造型 模式:构建者模式,工厂方法模 ...
- js中报错"Maximum call stack size exceeded"解决方法
Uncaught RangeError: Maximum call stack size exceeded 错误直译过来就是“栈溢出”,出现这个错误的原因是因为我进行了递归运算,但是忘记添加判断条件, ...
- [转]Hive 数据类型
Hive的内置数据类型可以分为两大类:(1).基础数据类型:(2).复杂数据类型.其中,基础数据类型包括:TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBL ...