一、RabbitMQ介绍
RabbitMQ是一个消息中介,它接收消息并转发,可以想象RabbitMQ为一个邮箱/信箱,当你将你需要寄出去的信件放进邮箱,可以确定的是
邮差最终会将信件交付给信件的接收者,以此类推,
RabbitMQ就是一个邮箱、一个邮局、一个邮差。
当然,
RabbitMQ和邮局最大的差别就是
RabbitMQ不是处理纸张信息,而是保存和转发二进制的数据信息。
RabbitMQ中使用的一些术语,
Producer就是一个专门发送信息(Messages)的组织。可以称之为生产者。
Consumers就是一个专门消费信息(Messages)的组织,可以称之为消费者。
Queue是RabbitMQ内部用于存储信息的容器,queue的大小限制与机器的内存和硬盘的限制,本质上,queue就是一个大的消息缓冲区。多个Producer可以往queue中发送信息,多个consumer可以尝试从queue中接收信息。
二、RabbitMQ Hello World
简单介绍完RabbitMQ,接下来来一个关于RabbitMQ的demo。消息模型如下图
新建一个maven工程,工程名就叫rabbitmq,代码如下
消息发送者:producer.java
package org.rabbitmq;
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 Producer {
private static final String QUEUE_NAME = "hello";
public static void main(String args[]) throws IOException, TimeoutException{
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5673);
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "HelloWorld";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
channel.close();
connection.close();
}
}
消息接受者Recv.java
package org.rabbitmq;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
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;
public class Recv {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv)
throws java.io.IOException,
java.lang.InterruptedException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5673);
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");
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
}
};
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
因为我安装RabbitMQ时改了端口,所以连接RabbitMQ的时候需要设置端口,如果没改端口的情况下,可以使用默认端口。
开发中需要RabbitMQ客户端的jar,maven引用如下
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.2.1</version>
</dependency>
启动RabbitMQ server,然后先运行Recv,再运行Producer