RabbitMQ消息相关

持久化消息 :

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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值