一.订阅模式
1.生产者代码示例
public class publish_subscribe_producer {
// 创建一个名为QUEUE_NAME的队列,防止队列不存在
private final static String QUEUE_NAME = "csl";
// 创建一个交换机
private final static String EXCHANGE_NAME = "testexchange";
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = null;
Channel channel = null;
try {
//获取链接
connection = RabbitMqConfig.devConnectionFactory();
//创建信息管道
channel = connection.createChannel();
//声明队列,如果队列在则什么都不做,如果队列不在创建队列
// 1.队列名 2.是否持久化(开启持久化可以防止重启时数据丢失) 3.是否排外(作用1:当我们连接关闭后是否自动删除队列 作用2:是否私有当前队列,如果私有了,其他通道不可以访问) 4.不再使用是否自动删除 5.其他的属性
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//声明交换机 定义一个交换机,类型为fanout,也就是发布订阅模式
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
for (int i = 0; i < 10; i++) {
Thread.sleep(500);//模拟耗时操作,别发那么快
//自定义消息
String msg = "发布订阅模式" + i;
//发布消息,通过交换器名称进行发布消息,无需指定队列名称
channel.basicPublish(EXCHANGE_NAME,"",null,msg.getBytes());
System.out.println("-->send " + msg);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//关闭管道
channel.close();
//关闭连接
connection.close();
}
}
}
2.消费者1号代码示例
public class publish_subscribe_consumer {
// 创建一个名为QUEUE_NAME的队列,防止队列不存在
private final static String QUEUE_NAME = "csl";
// 创建一个交换机
private final static String EXCHANGE_NAME = "testexchange";
public static void main(String[] args) {
try {
//获取链接
Connection connection = RabbitMqConfig.devConnectionFactory();
//创建信息管道
Channel channel = connection.createChannel();
//声明队列,如果队列在则什么都不做,如果队列不在创建队列
// 1.队列名 2.是否持久化(开启持久化可以防止重启时数据丢失) 3.是否排外(作用1:当我们连接关闭后是否自动删除队列 作用2:是否私有当前队列,如果私有了,其他通道不可以访问) 4.不再使用是否自动删除 5.其他的属性
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//声明交换机 定义一个交换机,类型为fanout,也就是发布订阅模式
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
//定义消费者
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
//获取并转成String
String message = new String(body, "UTF-8");
System.out.println("-->1号消费者收到消息,msg:"+message);
}
};
//监听队列
channel.basicConsume(QUEUE_NAME, true, consumer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.消费者2号代码示例
public class publish_subscribe_consumer2 {
// 创建一个名为QUEUE_NAME的队列,防止队列不存在
private final static String QUEUE_NAME = "csl2";
// 创建一个交换机
private final static String EXCHANGE_NAME = "testexchange";
public static void main(String[] args) {
try {
//获取链接
Connection connection = RabbitMqConfig.devConnectionFactory();
//创建信息管道
Channel channel = connection.createChannel();
//声明队列,如果队列在则什么都不做,如果队列不在创建队列
// 1.队列名 2.是否持久化(开启持久化可以防止重启时数据丢失) 3.是否排外(作用1:当我们连接关闭后是否自动删除队列 作用2:是否私有当前队列,如果私有了,其他通道不可以访问) 4.不再使用是否自动删除 5.其他的属性
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//声明交换机 定义一个交换机,类型为fanout,也就是发布订阅模式
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
//定义消费者
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
//获取并转成String
String message = new String(body, "UTF-8");
System.out.println("-->2号消费者收到消息,msg:"+message);
}
};
//监听队列
channel.basicConsume(QUEUE_NAME, true, consumer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
rabbittemplate convertAndSend源码
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:点播技术架构方案怎么写
下一篇:nginx 的index
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
HashMap源码剖析
本文主要比较了jdk1.7和1.8中HashMap的put逻辑
HashMap 源码 -
【Spring Boot 源码学习】自动装配流程源码解析(上)
本篇从Spring Boot 自动装配源码入手,分析自动配置组件加载的流程
Spring Boot 源码学习 自动装配流程源码 -
rabbitTemplate 延迟
1.为什么需要使用延迟队列?适用于什么场景? 场景一:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单。 这样类似的需求是我们经常会遇见的问题。最常用的方法是定期轮训数据库,设置状态。在数据量小的时候并没有什么大的问题,但是数据量一大轮训数据库的方式就会变得特别耗资源。当面对千万级、上亿级数据量时,本身写入的IO就
rabbitTemplate 延迟 rabbitmq spring 发送消息 System