开始前需要简单了解一下,RocketMq的原理,参看之前的一篇文章 rokcetmq
在正式开发中。我们主要关注两个方面,发送者和接收者。
发送者
我们创建一个 DefaultMQProducer
的Bean,在Bean中设置mq的nameserver,账号密码等(配置可以存储的disconf中)。在需要使用的地方注入bean,使用其send方法,传入要发送的数据即可。
@Bean(name = "rocketMqProducer")
public DefaultMQProducer defaultMqProducer() throws MQClientException {
String accessKey = xxx;
String secretKey = xxx;
DefaultMQProducer producer;
if (StringUtils.isNotEmpty(accessKey) && StringUtils.isNotEmpty(secretKey)) {
producer = new DefaultMQProducer(producerGroup,
new AclClientRPCHook(new SessionCredentials(accessKey, secretKey)));
producer.setAccessChannel(AccessChannel.CLOUD);
} else {
producer = new DefaultMQProducer(producerGroup);
producer.setAccessChannel(AccessChannel.LOCAL);
}
producer.setNamesrvAddr(namesrvAddr");
producer.setSendMsgTimeout(rocketmq.send.time.out");
producer.start();
return producer;
}
@Autowired
private DefaultMQProducer rocketMqProducer;
message = new Message(topicName, tagName, content.getBytes(RemotingHelper.DEFAULT_CHARSET));
rocketMqProducer.send(message)
接收者
接收者是如何知道发送方发来了数据呢?就需要在接收者这里设置一个监听器,在监听器里来处理数据。去创建一个DefaultMQPushConsumer的Bean,在Bean种设置nameserver,监听器,topic,tag等,调用start方法就启动了。
@Component
public class CosumerListener implements MessageListenerConcurrently {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgList, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
try {
for (MessageExt message : msgList) {
String body=message.getBody();
}
} catch (Exception e) {
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}
@Autowired
private CosumerListener cosumerListener;
private DefaultMQPushConsumer registerCommon(String cosumerGroupId, MessageModel messageModel, String topic, String tag) throws MQClientException {
String accessKey = xxxx;
String secretKey = xxxx;
DefaultMQPushConsumer consumer;
if (StringUtils.isNotEmpty(accessKey) && StringUtils.isNotEmpty(secretKey)) {
RPCHook rpcHook = new AclClientRPCHook(new SessionCredentials(accessKey, secretKey));
consumer = new DefaultMQPushConsumer(cosumerGroupId, rpcHook, new AllocateMessageQueueAveragely(), true, null);
// 自建服务=AccessChannel.LOCAL,云MQ=AccessChannel.CLOUD)
consumer.setAccessChannel(AccessChannel.CLOUD);
} else {
consumer = new DefaultMQPushConsumer(cosumerGroupId, true);
// 自建服务=AccessChannel.LOCAL,云MQ=AccessChannel.CLOUD)
consumer.setAccessChannel(AccessChannel.LOCAL);
}
consumer.setInstanceName(cosumerGroupId);
consumer.setNamesrvAddr(namesrvAddr);
consumer.setMessageModel(messageModel);
consumer.subscribe(topic, tag);
return consumer;
}
@Bean
public DefaultMQPushConsumer myConsumer() throws MQClientException {
DefaultMQPushConsumer consumer = registerCommon(groudId,messageModel.topic,tag);
consumer.registerMessageListener(cosumerListener);
consumer.start();
return consumer;
}