RabbitMQ的五种队列模式与实例

3.1 简单模式Hello World

简单模式Hello World

功能:一个生产者P发送消息到队列Q,一个消费者C接收

生产者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel向队列中发送消息,关闭通道和连接。

生产者实现思路

package com.jt.rabbitmq;
/**
* RabbitMQ的五种队列模式——简单模式
*/
import org.junit.Test;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Test_1_simple_provider {
@Test
public void  provider()throws Exception {
//1,建立连接
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
Connection connection = factory.newConnection();
//2.建立通道
Channel channel = connection.createChannel();
//3.定义队列
//durable true 持久化,重启服务器后,数据还有
//exclusive true,只能通过当前连接消费 false
//autoDelete true 队列中消息处理完后,自动删除队列
//arguments 参数
channel.queueDeclare("order",true,false,false,null);
//4,发送消息,routingKey必须与queue一致
String msg ="msg1";
channel.basicPublish("", "order", null, msg.getBytes());
//5.关闭
channel.close();
connection.close();
System.out.println("发送数据成功");
}
}

消费者实现思路

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue, 创建消费者并监听队列,从队列中读取消息。

消费者实现思路
 

package com.jt.rabbitmq;
/**
* RabbitMQ的五种队列模式——简单模式
*/
import org.junit.Test;
import  com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class Test_1_simole_consumer {
@Test
public void sonsumer() throws  Exception{
//1、创建链接工厂
ConnectionFactory factory = new  ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
//创建连接
Connection connection =  factory.newConnection();
//2,创建通道
Channel channel =  connection.createChannel();
//3.声明队列
channel.queueDeclare("order",true,false,false,null);
//4.创建(排队的消费者)
QueueingConsumer consumer = new  QueueingConsumer(channel);
//1,p2:autoack 消费者取到消息, 自动确认,确认后,服务器会把消息
//2,从消息队列服务器上取order队列的数据
//3,自动确认,服务器就删除消息3,把得到消息交给第三个参数consumer处理
//basicConsume:基本消费者
channel.basicConsume("order",  true,consumer);
//5.取消息
ring);
}
}
while(true) {
//Delivery:交付
Delivery delivery =  consumer.nextDelivery();
byte [] data = delivery.getBody();
String mString = new String(data);
System.out.println("消费者读取到:"+mSt
}

3.2 工作队列模式Work Queue

工作队列模式Work Queue

功能:一个生产者,多个消费者,每个消费者获取到的消息唯一,多个消费者只有一个队列

任务队列:避免立即做一个资源密集型任务,必须等待它完成,而是把这个任务安排到稍后再做。我们将任务封装为消息并将其发送给队列。后台运行的工作进程将弹出任务并最终执行作业。当有多个worker同时运行时,任务将在它们之间共享。

生产者实现思路

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel向队列中发送消息,2条消息之间间隔一定时间,关闭通道和连接。

生产者实现思路

package com.jt.rabbitmq;
import org.junit.Test;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* RabbitMQ的五种队列模式——工作队列模式——生产者
*/
public class Test_2_work_provider {
@Test
public void  provider()throws Exception {
//1,建立连接
ConnectionFactory factory = new  ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
Connection connection =  factory.newConnection();
//2.建立通道
Channel channel =  connection.createChannel();
//定义交换机
String exchangName = "E1";
//fanout:订阅模式
//direct:路由模式
//topic :主题模式
channel.exchangeDeclare(exchangName,  "fanout");
//3.定义队列
//channel.queueDeclare("order",true,false,false,null);
//4,发送消息,routingKey必须与queue一致
String msg ="msg1";
channel.basicPublish(exchangName,  "order", null, msg.getBytes());
//5.关闭
channel.close();
connection.close();
System.out.println("发送数据成功");
}
}

消费者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,创建消费者C1并监听队列,获取消息并暂停10ms,另外一个消费者C2暂停1000ms,由于消费者C1消费速度快,所以C1可以执行更多的任务。

消费者实1现思路

package com.jt.rabbitmq;
/**
* RabbitMQ的五种队列模式——工作队列模式——消费者1
*/
import org.junit.Test;
import  com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class Test_2_work_consumer1 {
@Test
public void sonsumer() throws  Exception{
//1、创建链接工厂
ConnectionFactory factory = new  ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
//创建连接
Connection connection =  factory.newConnection();
//2,创建通道
Channel channel =  connection.createChannel();
//3.声明队列
channel.queueDeclare("order",true,false,false,null);
//4.创建(排队的消费者)
QueueingConsumer consumer = new  QueueingConsumer(channel);
//1,p2:autoack 消费者取到消息, 自动确认,确认后,服务器会把消息
//2,从消息队列服务器上取order队列的数据
//3,自动确认,服务器就删除消息3,把得到消息交给第三个参数consumer处理
//basicConsume:基本消费者
channel.basicConsume("order",  true,consumer);
System.out.println("消费者1已启动");
//5.取消息
while(true) {
//Delivery:交付
Delivery delivery =  consumer.nextDelivery();
byte [] data = delivery.getBody();
String mString = new String(data);
System.out.println("消费者1读取到:"+mString);
}
}
}

消费者实2现思路

package com.jt.rabbitmq;
/**
* RabbitMQ的五种队列模式——工作队列模式——消费者2
*/
import org.junit.Test;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class Test_2_work_consumer2 {
@Test
public void sonsumer() throws  Exception{
//1、创建链接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
//创建连接
Connection connection = factory.newConnection();
//2,创建通道
Channel channel = connection.createChannel();
//3.声明队列
channel.queueDeclare("order",true,false,false,null);
//4.创建(排队的消费者)
QueueingConsumer consumer = new QueueingConsumer(channel);
//1,p2:autoack 消费者取到消息, 自动确认,确认后,服务器会把消息
//2,从消息队列服务器上取order队列的数据
//3,自动确认,服务器就删除消息3,把得到消息交给第三个参数consumer处理
//basicConsume:基本消费者
channel.basicConsume("order", true,consumer);
System.out.println("消费者2已启动");
//5.取消息
while(true) {
//Delivery:交付
Delivery delivery = consumer.nextDelivery();
byte [] data = delivery.getBody();
String mString = new String(data);
System.out.println("消费者2读取到:"+mString);
}
}
}

3.3发布/订阅模式 Publish/Subscribe

发布/订阅模式 Publish/Subscribe

功能:一个生产者发送的消息会被多个消费者获取。一个生产者、一个交换机、多个队列、多个消费者

生产者:可以将消息发送到队列或者是交换机。

消费者:只能从队列中获取消息。

如果消息发送到没有队列绑定的交换机上,那么消息将丢失。

交换机不能存储消息,消息存储在队列中

生产者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel创建交换机并指定交换机类型为fanout,使用通道向交换机发送消息,关闭通道和连接。

生产者实现思路

package com.jt.rabbitmq;
import org.junit.Test;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* RabbitMQ的五种队列模式——订阅模式——生产者
* @author Administrator
*
*/
public class Test_3_publish_provider {
@Test
public void  provider()throws Exception {
//1,建立连接
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
Connection connection = factory.newConnection();
//2.建立通道
Channel channel = connection.createChannel();
//3.定义交换机名称
String exchange_name="E1";
//4.fanout是定义发布订阅模式  direct是 路由模式 topic是主题模式
channel.exchangeDeclare(exchange_name, "fanout");
//4,发送消息,routingKey必须与queue一致
String msg ="msg1";
channel.basicPublish(exchange_name, "", null, msg.getBytes());
//5.关闭
channel.close();
connection.close();
}
}

消费者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,绑定队列到交换机,设置Qos=1,创建消费者并监听队列,使用手动方式返回完成。可以有多个队列绑定到交换机,多个消费者进行监听。

消费者1实现思路

package com.jt.rabbitmq;
/**
* RabbitMQ的五种队列模式——订阅模式——消费者1
*/
import java.util.UUID;
import org.junit.Test;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class Test_3_publish_consumer1 {
@Test
public void sonsumer() throws  Exception{
//1、创建链接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
//创建连接
Connection connection = factory.newConnection();
//2,创建通道
Channel channel = connection.createChannel();
//3定义交换机模式
String exchange_name="E1";
channel.exchangeDeclare(exchange_name, "fanout");
String queue_name = UUID.randomUUID().toString();
//4.声明队列
channel.queueDeclare(queue_name,true,false,false,null);
//5将队列和交换机绑定   key:表示接收数据标识
channel.queueBind(queue_name, exchange_name, "");
//6.定义消费数量
channel.basicQos(1);
//7.创建(排队的消费者)
QueueingConsumer consumer = new QueueingConsumer(channel);
//8.将消费者和队列绑定,并且需要手动返回
channel.basicConsume(queue_name, false,consumer);
System.out.println("消费者1已启动");
//9.取消息
while(true) {
//Delivery:交付
Delivery delivery = consumer.nextDelivery();
byte [] data = delivery.getBody();
String mString = new String(data);
System.out.println("消费者1"+mString+"收到");
//false表示一个个返回值
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}

消费者2实现思路

package com.jt.rabbitmq;
/**
* RabbitMQ的五种队列模式——订阅模式——消费者2
*
* publish:出版
*/
import java.util.UUID;
import org.junit.Test;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class Test_3_publish_consumer2 {
@Test
public void sonsumer() throws  Exception{
//1、创建链接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
//创建连接
Connection connection = factory.newConnection();
//2,创建通道
Channel channel = connection.createChannel();
//3定义交换机模式
String exchange_name="E1";
channel.exchangeDeclare(exchange_name, "fanout");
String queue_name = UUID.randomUUID().toString();
//4.声明队列
channel.queueDeclare(queue_name,true,false,false,null);
//5将队列和交换机绑定   key:表示接收数据标识
channel.queueBind(queue_name, exchange_name, "");
//6.定义消费数量
channel.basicQos(1);
//7.创建(排队的消费者)
QueueingConsumer consumer = new QueueingConsumer(channel);
//8.将消费者和队列绑定,并且需要手动返回
channel.basicConsume(queue_name, false,consumer);
System.out.println("消费者2已启动");
//9.取消息
while(true) {
//Delivery:交付
Delivery delivery = consumer.nextDelivery();
byte [] data = delivery.getBody();
String mString = new String(data);
System.out.println("消费者2"+mString+"收到");
//false表示一个个返回值
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}

3.4路由模式Routing

路由模式Routing

说明:生产者发送消息到交换机并且要指定路由key,消费者将队列绑定到交换机时需要指定路由key

生产者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel创建交换机并指定交换机类型为direct,使用通道向交换机发送消息并指定key=b,关闭通道和连接。

生产者实现思路

package com.jt.rabbitmq;
import org.junit.Test;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* RabbitMQ的五种队列模式——路由模式——生产者
*
* 使用通道向交换机发送消息并指定key="agent",
* 那么消费者将队列和交换机绑定标识符为key="agent"才能接受到消息
* @author Administrator
*
*/
public class Test_4_direct_provider {
@Test
public void  provider()throws Exception {
//1,建立连接
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
Connection connection = factory.newConnection();
//2.建立通道
Channel channel = connection.createChannel();
//3.定义交换机名称
String exchange_name="E2";
//4.fanout是定义发布订阅模式  direct是 路由模式 topic是主题模式
channel.exchangeDeclare(exchange_name, "direct");
//4,使用通道向交换机发送消息并指定key="agent"
String msg ="msg1";
channel.basicPublish(exchange_name, "agent", null, msg.getBytes());
//5.关闭
channel.close();
connection.close();
}
}

消费者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,绑定队列到交换机,设置Qos=1,创建消费者并监听队列,使用手动方式返回完成。可以有多个队列绑定到交换机,但只要绑定key=b的队列key接收到消息,多个消费者进行监听。

消费者1实现思路

package com.jt.rabbitmq;
/**
* RabbitMQ的五种队列模式——路由模式——消费者1
*/
import java.util.UUID;
import org.junit.Test;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class Test_4_direct_consumer1 {
@Test
public void sonsumer() throws  Exception{
//1、创建链接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
//创建连接
Connection connection = factory.newConnection();
//2,创建通道
Channel channel = connection.createChannel();
//3定义交换机模式
String exchange_name="E2";
channel.exchangeDeclare(exchange_name, "direct");
//4.声明队列
String queue_name = UUID.randomUUID().toString();
channel.queueDeclare(queue_name,true,false,false,null);
//5将队列和交换机绑定   key:表示接收数据标识
channel.queueBind(queue_name, exchange_name, "agent");
//6.同一时刻服务器只会发一条消息給消費者
channel.basicQos(1);
//7.定义队列的消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
//8.监听队列,手动返回完成
channel.basicConsume(queue_name, false,consumer);
System.out.println("消费者1已启动");
//9.取消息
while(true) {
//Delivery:交付
Delivery delivery = consumer.nextDelivery();
byte [] data = delivery.getBody();
String mString = new String(data);
System.out.println("消费者1"+mString+"海外代购");
//false表示一个个返回值
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}

消费者2实现思路

package com.jt.rabbitmq;
/**
* RabbitMQ的五种队列模式——路由模式——消费者2
*/
import java.util.UUID;
import org.junit.Test;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class Test_4_direct_consumer2 {
@Test
public void sonsumer() throws  Exception{
//1、创建链接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
//创建连接
Connection connection = factory.newConnection();
//2,创建通道
Channel channel = connection.createChannel();
//3定义交换机模式
String exchange_name="E2";
channel.exchangeDeclare(exchange_name, "direct");
String queue_name = UUID.randomUUID().toString();
//4.声明队列
channel.queueDeclare(queue_name,true,false,false,null);
//5将队列和交换机绑定   key:表示接收数据标识
channel.queueBind(queue_name, exchange_name, "domestic");
//6.定义消费数量
channel.basicQos(1);
//7.创建(排队的消费者)
QueueingConsumer consumer = new QueueingConsumer(channel);
//8.将消费者和队列绑定,并且需要手动返回
channel.basicConsume(queue_name, false,consumer);
System.out.println("消费者2已启动");
//9.取消息
while(true) {
//Delivery:交付
Delivery delivery = consumer.nextDelivery();
byte [] data = delivery.getBody();
String mString = new String(data);
System.out.println("消费者2"+mString+"国内购");
//false表示一个个返回值
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}

3.5通配符模式Topic

通配符模式Topic

说明:生产者P发送消息到交换机X,type=topic,交换机根据绑定队列的routing key的值进行通配符匹配;

符号#:匹配一个或者多个词 lazy.# 可以匹配 lazy.irs或者lazy.irs.cor

符号*:只能匹配一个词 lazy.* 可以匹配 lazy.irs或者lazy.cor

生产者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel创建交换机并指定交换机类型为topic,使用通道向交换机发送消息并指定key=key.1,关闭通道和连接。

生产者实现思路

package com.jt.rabbitmq;
import org.junit.Test;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* RabbitMQ的五种队列模式——通配符模式——生产者
* @author Administrator
* 说明:生产者P发送消息到交换机X,type=topic,交换机根据绑定队列的routing key的值进行通配符匹配;
* 符号#:匹配一个或者多个词 lazy.# 可以匹配 lazy.irs或者lazy.irs.cor
* 符号*:只能匹配一个词 lazy.* 可以匹配 lazy.irs或者lazy.cor
*
*/
public class Test_5_topic_provider {
@Test
public void  provider()throws Exception {
//1,建立连接
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
Connection connection = factory.newConnection();
//2.建立通道
Channel channel = connection.createChannel();
//3.定义交换机名称
String exchange_name="E3";
//4.fanout是定义发布订阅模式  direct是 路由模式 topic是主题模式
channel.exchangeDeclare(exchange_name, "topic");
//4,使用通道向交换机发送消息并指定key="agent"
String msg ="msg1";
channel.basicPublish(exchange_name, "agent.order", null, msg.getBytes());
//5.关闭
channel.close();
connection.close();
}
}

消费者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,绑定队列到交换机,设置Qos=1,创建消费者并监听队列,使用手动方式返回完成。可以有多个队列绑定到交换机,凡是绑定规则符合通配符规则的队列均可以接收到消息,比如key.*,key.#,多个消费者进行监听。

消费者1实现思路

package com.jt.rabbitmq;
/**
* RabbitMQ的五种队列模式——通配符模式——消费者1
*/
import java.util.UUID;
import org.junit.Test;
import  com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class Test_5_topic_consumer1 {
@Test
public void sonsumer() throws  Exception{
//1、创建链接工厂
ConnectionFactory factory = new  ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
//创建连接
Connection connection =  factory.newConnection();
//2,创建通道
Channel channel =  connection.createChannel();
//3定义交换机模式
String exchange_name="E3";
channel.exchangeDeclare(exchange_name,  "topic");
//4.声明队列
String queue_name =  UUID.randomUUID().toString();
channel.queueDeclare(queue_name,true,false,false,null);
//5将队列和交换机绑定   key:表示接收数据标识
channel.queueBind(queue_name,  exchange_name, "agent.*");
//6.同一时刻服务器只会发一条消息給消費者
channel.basicQos(1);
//7.定义队列的消费者
QueueingConsumer consumer = new  QueueingConsumer(channel);
//8.监听队列,手动返回完成
channel.basicConsume(queue_name,  false,consumer);
System.out.println("消费者1已启动");
//9.取消息
while(true) {
//Delivery:交付
Delivery delivery =  consumer.nextDelivery();
byte [] data = delivery.getBody();
String mString = new String(data);
System.out.println("消费者1"+mString+"海外代购");
//false表示一个个返回值
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}

消费者2实现思路

package com.jt.rabbitmq;
/**
* RabbitMQ的五种队列模式——通配符模式——消费者1
*/
import java.util.UUID;
import org.junit.Test;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class Test_5_topic_consumer2 {
@Test
public void sonsumer() throws  Exception{
//1、创建链接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.228.132");
factory.setPort(5672);
factory.setUsername("jtadmin");
factory.setPassword("jtadmin");
factory.setVirtualHost("/jt");
//创建连接
Connection connection = factory.newConnection();
//2,创建通道
Channel channel = connection.createChannel();
//3定义交换机模式
String exchange_name="E3";
channel.exchangeDeclare(exchange_name, "topic");
//4.声明队列
String queue_name = UUID.randomUUID().toString();
channel.queueDeclare(queue_name,true,false,false,null);
//5将队列和交换机绑定   key:表示接收数据标识
channel.queueBind(queue_name, exchange_name, "domestic.*");
//6.同一时刻服务器只会发一条消息給消費者
channel.basicQos(1);
//7.定义队列的消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
//8.监听队列,手动返回完成
channel.basicConsume(queue_name, false,consumer);
System.out.println("消费者2已启动");
//9.取消息
while(true) {
//Delivery:交付
Delivery delivery = consumer.nextDelivery();
byte [] data = delivery.getBody();
String mString = new String(data);
System.out.println("消费者2"+mString+"国内购");
//false表示一个个返回值
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}

4.Spring集成RabbitMQ配置

Spring提供了AMQP的一个实现,并且spring-rabbit是RabbitMQ的一个实现,下面给出订阅者模式的事例配置如下:

 Spring集成RabbitMQ配置

5.总结

RabbitMQ提供6种模式,分别是Hello,Work Queue,Publish/Subscribe,Routing,Topics,RPC Request/reply,本文详细讲述了前5种,并给出代码实现和思路。其中Publish/Subscribe,Routing,Topics三种模式可以统一归为Exchange模式,只是创建时交换机的类型不一样,分别是fanout、direct、topic。Spring提供了rabbitmq的一个实现,所以集成起来很方便,本文第4章给出了订阅者模式的一种spring配置。

本订阅号提供Java相关技术分享,从Java编程基础到Java高级技术,从JavaWeb技术基础Jsp、Servlet、>JDBC到SSH、SSM开发框架,从REST风格接口设计到分布式项目实战。剖析主流开源技术框架,用亲身

实践来谱写深度Java技术日志。


作者:Darren

QQ:603026148

以上内容归Darren所有,如果有什么错误或者不足的地方请联系我,希望我们共同进步。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从码农到码到成功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值