RabbitMQ,先来一个helloworld
1. 下载、安装
copy前辈的博客,转载
https://www.cnblogs.com/bigberg/p/8127032.html
https://www.cnblogs.com/saryli/p/9729591.html
补充:
- rabbitmq是由erlang语言开发的,安装依赖erlang语言
- rabbitmq是作为Windows的服务运行在后台的,
- rabbit进程在Windows的任务管理器位置:
- rabbitmq服务在Windows管理服务中的位置:桌面计算机图标右键–> 管理 --> 服务和应用程序 --> 服务
rabbitmq是自动启动的,可以设置为手动,节约资源,杜绝浪费
2. java测试案例
一个连接工具类,一个数据生产者,一个数据消费者
测试案例参考:https://blog.csdn.net/kavito/article/details/91403659
通过maven引入依赖
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.7.1</version>
</dependency>
</dependencies>
工具类
package org.monkey.rabbitmq;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class RabbitMqUtil {
public static Connection getConnection () {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost");
connectionFactory.setPort(5672);
try {
return connectionFactory.newConnection();
} catch (IOException e) {
throw new RuntimeException("IOException", e);
} catch (TimeoutException e) {
throw new RuntimeException("TimeoutException", e);
}
}
}
数据生产者
package org.monkey.rabbitmq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Send {
private final static String QUEUE_NAME = "test_queue";
public static void main(String[] args) {
Connection connection = null;
Channel channel = null;
try {
// 1、获取到连接
connection = RabbitMqUtil.getConnection();
// 2、从连接中创建通道,使用通道才能完成消息相关的操作
channel = connection.createChannel();
// 3、创建队列
/* 参数说明
* String queue 队列名称
* boolean durable 是否持久化,如果持久化,mq重启后队列还在
* boolean exclusive 是否独占连接,队列只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果将此参数设置true可用于临时队列的创建
* boolean autoDelete 自动删除,队列不再使用时是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队列不用了就自动删除)
* Map<String, Object> arguments 参数,可以设置一个队列的扩展参数,比如:可设置存活时间
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 4、消息内容
String message = "Hello World!";
// 向指定的队列中发送消息
/* 参数明细:
* String exchange,交换机,如果不指定将使用mq的默认交换机(设置为"")
* String routingKey,路由key,交换机根据路由key来将消息转发到指定的队列,如果使用默认交换机,routingKey设置为队列的名称
* BasicProperties props,消息的属性
* byte[] body,消息内容
*/
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" Sent '" + message + "'");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 5、关闭通道和连接
try {
if (channel != null){
channel.close();
}
if (connection != null) {
connection.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
}
数据消费者
package org.monkey.rabbitmq;
import com.rabbitmq.client.*;
import java.io.IOException;
public class Recv {
private final static String QUEUE_NAME = "test_queue";
public static void main(String[] args) throws IOException {
// 1、获取到连接
Connection connection = RabbitMqUtil.getConnection();
// 2、创建会话通道,生产者和mq服务所有通信都在channel通道中完成
Channel channel = connection.createChannel();
// 3、创建队列
/* 参数明细
* String queue 队列名称
* boolean durable 是否持久化,如果持久化,mq重启后队列还在
* boolean exclusive 是否独占连接,队列只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果将此参数设置true可用于临时队列的创建
* boolean autoDelete 自动删除,队列不再使用时是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队列不用了就自动删除)
* Map<String, Object> arguments 参数,可以设置一个队列的扩展参数,比如:可设置存活时间
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 4、实现消费方法
DefaultConsumer consumer = new DefaultConsumer(channel){
// 获取消息,并且处理,这个方法类似事件监听,如果有消息的时候,会被自动调用
/** 当接收到消息后此方法将被调用
* @param consumerTag 消费者标签,用来标识消费者的,在监听队列时设置channel.basicConsume
* @param envelope 信封,通过envelope
* @param properties 消息属性
* @param body 消息内容
* @throws IOException
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body) throws IOException {
// 交换机
String exchange = envelope.getExchange();
// 消息id,mq在channel中用来标识消息的id,可用于确认消息已接收
long deliveryTag = envelope.getDeliveryTag();
// body 即消息体
String msg = new String(body,"utf-8");
System.out.println("Received : " + msg + "!");
}
};
// 监听队列,第二个参数:是否自动进行消息确认。
/* 参数明细:
* String queue 队列名称
* boolean autoAck 自动回复,当消费者接收到消息后要告诉mq消息已接收,如果将此参数设置为tru表示会自动回复mq,如果设置为false要通过编程实现回复
* Consumer callback,消费方法,当消费者接收到消息要执行的方法
*/
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
运行
生产者
消费者