持久化消息 :
byte[] message = "Song Game".getBytes();
// 这条消息的投递模式设置为2,即消息会被持久化(存入磁盘)。
channel.basicPublish("source","exKey",MessageProperties.PERSISTENT_TEXT_PLAIN,message);
带有Headers消息 :
// 也可以发送一条带有headers的消息
message = "this is a kv message".getBytes();
Map<String, Object> headers = new HashMap<>();
headers.put("location", "here");
headers.put("time", "totay");
channel.basicPublish("source", "exKey",
new AMQP.BasicProperties.Builder().headers(headers).build(), message);
带有过期时间的消息:
// 带有过期时间的消息
channel.basicPublish("source", "exKey",
new AMQP.BasicProperties.Builder()
.expiration("60000")
.build(), "this message has a expire time".getBytes());
消费消息:
RabbitMQ的消费模式分两种, 推(Push) 和 拉(Pull)模式。
- 推模式 采用 Basic.Consume 进行消费, 而拉模式则调用Basic.Get进行消费。
- 在推模式, 可以通过持续订阅的方式来消费消息。 接收消息一般通过实现Consumer接口或者继承DefaultConsumer类来实现。当与Consumer相关的API方法时,不同的订阅采用不同的消费者 标签(consumerTag)来分别彼此,在同一个Channel中的消费者也需要唯一的消费者标签以做区分。
/**
* @param queue 队列的名称
* @param autoAck 设置是否自动确认。建议设置为false,即不自动确认
* @param consumerTag 消费者标签
* @param callback 设置消费者的回调函数, 用来处理RabbitMQ推送过来的消息,使用时需要客户端重写其中的方法
* @return
* @throws IOException
*/
String basicConsume(String queue, boolean autoAck, String consumerTag, Consumer callback) throws IOException;
boolean autoAck = false;
// 设置客户端最多接收未被ack的消息个数
channel.basicQos(64);
// 显示地设置autoAck为false
channel.basicConsume(QUEUE_NAME, autoAck, "myConsumerTag", new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body) throws IOException {
String routingKey = envelope.getRoutingKey();
String contentType = properties.getContentType();
long deliveryTag = envelope.getDeliveryTag();
System.out.println("recv message:" + new String(body));
// 接收到消息之后显示ack操作, 对于消费者来说这个设置是非常必要的,可以防止不必要的丢失。
channel.basicAck(deliveryTag, false);
}
});
拉模式:
// basicGet可以单条地获取消息
GetResponse response = channel.basicGet(QUEUE_NAME, false);
System.out.println(new String(response.getBody()));
channel.basicAck(response.getEnvelope().getDeliveryTag(), false);