fanout交换器会把发送给它的所有消息发送给绑定在它上面的队列,起到广播一样的效果。

本里使用实际业务中常见的例子,

订单系统:创建订单,然后发送一个事件消息

积分系统:发送订单的积分奖励

短信平台:发送订单的短信

消息生产者SenderWithFanoutExchange

 package com.yzl.test3;

 import java.util.Date;

 import com.google.gson.Gson;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; /**
* 使用fanout交换器产生事件,消费者订阅事件做相应的处理
* @author: yzl
* @date: 2016-10-22
*/
public class SenderWithFanoutExchange {
//交换器名称
private static final String EXCHANGE_NAME = "myFanoutExchange"; public static void main(String[] args) throws Exception {
//连接到rabbitmq服务器
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
//创建一个信道
final Channel channel = connection.createChannel();
//定义一个名字为topicExchange的fanout类型的exchange
channel.exchangeDeclare(EXCHANGE_NAME, "fanout"); //创建一个时间的Event对象
EventObj createOrderEvent = null;
for(int i=1; i<10; i++){
createOrderEvent = new EventObj();
createOrderEvent.setUserId(Long.valueOf(i));
createOrderEvent.setCreateTime(new Date());
createOrderEvent.setEventType("create_order");
//转成JSON
String msg = new Gson().toJson(createOrderEvent); System.out.println("send msg:" + msg); //使用order_event路由键来发送该事件消息
channel.basicPublish(EXCHANGE_NAME, "order_event", null, msg.getBytes()); Thread.sleep(1000);
} channel.close();
connection.close();
}
}

消费消费者ReceiverWithFanoutExchange

 package com.yzl.test3;

 import java.io.IOException;

 import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties; /**
* 使用fanout交换器接收订单事件消息
*
* @author: yzl
* @date: 2016-10-22
*/
public class ReceiverWithFanoutExchange {
// 交换器名称
private static final String EXCHANGE_NAME = "myFanoutExchange";
//接收订单事件并发放积分的队列
private static final String QUEUE_ORDER_REWARD_POINTS = "rewardOrderPoints";
//发放订单积分的路由键
private static final String ROUTING_KEY_ORDER_POINTS = "reward_order_points";
//接收订单事件并发短信的队列
private static final String QUEUE_ORDER_SEND_SMS = "sendOrderSms";
//发送订单短信的路由键
private static final String ROUTING_KEY_ORDER_SMS = "send_order_sms"; private static Channel channel = null; static{
try{
// 连接到rabbitmq服务器
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
// 创建一个信道
channel = connection.createChannel();
// 定义一个名字为myFanoutExchange的fanout类型的exchange
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
}catch (Exception e) {
// TODO: handle exception
}
} /**
* 发放订单的积分奖励
*/
public static void rewardPoints() throws Exception {
channel.queueDeclare(QUEUE_ORDER_REWARD_POINTS, false, false, false, null);
channel.queueBind(QUEUE_ORDER_REWARD_POINTS, EXCHANGE_NAME, ROUTING_KEY_ORDER_POINTS); channel.basicConsume(QUEUE_ORDER_REWARD_POINTS, true, new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body);
System.out.println("积分系统接收到订单创建的事件消息 :" + msg);
System.out.println("准备发放积分.....");
}
});
} /**
* 发送订单成功的短信
*/
public static void sendSms() throws Exception {
channel.queueDeclare(QUEUE_ORDER_SEND_SMS, false, false, false, null);
channel.queueBind(QUEUE_ORDER_SEND_SMS, EXCHANGE_NAME, ROUTING_KEY_ORDER_SMS); channel.basicConsume(QUEUE_ORDER_REWARD_POINTS, true, new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body);
System.out.println("短信平台接收到订单创建的事件消息 :" + msg);
System.out.println("准备发送短信.....");
}
});
} public static void main(String[] args) throws Exception {
rewardPoints();
sendSms();
}
}

运行结果输出:

 send msg:{"userId":1,"createTime":"Oct 22, 2016 10:54:04 PM","eventType":"create_order"}
send msg:{"userId":2,"createTime":"Oct 22, 2016 10:54:05 PM","eventType":"create_order"}
send msg:{"userId":3,"createTime":"Oct 22, 2016 10:54:06 PM","eventType":"create_order"}
send msg:{"userId":4,"createTime":"Oct 22, 2016 10:54:07 PM","eventType":"create_order"}
send msg:{"userId":5,"createTime":"Oct 22, 2016 10:54:08 PM","eventType":"create_order"}
send msg:{"userId":6,"createTime":"Oct 22, 2016 10:54:09 PM","eventType":"create_order"}
send msg:{"userId":7,"createTime":"Oct 22, 2016 10:54:10 PM","eventType":"create_order"}
send msg:{"userId":8,"createTime":"Oct 22, 2016 10:54:11 PM","eventType":"create_order"}
send msg:{"userId":9,"createTime":"Oct 22, 2016 10:54:12 PM","eventType":"create_order"}
 积分系统接收到订单创建的事件消息 :{"userId":1,"createTime":"Oct 22, 2016 10:54:04 PM","eventType":"create_order"}
准备发放积分.....
短信平台接收到订单创建的事件消息 :{"userId":2,"createTime":"Oct 22, 2016 10:54:05 PM","eventType":"create_order"}
准备发送短信.....
积分系统接收到订单创建的事件消息 :{"userId":3,"createTime":"Oct 22, 2016 10:54:06 PM","eventType":"create_order"}
准备发放积分.....
短信平台接收到订单创建的事件消息 :{"userId":4,"createTime":"Oct 22, 2016 10:54:07 PM","eventType":"create_order"}
准备发送短信.....
积分系统接收到订单创建的事件消息 :{"userId":5,"createTime":"Oct 22, 2016 10:54:08 PM","eventType":"create_order"}
准备发放积分.....
短信平台接收到订单创建的事件消息 :{"userId":6,"createTime":"Oct 22, 2016 10:54:09 PM","eventType":"create_order"}
准备发送短信.....
积分系统接收到订单创建的事件消息 :{"userId":7,"createTime":"Oct 22, 2016 10:54:10 PM","eventType":"create_order"}
准备发放积分.....
短信平台接收到订单创建的事件消息 :{"userId":8,"createTime":"Oct 22, 2016 10:54:11 PM","eventType":"create_order"}
准备发送短信.....
积分系统接收到订单创建的事件消息 :{"userId":9,"createTime":"Oct 22, 2016 10:54:12 PM","eventType":"create_order"}
准备发放积分.....

RabbitMQ学习笔记4-使用fanout交换器的更多相关文章

  1. RabbitMQ学习笔记3-使用topic交换器

    topic的路由规则里使用[.]号分隔单词,使用[*]号匹配1个单词,使用[#]匹配多个.和多个*. 在下面的例子中: logger.*可以匹配logger.error和logger.warning, ...

  2. 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ

    鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...

  3. RabbitMQ学习笔记1-hello world

    安装过程略过,一搜一大把. rabbitmq管理控制台:http://localhost:15672/   默认账户:guest/guest RabbitMQ默认监听端口:5672 JAVA API地 ...

  4. 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群

    在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...

  5. RabbitMQ学习笔记(五) Topic

    更多的问题 Direct Exchange帮助我们解决了分类发布与订阅消息的问题,但是Direct Exchange的问题是,它所使用的routingKey是一个简单字符串,这决定了它只能按照一个条件 ...

  6. (转) Rabbitmq学习笔记

    详见原文: http://blog.csdn.net/shatty/article/details/9529463 Rabbitmq学习笔记

  7. RabbitMQ学习笔记五:RabbitMQ之优先级消息队列

    RabbitMQ优先级队列注意点: 1.只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 2.RabbitMQ3.5以后才支持优先级队列 代码在博客:RabbitMQ学习笔记三:Java ...

  8. 官网英文版学习——RabbitMQ学习笔记(七)Topic

    在上一篇中使用直接交换器改进了我们的系统,使得它能够有选择的进行接收消息,但它仍然有局限性——它不能基于多个条件进行路由.本节我们就进行能够基于多个条件进行路由的topics exchange学习. ...

  9. 官网英文版学习——RabbitMQ学习笔记(五)Publish/Subscribe

    发布/订阅模式:把一个消息发送给多个消费者. 前几篇文章的思想是,我们好像看到了生产者将消息直接发送给queue,然后消费者也从queue中进行消费.其实并非如此,RabbitMQ中的消息传递模型的核 ...

随机推荐

  1. C++堆栈生长方向

    栈区:临时区 #include <iostream> using namespace std; #include <stdio.h> int main() { ; ; cout ...

  2. Windows2008当桌面使用

    因为需要32位系统,又想用8G内存. 一.提高开机速度   0 |" t7 A- d! `- A- R5 | 1.免除登录时按Ctrl+Alt+Del的限制 打开<开始> - & ...

  3. 百度ECHARTS 饼图使用心得 处理data属性

    做过CRM系统的童鞋应该都或多或少接触过hicharts或者echarts等数据统计插件.用过这两款,个人感觉echarts的画面更好看.至于功能,只有适合自己的才是最好的. 今天来说说我使用echa ...

  4. python 多线程编程

    这篇文章写的很棒http://blog.csdn.net/bravezhe/article/details/8585437 使用threading模块实现多线程编程一[综述] Python这门解释性语 ...

  5. Python 输出文字带颜色

    格式:\033[显示方式;前景色;背景色m 说明:前景色            背景色           颜色---------------------------------------30    ...

  6. linux下vi操作出现E325: ATTENTION的解决方法

    #rm  ***.***.swp #rm: remove regular file `.Test.java.swp'? y # OK,完成.再用VI打开就可以了.

  7. 学习WPF——WPF布局——了解布局容器

    WPF布局工作内部原理 WPF渲染布局时主要执行了两个工作:测量和排列 测量阶段,容器遍历所有子元素,并询问子元素所期望的尺寸 排列阶段,容器在合适的位置放置子元素,并设置元素的最终尺寸 这是一个递归 ...

  8. CentOS升级MySQL到5.5

    centOS的yum安装的MySQL是5.1版本,可通过官方的rpm包安装5.5版本 # 查看安装的相关项 rpm -qa|grep -i mysql # 停止服务 service mysqld st ...

  9. [WinAPI] API 12 [获取程序所在的目录、程序模块路径,获取和设置当前目录]

    Windows系统提供一组API实现对程序运行时相关目录的获取和设置.用户可以使用GetCurrentDirectory和SetCurrentDirectory获取程序的当前目录,获取模块的路径使用G ...

  10. tomcat安全配置

    1. 注释或删除 tomcat-users.xml 所有用户权限,看上去如下: <tomcat-users></tomcat-users> 2.  隐藏tomcat版本信息 1 ...