记录问题1:启动生产者项目报错,需要给消息生产者对象指定producerGroup
记录问题2: 启动成功之后,想生产一条消息,但总是报错:
org.apache.rocketmq.client.exception.MQBrokerException: CODE: 1 DESC: create mapped file failed, server is busy or broken. BROKER: 192.168.3.11:10911
后来百度看到说目录名称不能有空格啥的,然后就想到配置文件(broker.conf)中指定了data目录

这是修改之后的,之前的红框中的斜杠是反的,修改之后,再生产消息就没问题了。
消息发送方式:
同步发送 ,比较常见的发送方式,如重要通知消息、短信通知、短信营销系统等。
@SneakyThrows
public SendResult syncMessage(String str){
Message message = initMessage(str);
message.setTags(ConfigUtils.SYNC_TAG);
return producer.send(message);
}
异步发送,通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应,发送了一条消息我就认为发送成功了,不想等待发送结果的通知才发送下一条:
@SneakyThrows
public void asyncMessage(String content){
Message message = initMessage(content);
message.setTags(ConfigUtils.ASYNC_TAG);
producer.send(message, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
log.info("这是成功的反馈");
}
@Override
public void onException(Throwable throwable) {
log.error("这是失败的反馈,出现的异常是{}",throwable.toString());
}
});
}
单向发送,单向传输用于需要中等可靠性的情况,例如日志收集,我理解就是不注意发送结果,发送了就行,可有可无。
@SneakyThrows
public void oneWay(String content){
Message message = initMessage(content);
message.setTags(ConfigUtils.ONEWAY_TAG);
producer.sendOneway(message);
}
消费者:
消费模式是集群模式:一条消息只会被集群内的一个消费者所消费
消费模式是广播模式的话,一条消息会被订阅了这个主题的所有消费者都消费一遍。
在写集群模式的监听器的时候,我没有设置实例名称,但是消费都正常进行,在写广播模式demo的时候,启动就报错了:
Invocation of init method failed; nested exception is org.apache.rocketmq.client.exception.MQClientException: The consumer group[broadcast_consumer_group] has been created before, specify another name please.
我原本以为字面意思是两个消费者不能指定同一个group,感觉不对,就百度了下,发现是需要指定实例名称:
consumer.setInstanceName("broadcastConsumer2");
如果不指定的话会指定默认值:DEFAULT 我把broadcastConsumer1的设置实例名称代码那一行注释掉,然后使用getInstanceName打印出名称,发现是DEFAULT ,看源码之后也发现会有默认值:

顺序消费:
生产者保证有同一特征的消息会放到同一个queue队列中,通过实现MessageQueueSelector 里的方法可以指定队列

点击send方法源码之后可以发现,其实第三个参数,order.getOrderId()最后就是传给的select方法的object 参数

select方法中找忘了找了个crc16均匀分配策略实现的代码,我想应该就是根据传入的objct参数来分配到一个指定的队列中,因为订单相关的流程的订单id是一样的,就可以实现指定同一个队列,从而保证同一个订单的流程可以顺序进入到同一个队列中,简单的也有直接hashCode然后取余去指定队列中。
对应的消费者也需要指定监听器是顺序的: 监听器实现的是MessageListenerOrderly接口


因为我之前写的demo的消费者订阅方法的第二个参数都是*,导致任何tag的消息都会被消费(这么看i其实这个tag还是挺有用的),而且顺序消费没有指定消费模式,默认是集群模式,就会导致顺序生产的消息被其他监听器消费了,我原本以为除去广播模式的消费记录,那应该之前写的集群消费的两个消费者和新加的顺序消费者总共消费12个(我生产者那边生产了12个消息),但是打印结果却不是

单单顺序消费者就消费了12个,集群两个demo消费者加起来是12个,我就像是不是因为不是一个group,果然,我把集群demo的group换到顺序消费的group里,就发现打印结果是一共12个,顺序消费的一个没消费到

那我前面的那条写错了,应该是集群消费模式下的消息只会被同组的某一个消费者有且仅会被消费一次改完之久结果就是可以的。
批处理:

这个是官方描述,但是我在其他文章看大小限制是4M。
在生产消息的时候可以加入一个类似tag的过滤方法:

在消费的时候就可以使用sql的方法来进行过滤

原本以为tag和MessageSelector可以同时存在,但是看了下源码好像没抓到,但是也没啥必要共存确实。
启动消费的时候报错了:

百度之后说需要在broker.conf的配置文件中加上enablePropertyFilter=true这个。
过滤成功了。
本文详细探讨了RocketMQ在生产消息时遇到的问题,包括启动报错、消息发送方式(同步、异步、单向)以及解决方法。同时,介绍了消费者模式,如集群和广播模式的配置与注意事项,特别是顺序消费的实现与消息过滤。通过实例展示了如何避免消费冲突,并提到了批处理和消息过滤功能的启用。
&spm=1001.2101.3001.5002&articleId=121003740&d=1&t=3&u=e7023f3986dd4f9babee5e0b15c1e16d)
3698

被折叠的 条评论
为什么被折叠?



