1:servername producer consumer group topic 简单说明
servername 也就是服务器地址:localhost:9876
producer 生产者 在JAVA代码创建
consumer 消费者 在JAVA代码创建
group (仅用于方便分组管理)
1:producer_group 在JAVA代码创建 producer存放在这里
2:comsumer_group 在JAVA代码创建 consumer存放在这里
topic:主题 最好在管理界面中创建 (也可以Java代码自动创建)
producer 生产的消息发到这里
consumer 消费这里面的消息
2:RocketMq的Maven包
//注意和服务端的版本号一致
org.apache.rocketmq
rocketmq-client
4.3.0
3:RocketMq的producer 说明与核心代码
//消息体
public class RocketEvent {
/**
* 事件
*/
private String event;
/**
* 信息
*/
private T data;
/**
* 二级主题
*/
private String tag;
public RocketEvent(String event, T data,String tag) {
this.event = event;
this.data = data;
this.tag = tag;
}
public RocketEvent(String event, T data) {
this.event = event;
this.data = data;
}
}
@Slf4j
@Configuration
public class RocketMqConfiguration {
//注意 defaultMQProducer可以在配置类里面获取配置文件参数
@Value("${rocketmq.name-srv-addr}")
//localhost:9876
private String nameSrvAddr;
@Value("${rocketmq.producer-group}")
//"pay_test_topic"
private String producerGroup;
/**
* @return 返回普通消息发送者实例
* @throws MQClientException MQ客户端异常
*/
@Bean
public DefaultMQProducer defaultProducer() throws MQClientException {
log.info("初始化RocketMQ");
DefaultMQProducer defaultMQProducer = new DefaultMQProducer();
//该生产者所在group
groupdefaultMQProducer.setProducerGroup(producerGroup);
//如果是 namesrvAddr形成集群模式 以 ; 分开 "IP1:9876;IP2:9876;"
defaultMQProducer.setNamesrvAddr(nameSrvAddr);
//是否走Vip通道
defaultMQProducer.setVipChannelEnabled(false);
//消息同步发送失败重试次数
defaultMQProducer.setRetryTimesWhenSendFailed(3);
//消息异步发送失败重试次数
defaultMQProducer.setRetryTimesWhenSendAsyncFailed(3);
// 消息超过默认字节4096后进行压缩
// defaultMQProducer.setCompressMsgBodyOverHowmuch(4096);
// 最大消息配置,默认128k
// defaultMQProducer.setMaxMessageSize(12);
// 自动创建服务器不存在的Topic,默认创建的队列数
// defaultMQProducer.setDefaultTopicQueueNums(4);
//开启线程
defaultMQProducer.start();
return defaultMQProducer;
}
}
private DefaultMQProducer defaultMQProducer;
//设置消息 发送到哪个topic中 内容以二进制的方式发送
message = new Message(topic, JSON.toJSONString(rocketEvent).getBytes());
//tog为topic下的二级分类
//message = new Message(topic,rocketEvent.getTag(), JSON.toJSONString(rocketEvent).getBytes());
//发送消息
SendResult sendResult = defaultMQProducer.send(message);
//开启生产者
defaultMQProducer.start();
4:RocketMq的comsumer 说明与核心代码
//特别注意 因为需要使用@Component注解
//因此在项目启动时 就会执行
//所以没有办法通过配置文件直接获取配置参数(待确认)
@Slf4j
@Component
public class RocketMqConsumerListener {
private String pay_consumer_group = "pay_consumer_group";
private String nameSrvAddr = "47.113.101.241:9876";
private String topic = "pay_test_topic";
public RocketMqConsumerListener() throws MQClientException {
//创建DefaultMQPushConsumer
DefaultMQPushConsumer defaultMQPushConsumer = creatDefaultMQPushConsumer();
//监听器
defaultMQPushConsumer.registerMessageListener((MessageListenerConcurrently) (messages, context) -> {
Message msg = messages.get(0);
try {
log.info(" Receive New Messages: {},{} ",Thread.currentThread().getName(), new String(messages.get(0).getBody()));
String topic = msg.getTopic();
String tags = msg.getTags();
String keys = msg.getKeys();
String body = new String(msg.getBody(), "utf-8");
log.info("topic=" + topic + ", tags=" + tags + ", keys = " + keys + ", msg = " + body);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
} catch (UnsupportedEncodingException e) {
log.info("rocket消费者异常:{}",e.getMessage(),e);
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
});
log.info("consumer start");
defaultMQPushConsumer.start();
}
/**
* 配置DefaultMQPushConsumer参数
* @throws MQClientException
*/
private DefaultMQPushConsumer creatDefaultMQPushConsumer() throws MQClientException {
DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer();
//如果是 namesrvAddr形成集群模式 以 ; 分开 "IP1:9876;IP2:9876;"
defaultMQPushConsumer.setNamesrvAddr(nameSrvAddr);
//设置消费者存放的组
defaultMQPushConsumer.setConsumerGroup(pay_consumer_group);
//订阅的主题 topic
defaultMQPushConsumer.subscribe(topic, "*");
// 消费者消费模式
// defaultMQPushConsumer.setMessageModel(CLUSTERING);
// offsetStore:消息消费进度存储器 (现在已经不允许设置)
// defaultMQPushConsumer.setOffsetStore(RemoteBrokerOffsetStore);
//
// 队列初次创建时候 从哪里开始消费
// defaultMQPushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
//
// 负载均衡策略算法 消费者分配队列的算法 默认就是AllocateMessageQueueAveragely 即取模平均分配
// defaultMQPushConsumer.setAllocateMessageQueueStrategy(new AllocateMessageQueueAveragely());
//
// 最小消费线程池数量
// defaultMQPushConsumer.setConsumeThreadMin(20);
// 最大消费线程池数量
// defaultMQPushConsumer.setConsumeThreadMax(20);
//
// 一次性拉取数据的数量
// defaultMQPushConsumer.setPullBatchSize(32);
return defaultMQPushConsumer;
}
}
5:连接RocketMq遇上的问题
1:MQClientException: No route info of this topic:
解决方法1:
broker.conf文件 (设置为自动创建topic)
autoCreateTopicEnable=true
注意 服务端和客户端的RocketMq版本号要一致 (否则无效)
解决方法2:
在Console控制台上创建一个topic
2:控制台查看不了数据 提示连接10909错误
Rocket的broker默认开启VIP通道
阿里云安全组开启该端口
项目连接
请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/hesuijin-study-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/hesuijin-study-project.git
rocketmq-module项目模块下