简介
RocketMQ是一款低延迟、高可靠、可伸缩、易于使用的消息中间件。支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型,支持拉(pull)和推(push)两种消息模式等特性。
安装与服务
1. 下载安装包(如:rocketmq-all-4.3.1-bin-release.zip)
https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.3.1/
2. 解压
>unzip rocketmq-all-4.3.1-bin-release.zip
3. 启动nameserver
>cd rocketmq-all-4.3.1-bin-release
>nohup sh bin/mqnamesrv &
4. 启动broker
>nohup sh bin/broker -n localhost:9876 &
5. 停止服务
>sh bin/mqshutdown broker
消息生产者
生产者的作用就是将消息发送到 MQ,生产者本身既可以产生消息,如读取文本信息等。也可以对外提供接口,由外部应用来调用接口,再由生产者将收到的消息发送到 MQ。
在编写程序的时候需要注意以下几个参数:
Producer Group : 生产者组就是多个发送同一类消息的生产者称之为一个生产者组
Topic : 消息逻辑分类,比如订单类、库存类的消息
Name Server : 路由信息,通信的地址及端口号
Tag : 标签是topic的进一步细化
Key : 消息的唯一键值,业务上可以通过key查找消息
Message : 消息载体,主要用于存储实际数据
消息消费者
消费 MQ 上的消息的应用程序就是消费者,至于消息是否进行逻辑处理,还是直接存储到数据库等取决于业务需要。
Consumer Group : 消费者组,和生产者类似,消费同一类消息的多个 consumer 实例组成一个消费者组。
生产者、消费者Demo
maven
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.0</version>
</dependency>
RocketMQProducerHelper.java
import org.apache.log4j.Logger;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import java.util.List;
public class RocketMQProducerHelper {
private static Logger LOG = Logger.getLogger(RocketMQProducerHelper.class);
private static String topic;
private static RocketMQProducerHelper instance = null;
private DefaultMQProducer producer;
private RocketMQProducerHelper(String nameServer, String topicName, String groupID) {
try {
if (nameServer != null && topicName != null && groupID != null) {
topic = topicName;
producer = new DefaultMQProducer(groupID);
producer.setRetryTimesWhenSendFailed(4);
producer.setRetryAnotherBrokerWhenNotStoreOK(true);
producer.setNamesrvAddr(nameServer);
producer.start();
LOG.info("producer started...");
} else {
LOG.error("parameter init error");
throw new Exception("parameter init error");
}
} catch (Exception e) {
LOG.error("producer init error...");
throw new RuntimeException(e);
}
}
public static RocketMQProducerHelper getInstance(String nameServer, String topic, String groupID) {
if(instance == null) {
synchronized (RocketMQProducerHelper.class) {
if (instance == null) {
instance = new RocketMQProducerHelper(nameServer, topic, groupID);
}
}
}
return instance;
}
public SendResult send(byte[] data) {
return send(topic, null, null, data, null);
}
public SendResult send(String tag, byte[] data) {
return send(topic, tag, null, data, null);
}
public SendResult send(String tag, String key, byte[] data) {
return send(topic, tag, key, data, null);
}
public SendResult send(String topic, String tag, String key, byte[] data, final MessageQueueSelector selector) {
SendResult sendResult = null;
try {
Message msg;
if (tag == null || tag.length() == 0) {
msg = new Message(topic, data);
} else if (key == null || key.length() == 0) {
msg = new Message(topic, tag, data);
} else {
msg = new Message(topic, tag, key, data);
}
if (selector != null) {
sendResult = producer.send(msg, new MessageQueueSelector() {
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
return selector.select(mqs, msg, arg);
}
}, key);
} else {
sendResult = producer.send(msg);
}
} catch (Exception e) {
e.printStackTrace();
LOG.error("Send message error");
}
return sendResult;
}
}
1. 生产者Producer
public class Producer {
public static void main(String[] args) {
String nameServer = "localhost:9876";
String topic = "test";
String groupID = "groupid";
String tag = "TAG";
RocketMQProducerHelper producer = RocketMQProducerHelper.getInstance(nameServer, topic, groupID);
for (int i=0; i<10; i++) {
String key = "1000"+i;
String value = "value="+i;
producer.send(tag, key, value.getBytes());
}
}
}
2. 消费者Consumer
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;
public class Consumer {
public static void main(String[] args) throws MQClientException {
String nameServer = "localhost:9876";
String groupID = "groupid";
String topic = "test";
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(groupID);
consumer.setNamesrvAddr(nameServer);
consumer.subscribe(topic, "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
ConsumeConcurrentlyContext context) {
for(MessageExt msg : msgs) {
String result = Bytes.toString(msg.getBody());
System.out.println("--------------------msg="+result);
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
}
}