RabbitMQ入门教程:Hello World
Posted lonelyxmas
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ入门教程:Hello World相关的知识,希望对你有一定的参考价值。
- 原文:RabbitMQ入门教程(三):Hello World版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
分享一个朋友的人工智能教程(请以“右键”->"在新标签页中打开连接”的方式访问)。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。
Hello World示例功能简介
功能描述:生产者将消息发送到队列(队列的名字为hello)中,消费者从队列中获取消息。
一:生产者
首先引入RabbitMQ的Java客户端依赖
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.0.0</version> </dependency>
- 1
- 2
- 3
- 4
- 5
@Test public void testBasicPublish() throws IOException, TimeoutException { // 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("127.0.0.1"); factory.setPort(AMQP.PROTOCOL.PORT); // 5672 factory.setUsername("mengday"); factory.setPassword("mengday"); // 新建一个长连接 Connection connection = factory.newConnection(); // 创建一个通道(一个轻量级的连接) Channel channel = connection.createChannel(); // 声明一个队列 String QUEUE_NAME = "heelo"; channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 发送消息到队列中 String message = "Hello RabbitMQ!"; // 注意:exchange如果不需要写成空字符串,routingKey和队列名称保持一致 channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8")); System.out.println("Producer Send a message:" + message); // 关闭资源 channel.close(); connection.close(); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
二:消费者
@Test public void testBasicConsumer() throws Exception{ ConnectionFactory factory = new ConnectionFactory(); factory.setHost("127.0.0.1"); factory.setPort(AMQP.PROTOCOL.PORT); // 5672 factory.setUsername("mengday"); factory.setPassword("mengday"); // 新建一个长连接 Connection connection = factory.newConnection(); // 创建一个通道(一个轻量级的连接) Channel channel = connection.createChannel(); // 声明一个队列 String QUEUE_NAME = "hello"; channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println("Consumer Wating Receive Message"); Consumer consumer = new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println(" [C] Received ‘" + message + "‘"); } }; // 订阅消息 channel.basicConsume(QUEUE_NAME, true, consumer); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
三:运行结果
-
运行发布消息的方法,可以看到在RabbitMQ Management —> Queues 中会有自己声明的队列,Total代表消息的总条数,现在有1条消息
-
运行消费者,消费者获取到了一条消息,并且RabbitMQ Management中的对应的队列的消息总条数为0
四: Hello World示例解释
-
关于用户名和密码:用户名和密码可以在RabbitMQ Management平台上的Admin菜单下创建,也可以通过rabbitmqctl命令行来创建
-
关于队列声明queueDeclare的参数:第一个参数表示队列名称、第二个参数为是否持久化(true表示是,队列将在服务器重启时生存)、第三个参数为是否是独占队列(创建者可以使用的私有队列,断开后自动删除)、第四个参数为当所有消费者客户端连接断开时是否自动删除队列、第五个参数为队列的其他参数
-
关于basicConsume的第二个参数autoAck: 应答模式,true:自动应答,即消费者获取到消息,该消息就会从队列中删除掉,false:手动应答,当从队列中取出消息后,需要程序员手动调用方法应答,如果没有应答,该消息还会再放进队列中,就会出现该消息一直没有被消费掉的现象
-
系统会为每个队列都隐式的绑定一个默认的交换机,交换机的名称为“(AMQP default)",类型为直连接direct,当你手动创建一个队列时,后台会自动将这个队列绑定到一个名称为空的Direct类型交换机上,绑定路由名称与队列名称相同,相当于channel.queueBind(queue:“QUEUE_NAME”, exchange:"(AMQP default)", routingKey:“QUEUE_NAME”); 所以hello world示例虽然没有显示声明交换机,当路由键和队列名称一样时就将消息发送到这个默认的交换机里。有了这个默认的交换机和绑定,我们就可以像其他轻量级的队列,如Redis那样,直接操作队列来处理消息。不过理论上是可以的,但实际上在RabbitMQ里直接操作是不可取的。消息始终都是先发送到交换机,由交换级经过路由传送给队列,消费者再从队列中获取消息的。不过由于这个默认交换机和路由的关系,使我们只关心队列这一层即可,这个比较适合做一些简单的应用,毕竟没有发挥RabbitMQ的最大功能(RabbitMQ可以重量级消息队列),如果都用这种方式去使用的话就真是杀鸡用宰牛刀了。
The default exchange is implicitly bound to every queue, with a routing key equal to the queue name. It is not possible to explicitly bind to, or unbind from the default exchange. It also cannot be deleted.默认交换机隐式绑定到每个队列,其中路由键等于队列名称。不可能显式绑定到,或从缺省交换中解除绑定。它也不能被删除。
分享一个朋友的人工智能教程(请以“右键”->"在新标签页中打开连接”的方式访问)。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。
我的微信公众号: