本文介绍RabbitMQ中message属性设置的代码
Procuder
import java.util.HashMap;
import java.util.Map;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Procuder {
public static void main(String[] args) throws Exception {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
/*
* 自定义属性
*/
Map<String, Object> headers = new HashMap<>();
headers.put("my1", "111");
headers.put("my2", "222");
/*
*deliveryMode 常用的送达模式 1 非持久化投递(服务器重启后消息没被消费也会消失) 2 持久化投递
*contentEncoding 字符集
* expiration 存活时间10秒 如果10秒后没有被消费mq则会自动清除此消息
* headers 自定义属性
*/
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.deliveryMode(2)
.contentEncoding("UTF-8")
.expiration("10000")
.headers(headers)
.build();
String msg = "RabbitMQ!";
channel.basicPublish("", "message", null, msg.getBytes());
//5 记得要关闭相关的连接 由小到大的原则
channel.close();
connection.close();
}
}
Consumer
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;
public class Consumer {
public static void main(String[] args) throws Exception {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
String queueName = "message";
/**
* 1、queueName 队列名字
* 2、durable 是否持久化 如果设置为true 则表示持久化 就算服务器重启此队列也不会消失
* 3、exclusive 表示独占 设置为true后 则表示此队列只有这一个channel能够监听,应用于顺序消费的场景
* 4、autoDelete 自动删除 设置成ture后,如果队列长时间没有被使用,则会自动删除
* 5、扩展参数
*/
channel.queueDeclare(queueName, true, false, false, null);
QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
//6 设置Channel
/**
*1、queueName 监听(消费)的队列名字
*2、autoAck 是否自动签收 如果设置为true,表示自动签收,表示消息已收到,也可以手工设置ack
*3、callback 具体的消费者对象
*/
channel.basicConsume(queueName, true, queueingConsumer);
while(true){
//7 获取消息 如果没有消息则一直阻断在这,nextDelivery(long time)方法则是有超时时间,在时间内如果没有消息则会放行
Delivery delivery = queueingConsumer.nextDelivery();
String msg = new String(delivery.getBody());
System.err.println("消费端: " + msg);
//自定义属性获取
Map<String, Object> headers = delivery.getProperties().getHeaders();
System.err.println("headers get my1 value: " + headers.get("my1"));
//Envelope envelope = delivery.getEnvelope();
}
}
}