对rocketmq的发送方和消费方的一些设置进行记录

244 阅读1分钟

1.三种发送消息方式

分别是发送同步消息、发送异步消息、发送单向消息

//发送同步消息
Message message = new Message("mytop111", "你好".getBytes());
SendResult send = producer.send(message);

//异步可靠消息,不会阻塞
//采用事件监听方式接收broker返回的确认
Message message4 = new Message("mytop111", "你好4".getBytes());
producer.send(message4, new SendCallback() {
    public void onSuccess(SendResult sendResult) {
        System.out.println("发送成功");
        System.out.println("sendResult = " + sendResult);
    }

    public void onException(Throwable throwable) {
        System.out.println("发送失败");
        System.out.println(throwable.getMessage());
        //准备重投
    }
});

//单向消息,不需要broker返回确认,直接发
producer.sendOneway(message);

2.设置消息的组名和消息的key

//给消息设置一个组名,以及一个key
Message  message5 = new Message("mytop111","tag-A","key-1", "你好4".getBytes());

消费方可以根据组名来过滤消息进行消费

//consumer根据设置的tag组名进行过滤
consumer.subscribe("mytop111","tag-A");

3.给消息设置属性,消费方可以通过sql来过滤消息

 //给消息设置一个组名,以及一个key
Message  message5 = new Message("mytop111","tag-A","key-1", "你好4".getBytes());

//给消息增加个属性,让consumer支持sql过滤
message5.putUserProperty("age","18");
//消息选择器
//需要在broker.conf里添加enablePropertyFilter=true
MessageSelector messageSelector = MessageSelector.bySql("age >= 18 and age <=28");
consumer.subscribe("mytop111",messageSelector);

4.消费端设置消费模式

 //设置消费模式
//MessageModel.CLUSTERING 默认集群模式,只能消费一次
//MessageModel.BROADCASTING 广播模式,可以重复消费
consumer.setMessageModel(MessageModel.CLUSTERING);
consumer.setMessageModel(MessageModel.BROADCASTING);

5.设置消息发送者消息重投和消息消费者延迟消费

Message message = new Message("mytop111", "你好".getBytes());
//如果broker超过时间还没返回确认消息,可以设置重投
producer.setRetryTimesWhenSendFailed(2);
SendResult send = producer.send(message);
 consumer.registerMessageListener(new MessageListenerConcurrently() {
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
        for (MessageExt msg : msgs) {
            byte[] body = msg.getBody();
            System.out.println(new String(body));
        }

        //如果不确认能否消费消息
        if("1".equals("2")){
            return ConsumeConcurrentlyStatus.RECONSUME_LATER;
        }



        //默认情况下,这条消息只会被一个consumer消费 点对点
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;



    }
});

//默认能卡消费线程15分钟
consumer.setConsumeTimeout(15);