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相关推荐

  1. java lock 效率_工作常用4种Java线程锁的特点,性能比较、使用场景

    多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...

  2. Qt Creator在编辑模式下工作

    Qt Creator在编辑模式下工作 在编辑模式下工作 使用编辑器工具栏 在打开的文件和符号之间导航 选择解析上下文 更改文字编码 选择行尾样式 分割编辑器视图 使用书签 转到符号定义或声明 重新解析 ...

  3. 【嵌入式开发】ARM 处理器工作模式 及 修改方法 ( 处理器模式 | 设置处理器模式 | 程序状态字寄存器 CPSR SPSR | 模式设置代码编写 | 设置 svc 模式 )

    一. 处理器工作模式相关介绍 1. 处理器模式简介 (1) 处理器工作模式分类 (2) 处理器不同工作模式区别 (3) Linux 系统运行的模式 (4) 特权模式 说明 (5) 异常模式 (6) 系 ...

  4. SIM800C 透传模式与非透传模式测试对比

    许多客户对于什么是透传模式不了解,当我们向客户说明什么是透传模式时,许多人都不明白,现在海凌科电子有限公司现向客户说明什么是透传模式.SerialNet模式将本地异步串口通信转换成基于TCP/UDP协 ...

  5. SSL工作原理介绍以及java实现

    SSL工作原理介绍以及java实现 目录 SSL工作原理介绍以及java实现 SSL简介 SSL工作原理 握手协议Handshake protocol 1握手阶段使用RSA加密算法 2握手阶段使用Di ...

  6. Java初级开发工程师工作的岗位职责(合集)

    Java初级开发工程师工作的岗位职责     Java初级开发工程师工作的岗位职责1 职责: 1. 协助完成需求的整理和软件设计; 2. 按照项目计划,按时提交高质量代码,完成开发任务,规范文档的编写 ...

  7. 作为Java开发程序员,中科创达java应届生薪资

    01 并发宝典:面试专题 面试专题分为四个部分,分别如下 Synchronized 相关问题 可重入锁 ReentrantLock 及其他显式锁相关问题 Java 线程池相关问题 Java 内存模型相 ...

  8. rabbitmq几种工作模式_RabbitMQ六种队列模式-简单队列模式

    在官网的教程中,描述了如上六类工作队列模式: 简单队列模式:最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列.也称为点对点模式. 工作模式:一个消息生产者,一个交换器,一个消息队列,多个 ...

  9. c java socket编程_java+swing C/s模式的socket编程与长短连接

    java+swing C/s模式的socket编程与长短连接 什么是socket 长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要 ...

  10. 《JAVA与模式》之简单工厂模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...

最新文章

  1. mysql 让别人连接我的数据库
  2. JdbcTemplate详解 - 2
  3. Msfvenonm生成后门
  4. mino文件服务器删除文件,Spring-minio
  5. Sencha touch API
  6. IDEA卡顿问题解决-加大内存
  7. elasticsearch的rest搜索--- 查询
  8. 颠覆世界的新技术:区块链
  9. 用openssh下的sftp通过chroot控制用户
  10. 使用Selenium定位鼠标悬浮出现的下拉菜单
  11. 时空轨迹数据挖掘综述
  12. Windows与Linux配置jco3
  13. css定义文字加粗,css文字加粗font-weight
  14. easypoi必填项_easypoi必填项_EasyPoi使用入门
  15. 央央家政解读:育儿嫂服务内容和标准
  16. C语言_malloc动态开辟内存空间
  17. java主机哪儿好_java虚拟主机哪个好,香港java虚拟主机哪里有!
  18. CNC加工中心操机全过程,学数控必备
  19. Excel+VBA+之快速上手(2)
  20. c语言输出字符的十六进制,用c语言输入键盘上的字符后转换成十六进制输出

热门文章

  1. C语言常见的错误类型
  2. MySQL使用ALTER TABLE创建索引
  3. DOS命令查看网络信息
  4. php 创建 cookie文件,PHP创建Cookie数组
  5. 字节/阿里/ 百度2021年Java岗发布+最新内部面试题
  6. 日志框架,选择Logback Or Log4j2?
  7. 给女朋友讲ActiveMQ是啥?
  8. gitlab使用方法
  9. 高并发之并发容器,了解多少(从入门到超神)
  10. 基数排序及其思想 C++代码实现及分析 恋上数据结构笔记