java 双工模式_rabbitMq-工作模式(双工模式)-java
P:代表生产者,向队列中发送消息。
队列:保存生产者提供的数据。(队列的特点,先进先出)
C1,C2:代表消费者,负责将对列中的消息全部读取,并且完成特定的任务。
工作原理:当生产者向对列中发送消息时,C1和C2一起争抢消息的执行权,谁抢到,谁执行。内部有负载的策略。
[root@bogon rabbitmq-server-3.6.1]# cd /etc/rabbitmq
[root@bogon rabbitmq]# service rabbitmq-server start
Starting rabbitmq-server: SUCCESS
rabbitmq-server.er.
pom.xml
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.rabbit
schoolmanage
0.0.1-SNAPSHOT
war
com.rabbitmq
amqp-client
3.5.1
org.springframework.amqp
spring-rabbit
1.4.0.RELEASE
junit
junit
4.11
package schoolmanage;
import java.io.IOException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class TestStudentMsgWork {
private Connection connection = null;
// 工作模式
private String queueName = "work";
@Before
public void init() throws IOException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 为工厂对象添加数据
// 远程主机
factory.setHost("192.168.6.130");
// 端口号
factory.setPort(5672);
// 虚拟主机
factory.setVirtualHost("/school");
// 用户名
factory.setUsername("student");
// 密码
factory.setPassword("student");
// 创建连接
connection = factory.newConnection();
}
// 消息生产者
@Test
public void provider() throws IOException {
// 创建通道
Channel channel = connection.createChannel();
String msg = "我要吃饭!!!——工作模式";
// 创建队列
/**
* String queue, 队列的名称 boolean durable,持久化 false表示不持久化,
* true表示rabbitmq重启后会恢复队列的内容 boolean exclusive,服务器所独有,如果设置为true则消费者不能使用
* boolean autoDelete,是否自动删除 当队列中没有消息时,该队列是否自动删除 Map
* arguments 额外的参数
*/
channel.queueDeclare(queueName, false, false, false, null);
/**
* String exchange, 交换机的名称,如果需要交换机则添加名称 如果没有交换机 则为""串 String routingKey,
* 路由key 寻址的关键字,如果需要使用路由key定义特定的关键字(orderKey.xxx)
* 如果不需要路由key,在简单模式中的添加队列的名称 BasicProperties props, 其他的配置,一般为null byte[]
* body,表示需要发送的消息-字节码文件
*/
channel.basicPublish("", queueName, null, msg.getBytes());
// 将流关闭
channel.close();
System.out.println("消息发送成功!!!");
}
// 消费者1
@Test
public void consumer1() throws Exception {
// 创建通道
Channel channel = connection.createChannel();
channel.queueDeclare(queueName, false, false, false, null);
// 需要对消费个数进行定义
// 消费者允许有三次没有响应给rabbitMQ,如果长时间没有响应则不再允许再次消费消息
channel.basicQos(1);// 当前执行的总数,一个消费者一次只能拿到一个队列
// 定义消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 将消费者与队列进行绑定
/**
* autoAck为false表示手动返回
*/
channel.basicConsume(queueName, false, consumer);
System.out.println("消费者1,启动。。。");
// 获取消息
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String msg = "消费者1收到 :" + new String(delivery.getBody());
System.out.println(msg);
// 告知rabbitMq当前消费的是哪一个消息
/**
* multiple false表示不扩展
*/
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
// 消费者2
@Test
public void consumer2() throws Exception {
// 创建通道
Channel channel = connection.createChannel();
channel.queueDeclare(queueName, false, false, false, null);
// 需要对消费个数进行定义
// 消费者允许有三次没有响应给rabbitMQ,如果长时间没有响应则不再允许再次消费消息
channel.basicQos(1);// 当前执行的总数,一个消费者一次只能拿到一个队列
// 定义消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 将消费者与队列进行绑定
/**
* autoAck为false表示手动返回
*/
channel.basicConsume(queueName, false, consumer);
System.out.println("消费者2,启动。。。");
// 获取消息
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String msg = "消费者2收到 :" + new String(delivery.getBody());
System.out.println(msg);
// 告知rabbitMq当前消费的是哪一个消息
/**
* multiple false表示不扩展
*/
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
@After
public void close() throws IOException {
connection.close();
}
}
执行结果
启动consumer1
消费者1,启动。。。
启动consumer2
消费者2,启动。。。
启动provider
消息发送成功!!!
查看consumer1
消费者1收到 :我要吃饭!!!——工作模式
启动provider
消息发送成功!!!
查看启动consumer2
消费者2收到 :我要吃饭!!!——工作模式
java 双工模式_rabbitMq-工作模式(双工模式)-java相关推荐
- java lock 效率_工作常用4种Java线程锁的特点,性能比较、使用场景
多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...
- Qt Creator在编辑模式下工作
Qt Creator在编辑模式下工作 在编辑模式下工作 使用编辑器工具栏 在打开的文件和符号之间导航 选择解析上下文 更改文字编码 选择行尾样式 分割编辑器视图 使用书签 转到符号定义或声明 重新解析 ...
- 【嵌入式开发】ARM 处理器工作模式 及 修改方法 ( 处理器模式 | 设置处理器模式 | 程序状态字寄存器 CPSR SPSR | 模式设置代码编写 | 设置 svc 模式 )
一. 处理器工作模式相关介绍 1. 处理器模式简介 (1) 处理器工作模式分类 (2) 处理器不同工作模式区别 (3) Linux 系统运行的模式 (4) 特权模式 说明 (5) 异常模式 (6) 系 ...
- SIM800C 透传模式与非透传模式测试对比
许多客户对于什么是透传模式不了解,当我们向客户说明什么是透传模式时,许多人都不明白,现在海凌科电子有限公司现向客户说明什么是透传模式.SerialNet模式将本地异步串口通信转换成基于TCP/UDP协 ...
- SSL工作原理介绍以及java实现
SSL工作原理介绍以及java实现 目录 SSL工作原理介绍以及java实现 SSL简介 SSL工作原理 握手协议Handshake protocol 1握手阶段使用RSA加密算法 2握手阶段使用Di ...
- Java初级开发工程师工作的岗位职责(合集)
Java初级开发工程师工作的岗位职责 Java初级开发工程师工作的岗位职责1 职责: 1. 协助完成需求的整理和软件设计; 2. 按照项目计划,按时提交高质量代码,完成开发任务,规范文档的编写 ...
- 作为Java开发程序员,中科创达java应届生薪资
01 并发宝典:面试专题 面试专题分为四个部分,分别如下 Synchronized 相关问题 可重入锁 ReentrantLock 及其他显式锁相关问题 Java 线程池相关问题 Java 内存模型相 ...
- rabbitmq几种工作模式_RabbitMQ六种队列模式-简单队列模式
在官网的教程中,描述了如上六类工作队列模式: 简单队列模式:最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列.也称为点对点模式. 工作模式:一个消息生产者,一个交换器,一个消息队列,多个 ...
- c java socket编程_java+swing C/s模式的socket编程与长短连接
java+swing C/s模式的socket编程与长短连接 什么是socket 长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要 ...
- 《JAVA与模式》之简单工厂模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...
最新文章
- mysql 让别人连接我的数据库
- JdbcTemplate详解 - 2
- Msfvenonm生成后门
- mino文件服务器删除文件,Spring-minio
- Sencha touch API
- IDEA卡顿问题解决-加大内存
- elasticsearch的rest搜索--- 查询
- 颠覆世界的新技术:区块链
- 用openssh下的sftp通过chroot控制用户
- 使用Selenium定位鼠标悬浮出现的下拉菜单
- 时空轨迹数据挖掘综述
- Windows与Linux配置jco3
- css定义文字加粗,css文字加粗font-weight
- easypoi必填项_easypoi必填项_EasyPoi使用入门
- 央央家政解读:育儿嫂服务内容和标准
- C语言_malloc动态开辟内存空间
- java主机哪儿好_java虚拟主机哪个好,香港java虚拟主机哪里有!
- CNC加工中心操机全过程,学数控必备
- Excel+VBA+之快速上手(2)
- c语言输出字符的十六进制,用c语言输入键盘上的字符后转换成十六进制输出