RabbitMQ是一种应用程序对应用程序的通信方法,是bla...bla...bla...嗯,既然这么牛X,那就在win7环境先实验一下吧!
第一步:
不同于ActiveMQ,rabbitMQ是用Erlang编写的,所以需要先安装Erlang环境,我的版本是erl9.0,官网:http://www.erlang.org并用类似安装jkd的方式配置环境变量;
安装RabbitMQ,我的版本是rabbitmq_server-3.6.11,官网:http://www.rabbitmq.com/download.html同样类似安装jdk的方式配置Erlang环境;
但是在执行rabbitmq-server.bat的时候黑框闪了一下,报了Error,于是换一条路:
点击所有程序中:
输入rabbitmq-plugins enable rabbitmq_management
浏览器访问 http://localhost:15672 用户名密码都是guest
环境准备就绪
第二步:
新建java项目,导入amqp-client-3.6.1.jar;
消息生产者:
package com.cn.two;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Producer {
private final static String QUEUE_NAME = "HelloWorld";
public static void main(String[] args) throws Exception {
//1.创建连接工厂,并设置链接地址
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
//2.创建连接
Connection connection = factory.newConnection();
//3.创建频道
Channel channel = connection.createChannel();
//4.队列声明,参数意义分别是 队列名称;是否持久化;是否独占queue(是否仅供此连接使用);不使用时是否自动删除;其他
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//5.创建消息
String message = "";
for(int i = 0; i < 5; i++){
message = "hello " + i;
System.out.println("message is " + message);
//6.发布消息
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
}
//7.关闭资源
channel.close();
connection.close();
}
}
运行之后查看http://127.0.0.1:15672 发现已产生五条消息
第三步:
消息消费者:
package com.cn.two;
import java.io.IOException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class Consumer {
private final static String QUEUE_NAME = "HelloWorld";
public static void main(String[] args) throws Exception {
//前四步不变:
//1.创建连接工厂,并设置链接地址
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
//2.创建连接
Connection connection = factory.newConnection();
//3.创建频道
Channel channel = connection.createChannel();
//4.队列声明,参数意义分别是 队列名称;是否持久化;是否独占queue(是否仅供此连接使用);不使用时是否自动删除;其他
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//5.向DefaultConsumer传入一个频道,告诉服务器我们需要那个频道的消息,如果频道中有消息,就会执行回调函数handleDelivery
DefaultConsumer consumer = new DefaultConsumer(channel){
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body) throws IOException{
String message = new String(body,"UTF-8");
System.out.println("get message " + message);
}
};
//6.自动回复队列应答,RabbitMQ中的消息确认机制
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
运行后控制台打印:
get message hello 0
get message hello 1
get message hello 2
get message hello 3
get message hello 4
访问http://127.0.0.1:15672 发现消息已被消费:
完成试验后发现下载的rabbitmq里面有一个erlang文件,那么之前是不是可以不用单独下载erlang了?有待研究
本文参考:http://www.rabbitmq.com/tutorials/tutorial-one-java.html