RabbitMQ:四种ExChange用法

RabbitMQ发送消息时,都是先把消息发送给ExChange(交换机),然后再分发给有相应RoutingKey(路由)关系的Queue(队列)。
ExChange和Queue之前是多对多的关系。
RabbitMQ 3.0之后创建ExChange时,有四种类型可选“fanout、direct、topic、headers”。

一、fanout
当向一个fanout发送一个消息时,RoutingKey的设置不起作用。
消息会被发送给同一个交换机下的所有队列,每个队列接收到的消息是一样的;
一个队列内有所有消费者(包含那些并没有相应RoutingKey的 消费者 ),将平分队列接收到的消息

----------------消息生产者----------------
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(S_RabbitMQ.QUEUE_IP);// MQ主机
factory.setPort(S_RabbitMQ.QUEUE_PORT);// MQ端口
factory.setUsername(S_RabbitMQ.QUEUE_USER);// MQ用户名
factory.setPassword(S_RabbitMQ.QUEUE_PWD);// MQ密码

Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

// 声明路由名字和类型
channel.exchangeDeclare(EXCHANGE_NAME, "fanout", true, false, null);
String message = "hello world! ";

for(int i=0;i<100;i++)
{
channel.basicPublish(EXCHANGE_NAME, "", null, (message+i).getBytes());
}

System.out.println("Sent msg finish");

channel.close();
connection.close();

----------------消息消费者 ----------------
ConnectionFactory factory = new ConnectionFactory();

factory.setHost(S_RabbitMQ.QUEUE_IP);// MQ主机
factory.setPort(S_RabbitMQ.QUEUE_PORT);// MQ端口
factory.setUsername(S_RabbitMQ.QUEUE_USER);// MQ用户名
factory.setPassword(S_RabbitMQ.QUEUE_PWD);// MQ密码

Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

//声明路由名字和类型
channel.exchangeDeclare(EXCHANGE_NAME, "fanout", true, false, null);
// 声明 队列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//绑定路由和队列
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "routkey2", null);

System.out.println(" Waiting for msg....");
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,   AMQP.BasicProperties properties, byte[] body) {
String message = "";
try
{
message = new String(body, "UTF-8");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (Throwable ex)
{
ex.printStackTrace();
}

System.out.println("Received msg='" + message + "'");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);

二、direct
当向一个direct发送一个消息时, 消息会被发送给同一个交换机下的 拥有相应RoutingKey的队列, 每个队列接收到的消息是一样的;
一个队列内拥有相应RoutingKey的消费者,将平分队列接收到的消息。

----------------消息生产者 ----------------
ConnectionFactory factory = new ConnectionFactory();

factory.setHost(S_RabbitMQ.QUEUE_IP);// MQ主机
factory.setPort(S_RabbitMQ.QUEUE_PORT);// MQ端口
factory.setUsername(S_RabbitMQ.QUEUE_USER);// MQ用户名
factory.setPassword(S_RabbitMQ.QUEUE_PWD);// MQ密码

Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

// 声明路由名字和类型
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);
String message = "hello world! ";

for(int i=0;i<100;i++)
{
channel.basicPublish(EXCHANGE_NAME, "routingkey1", null, (message+i).getBytes());
}

System.out.println("Sent msg is '" + message + "'");

channel.close();
connection.close();

----------------消息消费者 ----------------
ConnectionFactory factory = new ConnectionFactory();

factory.setHost(S_RabbitMQ.QUEUE_IP);// MQ主机
factory.setPort(S_RabbitMQ.QUEUE_PORT);// MQ端口
factory.setUsername(S_RabbitMQ.QUEUE_USER);// MQ用户名
factory.setPassword(S_RabbitMQ.QUEUE_PWD);// MQ密码

Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

//声明路由名字和类型
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);
//声明队列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//绑定路由和队列
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "routingkey1", null);

System.out.println(" Waiting for msg....");
Consumer consumer = new DefaultConsumer(channel)
{
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body)
{
String message = "";
try
{
message = new String(body, "UTF-8");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (Throwable ex)
{
ex.printStackTrace();
}

System.out.println("1 Received msg='" + message + "'");
}
};

channel.basicConsume(QUEUE_NAME, true, consumer);


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
rabbitmq_delayed_message_exchangeRabbitMQ的一个插件,它提供了延迟消息交换的功能。延迟消息交换可以将消息存储在队列中并在一定的延迟时间后才将其传递给消费者。 这个插件在RabbitMQ 3.9.0版本中被引入,并提供了更好的延迟消息处理能力。以前的版本中,要实现延迟消息功能需要使用其他的方法,如安装额外的插件或使用ttl和死信队列进行处理。 使用rabbitmq_delayed_message_exchange插件,可以更加方便地实现延迟消息功能。只需要在RabbitMQ服务器上安装并启用该插件,就可以创建延迟消息交换,并将消息发送到指定的延迟队列。消息将在指定的延迟时间后自动传递给绑定在延迟队列上的消费者。 这个网盘是供用户上传和下载文件的在线存储服务。使用rabbitmq_delayed_message_exchange插件可以改善网盘的消息通知和处理机制。例如,当用户上传文件后,可以将上传成功的通知消息发送到延迟队列,然后通过延迟消息交换将消息延迟一定的时间后发送给用户。这样可以给用户一定的时间来做其他的操作,比如等待文件的生成或处理完成。同时,也可以根据网盘系统的需要,设置不同的延迟时间来进行适应。 总之,rabbitmq_delayed_message_exchange插件在RabbitMQ 3.9.0版本中提供了更加方便和灵活的延迟消息处理功能,可以应用于各种场景,包括网盘服务的消息通知和处理机制。它可以提高系统的吞吐量和性能,并为用户提供更好的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值