在安装好RabbitMQ后,我们就来看一看基础的RabbitMQ的使用,首先我们先来看一看比较常用的Direct模式,其使用也是非常简单的,首先我们需要引入相关的依赖,如下:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.0.0</version>
</dependency>
注意: 5系列的版本最好使用JDK8及以上,低于JDK8建议使用4.x版本
然后我们先来看一看RabbitMQ的消息生产者,这里我们可以结合之前介绍的AMQP及RabbitMQ概论中的流程来看,这样会更加容易理解
public class DirectProducer {
//交换器名称
public static final String EXCHANGE_NAME = "logs";
public static void main(String[] args) throws Exception {
//创建连接,连接到RabbitMQ
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
Connection connection = connectionFactory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//创建交换器
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
//定义的业务日志消息级别,即作为路由键使用
String[] logLevels = {"error", "warn", "info"};
for (int i = 0; i < logLevels.length; i++) {
String logLevel = logLevels[i];
String msg = "Hello RabbitMQ";
//发布消息,需要参数:交换器、路由键,其中以日志消息级别为路由键
channel.basicPublish(EXCHANGE_NAME, logLevel, null, msg.getBytes(Charset.forName("UTF-8")));
}
channel.close();
connection.close();
}
}
消息发送出去后,我们还需要建立消费者去消费消息,上述生成者一共生成了error、warn、info三组消息,这里我们就来看看只消费error的消费者,如下:
public class ErrorConsumer {
public static final String EXCHANGE_NAME = "logs";
public static void main(String[] args) throws Exception {
//创建连接,连接到RabbitMQ,与发送端一样
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
Connection connection = connectionFactory.newConnection();
//创建信道
Channel channel = connection.createChannel();
//可不创建,由生产者进行创建
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
String queueName = "logError"; //声明一个队列名称
String routingKey = "error"; //路由键名称
//创建一个队列
channel.queueDeclare(queueName, false, false, false, null);
//将队列和交换器通过路由键进行绑定
channel.queueBind(queueName, EXCHANGE_NAME, routingKey);
//声明了一个消费者
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("Exchange: " + envelope.getExchange());
System.out.println("RoutingKey: " + envelope.getRoutingKey());
System.out.println("Content: " + new String(body, Charset.defaultCharset()));
System.out.println("--------------");
}
};
//消费者正式开始在指定队列上消费消息
channel.basicConsume(queueName, true, consumer);
}
}
然后我们就可以进行测试了,测试结果如下:
上述消费者只是消费了error的消息,即上述队列只绑定了一个路由键。万一我们想要消费多种消息,即队列上需要绑定多个路由键,那么应该如何进行设置呢,如下;
其实非常的简单,我们需要做一点点很多的变化,就是在绑定路由键的时候,多次绑定就可以了,如下: