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的功能。