RabbitMQ 之Hello World
rabbitMQ作为一个消息服务中间件负责接受消息和转发,下面给出一个简单的例子用来说明这种工作方式。
一个简单的实现主要包含3种角色生产者(Producing),消息队列(queue),消费者(consuming)。当然rabbitMQ的核心并不在于此,rabbitMQ核心主要包含Exchange、queue和binging。消息持久化操作也是通过这两个核心来完成的。后面文章会有详细说明,现在先看一下简单的消息队列实现的例子。
生产者 Send.java
importcom.rabbitmq.client.Channel;
importcom.rabbitmq.client.Connection;
importcom.rabbitmq.client.ConnectionFactory;
publicclassSend {
//消息队列名称
privatefinalstatic String QUEUE_NAME="hello";
publicstaticvoid main(String[] args) throwsjava.io.IOException{
//创建链接工程
ConnectionFactory factory = newConnectionFactory();
factory.setHost("localhost");
//创建链接
Connection connection = factory.newConnection();
//创建消息通道
Channel channel = connection.createChannel();
//生命一个消息队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
String message = "Hello World";
//发布消息,第一个参数表示路由(Exchange名称),未""则表示使用默认消息路由
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '"+message+"'");
//关闭消息通道和链接
channel.close();
connection.close();
}
}
消费者Recv.java
importcom.rabbitmq.client.Channel;
importcom.rabbitmq.client.Connection;
importcom.rabbitmq.client.ConnectionFactory;
importcom.rabbitmq.client.QueueingConsumer;
publicclassRecv {
//消息队列名称
privatefinalstatic String QUEUE_NAME="hello";
publicstaticvoid main(String[] args) throwsjava.io.IOException,java.lang.InterruptedException{
//创建链接工厂
ConnectionFactory factory = newConnectionFactory();
factory.setHost("localhost");
//创建链接
Connection connection = factory.newConnection();
//创建消息信道
Channel channel = connection.createChannel();
//生命消息队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
System.out.println("[*] Waiting for message. To exist press CTRL+C");
//消费者用于获取消息信道绑定的消息队列中的信息
QueueingConsumer consumer = newQueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME,true,consumer);
while(true){
//循环获取消息队列中的信息
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = newString(delivery.getBody());
System.out.println("[x] Received '"+message+"'");
}
}
}
首先运行Send.java 发送消息到服务器中,再运行Recv.java即可获得消息队列中的信息。
这里并没有做消息的持久化操作,由于某些原因在程序运行过程中可能出现服务器宕机,以及其他外在因素使程序运行出现出错,消息的持久化就是使服务器即使停止后下一次启动依然能保持上一次操作消息队列的状态。可以保证程序依然能从异常开始的地方重新执行。也就是为什么要对消息进行持久化的主要原因。