“Hello World” 模式如下图,publisher(生产者)发送消息到MQ,consumer(消费者)监听MQ获得消息。
1. 生产者发送消息到队列(Sending)
首先可先创建一个RabbitMQ连接获取工具类,封装获取连接的方法
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class ConnectionUntil
{
private final static String host = "localhost"; //RabbitMQ server 地址
private final static int port = 5672; //端口
private final static String user = "admin"; //用户名
private final static String pwd = "admin"; // 密码
private final static String vHost = "testhost"; //RabbitMQ中Erlang虚拟机名字,可使用默认的虚拟机
public static Connection getConnection() throws Exception
{
//声明Connection工厂类
final ConnectionFactory cFactory = new ConnectionFactory();
//设置地址
cFactory.setHost(host);
//设置端口
cFactory.setPort(port);
//设置虚拟机,可不设置使用默认
cFactory.setVirtualHost(vHost);
//设置用户名
cFactory.setUsername(user);
//设置密码
cFactory.setPassword(pwd);
//获得连接
final Connection connection = cFactory.newConnection();
return connection;
}
}
然后创建生产者类,并获得连接发送“Hello World”消息
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
public class Producer
{
private final static String QUEUE_NAME = "test_1"; // 队列名
public static void main(final String[] args) throws Exception
{
try ( // 调用工具类创建连接
final Connection connection = ConnectionUntil.getConnection();
// 创建通道(通道包括生产通道和消费通道)
final Channel channel = connection.createChannel();){
// 声明通道的消息队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 创建待发送的消息
final String message = "Hello World";
// 发布消息到队列
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("[x] Sent'" + message + "'");
}
}
}
2. 消费者监听队列获得消息(Receiving)
不像生产者只需发送一个单个的消息,消费者需要不停的监听消息队列来保证可以获得消息
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DeliverCallback;
public class Consumer
{
private final static String QUEUE_NAME = "test_1";// 队列名,与生产者的目标队列名一致
public static void main(final String[] args) throws Exception
{
final Connection connection = ConnectionUntil.getConnection();
final Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//消息递送后的回调函数
final DeliverCallback deliverCallback = (consumerTag,delivery)->{
final String message = new String(delivery.getBody(),"UTF-8");
System.out.println("[x] Received'" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag ->
{
});
}
}
消费者中也声明了队列,这是因为我们可能在生产者运行之前运行消费者,我们需要保证在进行获得消息操作之前消息队列的存在。另外,这里没有用try-with-resource来自动地关闭channel和connection,这是因为当消费者异步监听将要到达的消息的过程中,进程需要一直运行。我们以对象的方式提供了一个回调函数,它可以缓存获得到的消息,以待我们需要的使用这些消息的时候。
3.运行
首先运行Consumer类保证消费者处于监听状态,然后运行生产者发送消息。运行结果如下:
生产者成功发送消息:
消费者成功接收消息:
参考文献:
[1] http://next.rabbitmq.com/tutorials/tutorial-one-java.html
[2] https://blog.csdn.net/hellozpc/article/details/81436980