假设已经在服务器上安装完RabbitMQ。我写的教程

一、发送消息到队列(生产者)

新建一个maven项目,在pom.xml文件加入以下依赖

<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5</version>
</dependency>
</dependencies>

新建一个P1类

package com.rabbitMQ.test;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; import java.io.IOException;
import java.util.concurrent.TimeoutException; /**
* @author mowen
* @create 2019/11/20-11:23
*/
public class P1 {
public static void main(String[] args) throws IOException, TimeoutException {
//消息队列名字
String queueName="queue";
//实例连接工厂
ConnectionFactory connectionFactory=new ConnectionFactory();
//设置地址
connectionFactory.setHost("192.168.128.233");
//设置端口
connectionFactory.setPort(5672);
//设置用户名
connectionFactory.setUsername("mowen");
//设置密码
connectionFactory.setPassword("123456");
//获取连接(跟jdbc很像)
Connection connection = connectionFactory.newConnection();
//创建通道
Channel channel = connection.createChannel();
//声明队列。
//参数1:队列名
//参数2:持久化 (true表示是,队列将在服务器重启时依旧存在)
//参数3:独占队列(创建者可以使用的私有队列,断开后自动删除)
//参数4:当所有消费者客户端连接断开时是否自动删除队列
//参数5:队列的其他参数
channel.queueDeclare(queueName,true,false,false,null); for (int i = 0; i < 10; i++) {
String msg="msg"+i;
// 基本发布消息
// 第一个参数为交换机名称、
// 第二个参数为队列映射的路由key、
// 第三个参数为消息的其他属性、
// 第四个参数为发送信息的主体
channel.basicPublish("",queueName,null,msg.getBytes());
} channel.close();
connection.close();
}
}

运行后再浏览器进入RabbitMQ的控制台,切换到queue看到

二、获取队列消息(消费者)

新建一个C1类

package com.rabbitMQ.test;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException; /**
* @author mowen
* @create 2019/11/20-13:12
*/
public class C1 {
public static void main(String[] args) throws IOException, TimeoutException {
//消息队列名字
String queueName="queue";
//实例连接工厂
ConnectionFactory connectionFactory=new ConnectionFactory();
//设置地址
connectionFactory.setHost("192.168.128.233");
//设置端口
connectionFactory.setPort(5672);
//设置用户名
connectionFactory.setUsername("mowen");
//设置密码
connectionFactory.setPassword("123456");
//获取连接(跟jdbc很像)
Connection connection = connectionFactory.newConnection();
//创建通道
Channel channel = connection.createChannel(); // 创建一个消费者
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
// 消费收到消息的时候调用的回调
System.out.println("C3接收到:" + new String(body));
}
}; //把消费着绑定到指定队列
//第一个是队列名
//第二个是 是否自动确认
//第三个是消费者
channel.basicConsume(queueName,true,consumer); }
}

运行后输出为

消费者一般都不会关闭,会一直等待队列消息,可以手动关闭程序。

channel.basicConsume(queueName,true,consumer);中的true为收到消息后自动确认,改为false取消自动确认。

在handleDelivery方法最后面用

// 手动确认
// 确认收到消息
channel.basicAck(envelope.getDeliveryTag(),false);

来收到手动确认消息。消费者可以有多个并且可以同时消费一个队列;

当有多个消费者同时消费同一个队列时,收到的消息是平均分配的(消费者没收到之前已经确认每个消费者受到的消息),

但当其中一个消费者性能差的话,会影响其他的消费者,因为还要等它收完消息,这样会拖累其他消费者。

可以设置channel 的basicQos方法

//设置最多接受消息数量
// 设置了这个参数之后要吧自动确认关掉
channel.basicQos(1);

三、扇形(fanout)交换机

扇形交换机是基本的交换机类型,会把收到的消息以广播的形式发送到绑定的队列里,因为不需要经过条件筛选,所以它的速度最快。

在生产者项目新建一个fanout类

package com.rabbitMQ.routing;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; import java.io.IOException;
import java.util.concurrent.TimeoutException; /**
* @author mowen
* @date 2019/11/20-11:23
*/
public class fanout {
public static void main(String[] args) throws IOException, TimeoutException {
//交换机名字
String exchangeName="fanout";
//交换机名字类型
String exchangeType="fanout";
//消息队列名字
String queueName1="fanout.queue1";
String queueName2="fanout.queue2";
String queueName3="fanout.queue3";
//实例连接工厂
ConnectionFactory connectionFactory=new ConnectionFactory();
//设置地址
connectionFactory.setHost("192.168.128.233");
//设置端口
connectionFactory.setPort(5672);
//设置用户名
connectionFactory.setUsername("mowen");
//设置密码
connectionFactory.setPassword("123456");
//获取连接(跟jdbc很像)
Connection connection = connectionFactory.newConnection();
//创建通道
Channel channel = connection.createChannel();
//声明队列。
//参数1:队列名
//参数2:持久化 (true表示是,队列将在服务器重启时依旧存在)
//参数3:独占队列(创建者可以使用的私有队列,断开后自动删除)
//参数4:当所有消费者客户端连接断开时是否自动删除队列
//参数5:队列的其他参数
channel.queueDeclare(queueName1,true,false,false,null);
channel.queueDeclare(queueName2,true,false,false,null);
channel.queueDeclare(queueName3,true,false,false,null); //声明交换机
channel.exchangeDeclare(exchangeName,exchangeType); //队列绑定到交换机
channel.queueBind(queueName1,exchangeName,"");
channel.queueBind(queueName2,exchangeName,"");
channel.queueBind(queueName3,exchangeName,""); for (int i = 0; i < 10; i++) {
String msg="msg"+i;
// 基本发布消息
// 第一个参数为交换机名称、
// 第二个参数为队列映射的路由key、
// 第三个参数为消息的其他属性、
// 第四个参数为发送信息的主体
channel.basicPublish(exchangeName,"",null,msg.getBytes());
} channel.close();
connection.close();
}
}

运行后在RabbitMQ网页管理后台的queue会看到

切换到Exchanges会看到一个

就是我们声明的交换机,点击会看到我们绑定的队列

四、直连(direct)交换机

直连交换机会带路由功能,队列通过routing_key与直连交换机绑定,发送消息需要指定routing_key,交换机收到消息时,交换机会根据routing_key发送到指定队列里,同样的routing_key可以支持多个队列。

在生产者项目新建direct类

package com.rabbitMQ.routing;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; import java.io.IOException;
import java.util.concurrent.TimeoutException; /**
* @author mowen
* @date 2019/11/20-11:23
*/
public class direct {
public static void main(String[] args) throws IOException, TimeoutException {
String exchangeName="direct";
String exchangeType="direct";
//消息队列名字
String queueName1="direct.queue1";
String queueName2="direct.queue2";
String queueName3="direct.queue3";
//实例连接工厂
ConnectionFactory connectionFactory=new ConnectionFactory();
//设置地址
connectionFactory.setHost("192.168.128.233");
//设置端口
connectionFactory.setPort(5672);
//设置用户名
connectionFactory.setUsername("mowen");
//设置密码
connectionFactory.setPassword("123456");
//获取连接(跟jdbc很像)
Connection connection = connectionFactory.newConnection();
//创建通道
Channel channel = connection.createChannel();
//声明队列。
//参数1:队列名
//参数2:持久化 (true表示是,队列将在服务器重启时依旧存在)
//参数3:独占队列(创建者可以使用的私有队列,断开后自动删除)
//参数4:当所有消费者客户端连接断开时是否自动删除队列
//参数5:队列的其他参数
channel.queueDeclare(queueName1,true,false,false,null);
channel.queueDeclare(queueName2,true,false,false,null);
channel.queueDeclare(queueName3,true,false,false,null); //声明交换机
channel.exchangeDeclare(exchangeName,exchangeType); //队列绑定到交换机并指定rouing_key
channel.queueBind(queueName1,exchangeName,"key1");
channel.queueBind(queueName2,exchangeName,"key2");
channel.queueBind(queueName3,exchangeName,"key1"); for (int i = 0; i < 10; i++) {
String msg="msg"+i;
// 基本发布消息
// 第一个参数为交换机名称、
// 第二个参数为队列映射的路由key、
// 第三个参数为消息的其他属性、
// 第四个参数为发送信息的主体
channel.basicPublish(exchangeName,"key1",null,msg.getBytes());
} channel.close();
connection.close();
}
}

运行后到后台的queue会看到

切换到Exchanges会看到

点击进去

五、主题(topic)交换机

主题交换机的routing_key可以有一定的规则,交换机和队列的routing_key需要采用*.#.*…..的格式

每个部分用.分开

*代表一个单词(不是字符)

#代表任意数量(0或n个)单词

在生产者项目新进topic类

package com.rabbitMQ.routing;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; import java.io.IOException;
import java.util.concurrent.TimeoutException; /**
* @author mowen
* @date 2019/11/20-11:23
*/
public class topic {
public static void main(String[] args) throws IOException, TimeoutException {
String exchangeName="topic";
String exchangeType="topic";
//消息队列名字
String queueName1="topic.queue1";
String queueName2="topic.queue2";
String queueName3="topic.queue3";
//实例连接工厂
ConnectionFactory connectionFactory=new ConnectionFactory();
//设置地址
connectionFactory.setHost("192.168.128.233");
//设置端口
connectionFactory.setPort(5672);
//设置用户名
connectionFactory.setUsername("mowen");
//设置密码
connectionFactory.setPassword("123456");
//获取连接(跟jdbc很像)
Connection connection = connectionFactory.newConnection();
//创建通道
Channel channel = connection.createChannel();
//声明队列。
//参数1:队列名
//参数2:持久化 (true表示是,队列将在服务器重启时依旧存在)
//参数3:独占队列(创建者可以使用的私有队列,断开后自动删除)
//参数4:当所有消费者客户端连接断开时是否自动删除队列
//参数5:队列的其他参数
channel.queueDeclare(queueName1,true,false,false,null);
channel.queueDeclare(queueName2,true,false,false,null);
channel.queueDeclare(queueName3,true,false,false,null); //声明交换机
channel.exchangeDeclare(exchangeName,exchangeType); //队列绑定到交换机并指定rouing_key
channel.queueBind(queueName1,exchangeName,"com.aaa.*");
channel.queueBind(queueName2,exchangeName,"com.*.topic");
channel.queueBind(queueName3,exchangeName,"com.bbb.*"); for (int i = 0; i < 10; i++) {
String msg="msg"+i;
// 基本发布消息
// 第一个参数为交换机名称、
// 第二个参数为队列映射的路由key、
// 第三个参数为消息的其他属性、
// 第四个参数为发送信息的主体
channel.basicPublish(exchangeName,"com.aaa.topic",null,msg.getBytes());
} channel.close();
connection.close();
}
}

运行后,到后台queue会看到

切换到Exchanges会看到

点击进入会看到

java操作RabbitMQ添加队列、消费队列和三个交换机的更多相关文章

  1. EasyNetQ操作RabbitMQ(高级消息队列)

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).写消息队列的时候用RabbitMQ比较好,但是写的时候需要自己封装下,自己的封装,就需要对RabbitM ...

  2. java操作rabbitmq实现简单的消息发送(socket编程的升级)

    准备: 1.下载rabbitmq并搭建环境(和python那篇一样:http://www.cnblogs.com/g177w/p/8176797.html) 2.下载支持的jar包(http://re ...

  3. thinkphp 实现rabbitMq常驻进程消费队列

    1,项目一级目录新建一个server文件 #!/usr/bin/env php <?php try { require __DIR__ . "/start.php"; } c ...

  4. java 操作 RabbitMQ 发送、接受消息

    例子1 Producer.java import java.io.IOException; import java.util.concurrent.TimeoutException; import c ...

  5. java操作xm——添加、修改、删除、遍历

    package com.xml.zh; import javax.xml.parsers.*; import javax.xml.transform.Transformer; import javax ...

  6. java操作pdf添加页眉条码添加水印图片

    添加条码页眉以及图片水印 1. 引入jar包     1. itext-4.2.1.jar     2. itext-asian-5.2.0.jar     3. jbarcode-0.2.8.jar ...

  7. RabbitMQ(二):Java 操作队列

    1. 简单模式 模型: P:消息的生产者 队列:rabbitmq C:消息的消费者 获取 MQ 连接 public static Connection getConnection() throws I ...

  8. Java操作队列

    Java操作队列 常见的几种模式:   1 简单队列simple 模型:(p + 队列 + c) P:生产者producer,将消息发送到队列 红色:消息队列 C:消费者consumer,从队列消费消 ...

  9. java实现rabbitMQ延时队列详解以及spring-rabbit整合教程

    在实际的业务中我们会遇见生产者产生的消息,不立即消费,而是延时一段时间在消费.RabbitMQ本身没有直接支持延迟队列功能,但是我们可以根据其特性Per-Queue Message TTL和 Dead ...

随机推荐

  1. [Luogu3787] 冰精冻西瓜

    题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...

  2. C# 控件 RichTextBox 显示行号,并且与Panel相互联动

    我们在使用到WINFORM窗体工作中,要求RichTextBox 加入行号: 之前有看到大牛们写的,但是太复杂繁多,而且有用双TextBox进行联动,非常不错,今天我们尝试RichTextBox +P ...

  3. Linux下mqttServer搭建

    1.apache-apollo 创建服务 tar -zxvf apache-apollo-1.7-unix-distro.tar.gz cd /home/bk/apache-apollo-/bin . ...

  4. 【OUC2019写作】学术论文写作第九小组第一次博客作业

    个人简介 潘旻琦:我是潘旻琦:我的爱好是游泳:羊肉泡馍是海大食堂中我最喜欢的一道菜(清真食堂):一句想说的话是:“追随本心,坚持不懈”. 郭念帆:我是郭念帆:我的爱好是足球:海大食堂中最喜欢的一道菜偏 ...

  5. Jackson替换fastjson

    为什么要替换fastjson 工程里大量使用了fastjson作为序列化和反序列化框架,甚至ORM在处理部分字段也依赖fastjson进行序列化和反序列化.那么作为大量使用的基础框架,为什么还要进行替 ...

  6. jmeter打印变量的三种方式

    1.使用Debug Sampler 2.使用log打印到jemter日志 3.使用System.out.println打印到cmd命令行

  7. Node.js事件的正确使用方法

    前言 事件驱动的编程变得流行之前,在程序内部进行通信的标准方法非常简单:如果一个组件想要向另外一个发送消息,只是显式地调用了那个组件上的方法.但是在 react 中用的却是事件驱动而不是调用. 事件的 ...

  8. 使用css把placeholder值渐渐消失

    复制过去就行了,不要问我为什么,就两个字爽快input:focus {outline: none; } input:focus::-webkit-input-placeholder {text-ind ...

  9. 云计算 docker 容器部署

    什么是docker容器: 容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出.隔离的环境拥有自己的系统文件,ip地址,主机名等kvm虚拟机,linux,系统文件 容器和虚拟化的区别 : ...

  10. 是可忍孰不可忍!!nodepad++作者台独分子,恶毒言论!!!

    本来用了两年这个软件吧,不带任何情感的,单纯辅助工具.直到今天,在GitHub上,发现了这个作者以及一些同党都是一群尼玛生在中国骂中国的狗币. https://github.com/notepad-p ...