使用RabbitMQ简单发送接收消息

参考:http://blog.csdn.net/lmj623565791/article/details/37607165

            http://blog.csdn.net/anzhsoft/article/details/19563091

            http://www.rabbitmq.com/tutorials/tutorial-one-java.html

https://www.cnblogs.com/LiangSW/p/6218886.html

https://www.cnblogs.com/piaolingzxh/p/5448927.html

 

 

举个例子,假如你想投递一封邮件,你可以将邮件投递到某个邮箱,然后邮递员从邮箱中获取邮件,并将邮件交付到接收方,在这个过程中,RabbitMQ就 类似于邮箱 、邮局和邮递员,RabbitMQ是一个消息队列,它可以接收程序发送的消息,然后放入到相应的消息队列中,另外一些程序可以从消息队列中获取数据,以此完成程序之间的通信.

下面介绍一些概念:

 

1、生产者

程序中,发送消息的一方称为生产者

 

2、消息队列

用来存储生产者发送的消息

 

 

3、消费者

从消息队列中获取消息的一方称为消费者

 

 

 

 

4、Connection

Connection是一个TCP连接,消费者和生产者通过TCP连接到RabbitMQ server

 

5.Channel

channel建立在Conection之上,因为频繁建立关闭TCP连接会影响到性能,因此使用Channel发送、接收消息

(1)通过channel的queueDeclare()方法可以指定要发送消息/接收消息的队列

queue:队列名称

durable:是否持久化,队列和转发器都有durable属性,默认为false,此时如果rabbitmq重启,队列和转发器都会消失。设置为ture可以幸免于此。

exclusive:是否排外,为true时表示只可以在本次连接中(同一个连接)访问。

autoDelete:是否自动删除,即没有消费者时是否删除转发器

 
  1. /**

  2. * Declare an exchange.

  3. * @see com.rabbitmq.client.AMQP.Exchange.Declare

  4. * @see com.rabbitmq.client.AMQP.Exchange.DeclareOk

  5. * @param exchange the name of the exchange

  6. * @param type the exchange type

  7. * @param durable true if we are declaring a durable exchange (the exchange will survive a server restart)

  8. * @param autoDelete true if the server should delete the exchange when it is no longer in use

  9. * @param arguments other properties (construction arguments) for the exchange

  10. * @return a declaration-confirm method to indicate the exchange was successfully declared

  11. * @throws java.io.IOException if an error is encountered

  12. */

  13. Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,

  14. Map<String, Object> arguments) throws IOException

 

(2)通过channel的basicPublish()方法可以向队列中发送消息

exchange:转发器,可以传入空"",""是默认的转发器

routingKey:路由键,根据路由键转发器决定将消息发送到哪个消费者队列

body:消息的字节形式

其他参数请参考:https://www.cnblogs.com/piaolingzxh/p/5448927.html

 
  1. public void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException {

  2. this.delegate.basicPublish(exchange, routingKey, props, body);

  3. }

  4.  
  5. public void basicPublish(String exchange, String routingKey, boolean mandatory, BasicProperties props, byte[] body) throws IOException {

  6. this.delegate.basicPublish(exchange, routingKey, mandatory, props, body);

  7. }

  8.  
  9. public void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) throws IOException {

  10. this.delegate.basicPublish(exchange, routingKey, mandatory, immediate, props, body);

  11. }

 

6.Exchange

转发器,生产者发送的消息一般不会直接交给消费者队列,而是用转发器作为中转,生产者首先将消息发送到转发器,转发器根据路由规则决定将消息发送到哪个队列。转发器类型有direct、topic、fanout和headers.

下面是一个简单的例子,Sender向消息队列中发送消息,Receiver从消息队列中获取消息,转发器使用空的转发器(默认转发器,direct类型),需要传递队列名称,转发器会把队列名称当做路由键,将消息发送到对应的队列中。

1.创建一个发送者类

 
  1. package com.rabbit.test1;

  2.  
  3. import com.rabbitmq.client.Channel;

  4. import com.rabbitmq.client.Connection;

  5. import com.rabbitmq.client.ConnectionFactory;

  6.  
  7. /**

  8. * RabbitMQ发送消息

  9. * Sender

  10. */

  11. public class Sender {

  12. //队列名称

  13. private final static String QUEUE_NAME = "queue-test";

  14.  
  15. public static void main(String[] argv) throws java.io.IOException {

  16.  
  17. //1.创建一个ConnectionFactory连接工厂connectionFactory

  18. ConnectionFactory connectionFactory = new ConnectionFactory();

  19. //2.通过connectionFactory设置RabbitMQ所在IP等信息

  20. connectionFactory.setHost("localhost");

  21. // connectionFactory.setPort(5762); //指定端口

  22. // connectionFactory.setUsername("admin");//用户名

  23. // connectionFactory.setPassword("admin");//密码

  24. //3.通过connectionFactory创建一个连接connection

  25. Connection connection = connectionFactory.newConnection();

  26. //4.通过connection创建一个频道channel

  27. Channel channel = connection.createChannel();

  28. //5.通过channel指定一个队列

  29. channel.queueDeclare(QUEUE_NAME, false, false, false, null);

  30. //发送的消息

  31. String message = "hello world!";

  32. //6.通过channel向队列中添加消息,第一个参数是转发器,使用空的转发器(默认的转发器,类型是direct)

  33. channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

  34. System.out.println("向" + QUEUE_NAME + "中添加了一条消息:" + message);

  35. //7.关闭频道

  36. channel.close();

  37. //8.关闭连接

  38. connection.close();

  39. }

  40. }

2.接收者

 
  1. package com.rabbit.test1;

  2.  
  3. import com.rabbitmq.client.Channel;

  4. import com.rabbitmq.client.Connection;

  5. import com.rabbitmq.client.ConnectionFactory;

  6. import com.rabbitmq.client.QueueingConsumer;

  7. import com.rabbitmq.client.QueueingConsumer.Delivery;

  8.  
  9. /**

  10. * RabbitMQ接收消息

  11. * Receiver

  12. *

  13. */

  14. public class Receiver {

  15. //队列名称

  16. private final static String QUEUE_NAME = "queue-test";

  17.  
  18. public static void main(String[] argv) throws java.io.IOException, java.lang.InterruptedException {

  19. //1.创建一个ConnectionFactory连接工厂connectionFactory

  20. ConnectionFactory connectionFactory = new ConnectionFactory();

  21. //2.通过connectionFactory设置RabbitMQ所在IP等信息

  22. connectionFactory.setHost("localhost");

  23. //3.通过connectionFactory创建一个连接connection

  24. Connection connection = connectionFactory.newConnection();

  25. //4.通过connection创建一个频道channel

  26. Channel channel = connection.createChannel();

  27. //5.通过channel指定队列

  28. channel.queueDeclare(QUEUE_NAME, false, false, false, null);

  29. //与发送消息不同的地方

  30. //6.创建一个消费者队列consumer,并指定channel

  31. QueueingConsumer consumer = new QueueingConsumer(channel);

  32. //7.为channel指定消费者

  33. channel.basicConsume(QUEUE_NAME, true, consumer);

  34. while (true) {

  35. //从consumer中获取队列中的消息,nextDelivery是一个阻塞方法,如果队列中无内容,则等待

  36. Delivery delivery = consumer.nextDelivery();

  37. String message = new String(delivery.getBody());

  38. System.out.println("接收到了" + QUEUE_NAME + "中的消息:" + message);

  39. }

  40.  
  41. }

  42. }



3.启动Sender,向消息队列中添加信息

 

访问RabbitMQ的管理界面,可以看到自动创建了一个queue-test的队列,并且有一条消息

启动Reciever,可以看到接收者从消息队列中获取了消息并打印在控制台

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值