Native RabbitMQ Direct Exchange
RabbitMQ原生编程,直接交换器。
生产者:
/**
* 原始生产者:
* 1. 创建连接工厂
* 2. 创建连接
* 3. 创建信道
* 4. 在连接中声明交换器的【名字】以及【类型】
* 5. 创建队列
* 6. 声明路由键的名字
* 7. 将队列和交换器通过路由键绑定,目的是让交换器通过路由键投送到相应的队列中
* 8. 发送消息
* 9. 关闭连接,关闭信道,发送完毕
*
* create by zhangjianbing
* time 2020年9月1日
*/
public class DirectProducer {
public final static String EXCHANGE_NAME = "direct_exchange";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("10.0.0.0");
connectionFactory.setPort(5672);
connectionFactory.setUsername("gogoblue");
connectionFactory.setPassword("123456");
connectionFactory.setVirtualHost("beijing");
// 创建连接
Connection connection = connectionFactory.newConnection();
// 创建信道
Channel channel = connection.createChannel();
// 在信道中设置交换器,这里将第三个参数设置成true,交换器持久化
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true);
// 声明一个普通的队列
String queueName = "MESSAGE.CALLBACK.QUEUE";
// 这里第二个参数设置成true,持久队列
channel.queueDeclare(queueName, true, false, false, null);
// 设置路由键
String routeKey = "direct_routeKey";
// 将队列和交换器通过路由键绑定在一起
channel.queueBind(queueName, DirectProducer.EXCHANGE_NAME, routeKey);
// 消息
String message = "hello rabbit message queue";
// 发送消息
channel.basicPublish(EXCHANGE_NAME, routeKey, null, message.getBytes());
System.out.println("消息发送成功。。。。。。");
// 关闭信道和连接
channel.close();
connection.close();
}
}
消费者:
/**
* 原生消费者:
* 仅仅关心去哪个队列消费
*
* create by zhangjianbing
* time 2020年9月1日
*/
public class DirectConsumer {
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("1.1.1.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("beijing");
connectionFactory.setPassword("123456");
connectionFactory.setVirtualHost("beijing");
// 创建连接
Connection connection = connectionFactory.newConnection();
// 创建信道
Channel channel = connection.createChannel();
System.out.println("正在等待消息。。。。。。");
// 声明一个消费者
final Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
System.out.println("【路由键】:" + envelope.getRoutingKey() + "【消息内容】:" + new String(body, StandardCharsets.UTF_8));
}
};
// 指定队列去消费
String queueName = "MESSAGE.CALLBACK.QUEUE";
// 消费者正式开始在指定队列上消费[队列名称、自动提交、消费者]
channel.basicConsume(queueName, true, consumer);
}
}