RabbitMQ消息队列入门:发送一条"hello world rabbitmq"消息
RabbitMQ消息队列相当于消息代理人,它必须会把生产消息的那个人的消息带给消息接收者,否则的话这条消息就会一直存在消息队列queue中,等某天消息接受者看到了rabbitmq发送的消息,并确认接收到此条消息之后,queue中的消息才会销毁。
rabbitmq linux版安装教程请看:http://www.tpyyes.com/a/linux/2017/0824/188.html
下面将来学习rabbitmq入门知识,使用rabbitmq发送一条“hello world rabbitmq”消息给接收者,并打印出来,先来简单体验一下rabbitmq。
1:maven引入rabbitmq jar包,如果不是maven项目,则引入amqp-client-4.2.0.jar和slf4j-api-1.7.21.jar这两个jar包。
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>4.2.0</version> </dependency>
2:rabbitmq消息发送端Send.java类代码:
package com.baidu; import java.io.IOException; import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class Send { //队列名称 public final static String QUEUE_NAME = "queue_test1"; public static void main(String[] args) throws Exception { //连接工厂 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("118.78.101.154"); factory.setUsername("guest"); factory.setPassword("guest"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "hello world rabbitmq"; /** * 参数1:exchange交换器,以后会讲到 * 参数2:需要发送到的队列名称 * 参数3:消息配置信息 * 参数4:消息字节数组 */ channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println("消息发送成功!"); //如果不关闭发送端就一直处于运行状态(等待发送消息状态,开发中视情况而定) channel.close(); connection.close(); } }
3:rabbitmq消息接收端Receive.java代码:
package com.baidu; import java.io.IOException; import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Consumer; import com.rabbitmq.client.DefaultConsumer; import com.rabbitmq.client.Envelope; import com.rabbitmq.client.AMQP.BasicProperties; public class Receive { //队列名称 public final static String QUEUE_NAME = "queue_test1"; public static void main(String[] args) throws Exception { //连接工厂 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("118.78.101.154"); factory.setUsername("guest"); factory.setPassword("guest"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println("等待消息发送..."); //使用DefaultConsumer回调来接收发送端的消息 Consumer consumer = new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println("收到queue_test1d队列消息:" + message); } }; /** * 告诉发送者接收到了这条消息 * 参数1:队列名称 * 参数2:为true则表示消息已确认,false则没有确认,以后还会继续发送同样的消息到接收端 * 参数3:消息回调 */ channel.basicConsume(QUEUE_NAME, true, consumer); //关闭之后就不会再接收到发送端的消息了,一般情况下是不关闭的,除非退出程序 //channel.close(); //connection.close(); } }
先运行发送端发送一条消息,再运行接收端,接收端会马上接收到一条“hello world rabbitmq”消息,如果有输入框的话,就类似于qq或微信的功能了。
rabbitmq应用场景:
1:当有大量人秒杀一个商品的时候,返回秒杀是否成功,一般都是过些时间才看得到是否商品秒杀成功,如果都是及时返回秒杀结果的话,由于人数很多,可能webserver服务器压力会剧增从而导致服务器崩溃,因此我们可以先将抢购信息写入rabbitmq消息队列中,当抢购者点击查看结果的时候,再返回秒杀结果,这样由于每个人查看秒杀结果的时间不同,服务器处理的并发就不会那么大了。
2:rabbitmq也具有消息的及时性,当后台修改商品价格的时候,它可以马上通知前台修改商品的价格,当前后台分离开发的时候,rabbitmq是具有消息的解耦性的。
3:rabbitmq可以做及时通讯功能,类似于websocket的功能。