消息中间件之RabbitMQ入门讲解(二十)

RabbitMQ在Windows上的使用

1.下载安装Erlang

RabbitMQ是基于AMQP协议进行通讯的,其中Erlang语言完成了对AMQP的封装,所以我们需要下载安装Erlang,下载完成之后会得到一个类似otp_win64_20.0.exe的文件,本次演示使用的版本是20.0的,演示版本的安装包也可以从底部的源码里面获取。

2.下载安装RabbitMQ

RabbitMQ官网下载RabbitMQ的安装文件,会得到一个类似rabbitmq-server-3.7.5.exe的文件(同上,底部的源码会给出安装文件)。安装过程没有太多需要解释的,直接下一步。安装完成之后,RabbitMQ会作为一个Windows的服务启动。


如果没有启动,记得先将它启动起来。

3.启用RabbitMQ界面

首先打开一个命令行窗口,然后进入RabbitMQ安装路径下的sbin文件夹,譬如我的是:

D:\software\RabbitMQ\rabbitmq_server-3.7.5\sbin

可以运行这个命令查看插件列表:rabbitmq-plugins list


观察红色框框出的这个插件,是否是开启状态,也就是前面是否有“E*”的标志,开启了管理插件,我们才可以使用RabbitMQ提供的后台管理界面。

如果没有开启,使用命令开启管理插件:rabbitmq-plugins enable rabbitmq_management

接着,在浏览器访问:http://localhost:15672,就会进入RabbitMQ的后台管理界面:


默认的用户名和密码都是guest,点击登录:


在这里我们就可以看到概览、连接、通道、交换器、队列等等的相关信息。

4.编写消息生产者和消息消费者

内容来源是RabbitMQ的开发文档:http://www.rabbitmq.com/getstarted.html

首先创建一个简单java的maven项目hello-rabbitmq,来当做RabbitMQ客户端的消息生产者,在pom.xml中加入依赖:

<dependencies>
	<dependency>
		<groupId>com.rabbitmq</groupId>
		<artifactId>amqp-client</artifactId>
		<version>4.6.0</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>1.7.25</version>
	</dependency>
</dependencies>

创建com.init.springCloud包,之后在包下创建SendMessage.class类,按照开发文档编写消息生产者并发布一个信息,我的注释也写得比较完整,就不过多解释了:

package com.init.springCloud;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class SendMessage {

	//声明一个队列的名称
	private final static String QUEUE_NAME = "hello";
	
	public static void main(String[] args) throws Exception{
		ConnectionFactory factory = new ConnectionFactory();
		//1.设置主机,其实默认用的就是本机,端口5672,不用设置
		factory.setHost("localhost");
		//2.创建连接
		Connection connection = factory.newConnection();
		//3.创建通道
		Channel channel = connection.createChannel();
		//4.将消息放到队列里
		//2、3、4、5参数的意思:是否是持久的;是否是独立的;是否自动删除;队列参数
		//这里都用默认的就可以了
		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
		String message = "Hello World!";
		//5.发布消息到RabbitMQ服务器
		channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
		System.out.println(" [x] Sent '" + message + "'");
		//6.发送完毕之后,关闭连接
		if(channel != null){
			channel.close();
		}
		if(connection != null){
			connection.close();
		}
	}

}

运行main()方法,控制台打印了推送信息,我们去RabbitMQ的管理界面也可以看到新增了一个消息队列,有一条消息存在于队列中:


接下来编写消息消费者,创建ReceiveMessage.class类,用于接收消息:

package com.init.springCloud;

import java.io.IOException;

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;
import com.rabbitmq.client.AMQP.BasicProperties;

public class ReceiveMessage {
	
	private final static String QUEUE_NAME = "hello";
	
	public static void main(String[] args) throws Exception{
	    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");
		
	    Consumer consumer = new DefaultConsumer(channel) {
	    	@Override
	    	public void handleDelivery(String consumerTag, Envelope envelope,
	    			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);
	}
	
}

前面的步骤都大致类似,这里说一下接收消息的DefaultConsumer(),里面实现了一个handleDelivery的方法:由于我们可能会在生产者之前启动消费者,所以在尝试使用它之前,我们希望确保队列的存在。Consumer会异步地推送我们的消息,所以我们提供了一个回调,它的形式是一个对象,它将缓冲这些消息,直到我们准备好使用它们为止。

运行ReceiveMessage的mian()方法,可以看到控制台输出了我们之前发布的消息:

源码点击这里

猜你喜欢

转载自blog.csdn.net/mrspirit/article/details/80569738