rabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。rabbitMQ使用二郎语言(ERLANG)编写,使用需安装erlang。
rabbitmq的三个名词解释
生产者:发送消息的程序就是一个生产者(producer)
队列:队列是发送消息的缓冲,基本上是一个无限的缓冲。多个生产者(producers)能够把消息发送给同一个队列,同样,多个消费者(consumers)也能攻从一个队列(queue)中获取数据。
消费:获取队列中的消息。
Hello World步骤
客户端
第一步,建立一个到RabbitMQ服务器的连接
ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection();
第二步:定义queue名称
Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null);
定义QUEUE_NAME,消息将通过定义的queue发送消息
第三部:发送消息
String message = "Hello World!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
发送完消息,切记关闭连接
channel.close(); connection.close();
服务端
第一、二步:跟客户端一致,定义域rabbitmq服务器的连接并指定读取的queue名称
ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null);
第三步:定义消费者进行消费
QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume(QUEUE_NAME, true, consumer); while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String message = new String(delivery.getBody()); System.out.println(" [x] Received '" + message + "'"); }
消费者根据queue名称读取消息
整合代码
客户端:
public class MQClient { private final static String QUEUE_NAME="hello"; public static void main( String[] args ) throws IOException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); 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(); } }
输出:
[x] Sent 'Hello World!'
服务端
public class MQServer { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws IOException, ShutdownSignalException, ConsumerCancelledException, 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"); QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume(QUEUE_NAME, true, consumer); while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String message = new String(delivery.getBody()); System.out.println(" [x] Received '" + message + "'"); } } }
输出:
[*] Waiting for messages. To exit press CTRL+C [x] Received 'Hello World!'