一、发送消息端
/*
* 创建队列,名字为myQueue
* 参数1: 为队列名
* 参数2: 是否为持久化的队列
* 参数3: 是否排外,如果排外则这个队列只允许一个消费者监听.
* 参数4: 是否自动删除队列,如果为ture则表示当队列中没有消息,也没有消费者连接时,就会自动删除这个队列
* 参数5: 为队列的一些属性设置,通常为null即可.
* */
channel.queueDeclare("myQueue",true,false,false,null);
/*
* 发送消息到指定队列
* 参数1: 为交换机名称,这里的空字符串表示不使用交换机
* 参数2: 为队列名或RoutingKey,当指定了交换机名称后,这个值就是RoutingKey
* 参数3: 消息的属性信息,通常为空即可
* 参数4: 为具体的消息字节数组
* */
channel.basicPublish("","myQueue",null,message.getBytes("UTF-8"));
二、接受消息端
/*
* 接收消息
* 参数1 队列名称
* 参数2 是否自动确认消息 true表示自动确认 false表示手动确认
* 参数3 为消息标签 用来区分不同的消费者这里暂时为""
* 参数4 消费者回调方法用于编写处理消息的具体代码(例如打印或将消息写入数据库)
* 注意:
* 使用了basicConsume方法后,会启动一个线程在持续的监听队列,如果队列中有信息的数据
* 进入则会自动接收消息,因此不能关闭连接和通道对象.
* */
channel.basicConsume("myQueue",autoAck,consumerTag,new DefaultConsumer(channel){
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException {
//获取消息数据
String bodyStr = new String(body, "UTF-8");
System.out.println(bodyStr);
}
});
//不注释掉就不会循环获取信息,只能获取一条
/* channel.close();
connection.close();*/
三、Direct类型
发送消息端:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("root");
factory.setPassword("root");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
String message ="夫英雄者,胸怀大志,腹有良策,有包藏宇宙只机,吞吐天地之志也!";
String exchangeName="myExchange";
channel.queueDeclare("myQueueDirect",true,false,false,null);
/*
* 指定Exchange的类型
* 参数1: 交换机名称
* 参数2: 交换机类型取值为 direct、queue、topic、headers
* 参数3: 是否为持久化消息 true表示持久化消息 false表示非持久化
* */
channel.exchangeDeclare(exchangeName,"direct",true);
//将交换机与队列进行绑定
channel.queueBind("myQueueDirect",exchangeName,"myRoutingKey");
/*
* 发送消息到RabbitMQ
* 参数1: 我们自定义的交换机名称
* 参数2: 自定义的RoutingKey值
* 参数3: 设置消息的属性,可以通过消息属性设置消息是否是持久化的
* 参数4: 具体要发送的消息信息
* */
channel.basicPublish(exchangeName,"myRoutingKey",null,message.getBytes("UTF-8"));
System.out.println("消息发送成功: "+message);
channel.close();
connection.close();
接受消息端:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("root");
factory.setPassword("root");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//消费消息
boolean autoAck = true;
String consumerTag = "";
String exchangeName="myExchange"; //声明交换机名称
channel.exchangeDeclare(exchangeName,"direct",true);
channel.queueDeclare("myQueueDirect",true,false,false,null);
channel.queueBind("myQueueDirect",exchangeName,"myRoutingKey");
channel.basicConsume("myQueueDirect",autoAck,consumerTag,new DefaultConsumer(channel){
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException {
//获取消息数据
String bodyStr = new String(body, "UTF-8");
System.out.println(bodyStr);
}
});
//不注释掉就不会循环获取信息,只能获取一条
/* channel.close();
connection.close();*/
四、Fanout类型
发送消息端:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("root");
factory.setPassword("root");
//创建连接对象和通道对象
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
String message = "问苍茫大地,谁主沉浮?";
String exchangeName = "myExchangeFanout";
//指定交换机名称和类型
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT,true);
//String queueName = channel.queueDeclare().getQueue();
//将交换机与队列进行绑定
//channel.queueBind(queueName,exchangeName,"");
channel.basicPublish(exchangeName,"",null,message.getBytes("UTF-8"));
System.out.println("消息发送成功:"+message);
channel.close();
connection.close();
接收消息端:
ConnectionFactory factory = new ConnectionFactory();
factory.setPort(5672);
factory.setHost("localhost");
factory.setUsername("root");
factory.setPassword("root");
//创建连接对象和通道对象
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//声明交换机
String exchangeName="myExchangeFanout";
channel.exchangeDeclare(exchangeName,BuiltinExchangeType.FANOUT,true);
//获取一个临时队列
String queueName = channel.queueDeclare().getQueue();
//将交换机与队列绑定
channel.queueBind(queueName,exchangeName,"");
boolean autoAck = true;
String consumerTag = "";
//接收消息
//参数1 队列名称
//参数2 是否自动确认消息 true表示自动确认 false表示手动确认
//参数3 为消息标签 用来区分不同的消费者这列暂时为""
// 参数4 消费者回调方法用于编写处理消息的具体代码(例如打印或将消息写入数据库)
System.out.println(queueName);
channel.basicConsume(queueName,autoAck,consumerTag,new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException {
//获取消息数
String bodyStr = new String(body, "UTF-8");
System.out.println(bodyStr);
}
});
/* channel.close();
connection.close();*/
注意:
1、使用fanout模式获取消息时不需要绑定特定的队列名称,只需使用channel.queueDeclare().getQueue();获取一个随机的队列名称,然后绑定到指定的Exchange即可获取消息。
2、这种模式中可以同时启动多个接收者只要都绑定到同一个Exchang即可让所有接收者同时接收同一个消息是一种广播的消息机制
五、Topic类型
发送消息端:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("root");
factory.setPassword("root");
//创建连接对象和通道对象
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//String message = "驰来北马多骄气,歌到南风竟死声!";
String message = "人间别久不成悲,谁叫岁岁红莲月,两处沉吟各自知!";
String exchangeName = "myExchangeTopic";
//指定交换机类型,是否持久化
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC,true);
/*
* 发送消息到RabbitMQ
* 参数1: 自定义的交换机名称
* 参数2: 自定义的RoutingKey值
* 参数3: 设置消息的属性,可以通过消息属性设置消息是否是持久化的
* 参数4: 具体要发送的消息信息
* 注意:
* 在topic模式中必须要指定Routingkey,并且可以同时指定多层的RoutingKey.
* 每个层次之间使用.点分隔即可. 例如: test.myRoutingKey
* */
channel.basicPublish(exchangeName,"test.myRoutingKey",null,message.getBytes("UTF-8"));
System.out.println("消息发送成功: "+message);
channel.close();
connection.close();
接受消息端:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("root");
factory.setPassword("root");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//声明交换机
String exchangeName = "myExchangeTopic";
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC,true);
//声明队列
String queueName = channel.queueDeclare().getQueue();
String routingKey = "test.#";
//绑定队列,通过键将队列和交换器绑定起来
channel.queueBind(queueName, exchangeName, routingKey);
/*
* 注意:
* Topic模式的消息接收时必须要指定RoutingKey并且可以使用#和*来做统配符号,#表示通配
* 任意一个单词,*表示通配任意多个单词.
*
* 例如消费者的RoutingKey为test.#或#.myRoutingKey,都可以获取
* RoutingKey为test.myRoutingKey发送者发送的消息.
* */
channel.basicConsume(queueName,true,"",new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException {
//获取消息数
String bodyStr = new String(body, "UTF-8");
System.out.println(bodyStr);
}
});
/* channel.close();
connection.close();*/