RockerMQ

本文展示了如何使用RocketMQ进行同步和异步消息发送,以及如何创建消费者实例并订阅消息。同步发送中,生产者发送消息并等待返回结果;异步发送则通过回调函数处理发送结果。消费者注册监听器来消费TopicTest下匹配Tag的消息。
摘要由CSDN通过智能技术生成

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

RocketMQ

同步消息发送

public class SyncProducer {
        
public static void main(String[] args) throws Exception {
            
// 实例化消息生产者Producer
       DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
            
// 设置NameServer的地址
            producer.setNamesrvAddr("localhost:9876");
            
// 启动Producer实例
       producer.start();
            
for (int i = 0; i < 100; i++) {
               
// 创建消息,并指定Topic,Tag和消息体
                Message msg = new Message("TopicTest" /* Topic */,
                
"TagA" /* Tag */,
                (
"Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
                );
                
// 发送消息到一个Broker
            SendResult sendResult = producer.send(msg);
           
// 通过sendResult返回消息是否成功送达
            System.out.printf("%s%n", sendResult);
            }
            
// 如果不再发送消息,关闭Producer实例。
          producer.shutdown();
    }
}

异步消息发送

public class AsyncProducer {
        
public static void main(String[] args) throws Exception {
            
// 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
            
// 设置NameServer的地址
        producer.setNamesrvAddr("localhost:9876");
            
// 启动Producer实例
        producer.start();
        producer
.setRetryTimesWhenSendAsyncFailed(0);
        
        
int messageCount = 100;
       
// 根据消息数量实例化倒计时计算器
        final CountDownLatch2 countDownLatch = new CountDownLatch2(messageCount);
            
for (int i = 0; i < messageCount; i++) {
               
final int index = i;
                    
// 创建消息,并指定Topic,Tag和消息体
                Message msg = new Message("TopicTest",
                   
"TagA",
                   
"OrderID188",
                   
"Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
               
// SendCallback接收异步返回结果的回调
                producer.send(msg, new SendCallback() {
                   
@Override
                    public void onSuccess(SendResult sendResult) {
                        System
.out.printf("%-10d OK %s %n", index,
                            sendResult
.getMsgId());
                    }
                   
@Override
                    public void onException(Throwable e) {
                            System
.out.printf("%-10d Exception %s %n", index, e);
                            e
.printStackTrace();
                    }
                    });
            }
        
// 等待5s
        countDownLatch.await(5, TimeUnit.SECONDS);
            
// 如果不再发送消息,关闭Producer实例。
            producer.shutdown();
    }
}

消费者

public class Consumer {

                 public static void main(String[] args) throws InterruptedException, MQClientException {

                 // 实例化消费者
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name");

                 // 设置NameServer的地址
        consumer.setNamesrvAddr("localhost:9876");

 

                // 订阅一个或者多个Topic,以及Tag来过滤需要消费的消息
             consumer.subscribe("TopicTest", "*");
            
// 注册回调实现类来处理从broker拉取回来的消息
        consumer.registerMessageListener(new MessageListenerConcurrently() {
           
@Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                System
.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
               
// 标记该消息已经被成功消费
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
       
// 启动消费者实例
        consumer.start();
        System
.out.printf("Consumer Started.%n");
        }
}

参考资料

https://github.com/apache/rocketmq/blob/master/docs/cn/RocketMQ_Example.md

需要重写sendMsg方法

topic自然就是订阅的topic了

mock为真的话,就不做操作,只打日志,估计是测试用的

cache的话,就用那个stringRedisTemplate往redis里写。而不是使用rocketMQ之类的消息中间

producer就是实际真正往记录中心写数据的:

type是指用啥消息中间件

调rocketMQProducer来发消息

这俩指定了消息发到哪

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值