简单的说,RabbitMQ有点类似于生产者消费者问题。有N个发送消息客户端、N个接收消息客户端和一个消息队列。值得一提的是这N个消息发送者可以将信息发送到同一个消息队列,而这个队列也可以被N消息接收者接收。Note:生产者消费者不一定要在同一个机器。
下面将详细介绍Java操作RabbitMQ,我们以“Hello Word“ 为例。
我们会创建两个客户端,一个是生产者,向RabbitMQ传输信息。另一个是消费者,从RabbitMQ拿到信息。
首先先建立与mq的链接,然后通过链接建立一个通道(Channel)通过通道向MQ发送消息
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
接下来就是在Channel上申明一个队列,因为在MQ中所有消息的接收和发送都是通过queue来完成的。
申明完队列以后通过basicPublish()方法发送消息,一个有四个参数,现在暂且只介绍两个,剩下的会后续介绍,现在先设置为空。注意发送的消息必须是二进制数组。
channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'");
最后当然不要忘了将链接关闭。
channel.close(); connection.close();
发送完了,自然要接收,下面就是接收的代码。记住发送和接收的队列名字必须一致,才能接收的消息。
public class Recv {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv)
throws java.io.IOException,
java.lang.InterruptedException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
<span class="n" style="font-family: Arial, Helvetica, sans-serif;"> </span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">Consumer</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">consumer</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">=</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="k" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">new</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">DefaultConsumer</span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">(</span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">channel</span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">)</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">{</span>
<span class="nd" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif;"><span style="background-color: rgb(238, 238, 238);"> </span>@Override</span>
<span class="kd" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif;"> </span><span class="kd" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">public</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="kt" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(68, 85, 136); font-weight: bold;">void</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="nf" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(153, 0, 0); font-weight: bold;">handleDelivery</span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">(</span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">String</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">consumerTag</span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">,</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">Envelope</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">envelope</span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">,</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">AMQP</span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">.</span><span class="na" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">BasicProperties</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">properties</span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">,</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="kt" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(68, 85, 136); font-weight: bold;">byte</span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">[]</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">body</span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">) </span><span class="kd" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">throws</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="n" style="font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; color: rgb(0, 128, 128);">IOException</span><span style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(238, 238, 238);"> </span><span class="o" style="color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-weight: bold;">{</span>
<pre style="padding: 5px 15px; border-radius: 5px; color: rgb(85, 85, 85); font-size: 13px; line-height: 18px; background-color: rgb(238, 238, 238);"> <span class="n" style="color: rgb(0, 128, 128);">String</span> <span class="n" style="color: rgb(0, 128, 128);">message</span> <span class="o" style="font-weight: bold;">=</span> <span class="k" style="font-weight: bold;">new</span> <span class="n" style="color: rgb(0, 128, 128);">String</span><span class="o" style="font-weight: bold;">(</span><span class="n" style="color: rgb(0, 128, 128);">body</span><span class="o" style="font-weight: bold;">,</span> <span class="s" style="color: rgb(221, 17, 68);">"UTF-8"</span><span class="o" style="font-weight: bold;">);</span>
<span class="n" style="color: rgb(0, 128, 128);">System</span><span class="o" style="font-weight: bold;">.</span><span class="na" style="color: rgb(0, 128, 128);">out</span><span class="o" style="font-weight: bold;">.</span><span class="na" style="color: rgb(0, 128, 128);">println</span><span class="o" style="font-weight: bold;">(</span><span class="s" style="color: rgb(221, 17, 68);">" [x] Received '"</span> <span class="o" style="font-weight: bold;">+</span> <span class="n" style="color: rgb(0, 128, 128);">message</span> <span class="o" style="font-weight: bold;">+</span> <span class="s" style="color: rgb(221, 17, 68);">"'"</span><span class="o" style="font-weight: bold;">);</span>
<span class="o" style="font-weight: bold;">}</span>
<span class="o" style="font-weight: bold;">};</span>
channel.basicConsume(QUEUE_NAME, true, consumer);}
}