RocketMQ入门实例
RocketMQ官网:http://rocketmq.apache.org
-
从RocketMQ官网下载rocketmq,解压到/usr/local/rocketmq-all-4.4.0目录。
-
启动NameServer
adam@adam-G3-3579:/usr/local/rocketmq-all-4.4.0$ nohup sh bin/mqnamesrv & [1] 4888 adam@adam-G3-3579:/usr/local/rocketmq-all-4.4.0$ nohup: 忽略输入并把输出追加到'nohup.out' adam@adam-G3-3579:/usr/local/rocketmq-all-4.4.0$ tail -f ~/logs/rocketmqlogs/namesrv.log 2019-11-09 16:04:15 INFO main - tls.client.keyPath = null 2019-11-09 16:04:15 INFO main - tls.client.keyPassword = null 2019-11-09 16:04:15 INFO main - tls.client.certPath = null 2019-11-09 16:04:15 INFO main - tls.client.authServer = false 2019-11-09 16:04:15 INFO main - tls.client.trustCertPath = null 2019-11-09 16:04:16 INFO main - Using OpenSSL provider 2019-11-09 16:04:16 INFO main - SSLContext created for server 2019-11-09 16:04:16 INFO NettyEventExecutor - NettyEventExecutor service started 2019-11-09 16:04:16 INFO FileWatchService - FileWatchService service started 2019-11-09 16:04:16 INFO main - The Name Server boot success. serializeType=JSON
-
启动Broker
adam@adam-G3-3579:/usr/local/rocketmq-all-4.4.0$ nohup sh bin/mqbroker -n localhost:9876 & [2] 6029 adam@adam-G3-3579:/usr/local/rocketmq-all-4.4.0$ nohup: 忽略输入并把输出追加到'nohup.out' adam@adam-G3-3579:/usr/local/rocketmq-all-4.4.0$ tail -f ~/logs/rocketmqlogs/broker.log 2019-11-09 16:05:55 WARN main - Load default discard message hook service: DefaultTransactionalMessageCheckListener 2019-11-09 16:05:55 INFO main - The broker dose not enable acl 2019-11-09 16:05:55 INFO FileWatchService - FileWatchService service started 2019-11-09 16:05:55 INFO PullRequestHoldService - PullRequestHoldService service started 2019-11-09 16:05:55 INFO brokerOutApi_thread_1 - register broker to name server localhost:9876 OK 2019-11-09 16:05:55 INFO main - Start transaction service! 2019-11-09 16:05:55 INFO main - The broker[adam-G3-3579, 192.168.0.105:10911] boot success. serializeType=JSON and name server is localhost:9876 2019-11-09 16:06:05 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes 2019-11-09 16:06:05 INFO BrokerControllerScheduledThread1 - Slave fall behind master: 185493 bytes 2019-11-09 16:06:05 INFO brokerOutApi_thread_2 - register broker to name server localhost:9876 OK
-
在spring项目中引入依赖
<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.4.0</version> </dependency>
-
编写代码
RocketmqProducer.java
@Component @Slf4j public class RocketMqProducer { private DefaultMQProducer producer = new DefaultMQProducer("producer_group"); { producer.setNamesrvAddr("localhost:9876"); try { producer.start(); } catch (MQClientException e) { log.error("producer start error", e); } } public boolean sendMessageByTopicTagContent(String topic, String tag, String message) { log.info("sendMessageByTopicTagContent(topic={}, tag={}, message={})", topic, tag, message); try { Message msg =new Message(topic, tag, message.getBytes(RemotingHelper.DEFAULT_CHARSET)); SendResult sendResult = producer.send(msg); log.info("sendResult={}", sendResult); } catch (MQClientException e) { e.printStackTrace(); } catch (RemotingException e) { e.printStackTrace(); } catch (MQBrokerException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } log.info("sendMessageByTopicTagContent(topic={}, tag={}, message={})", topic, tag, message); return true; } }
RocketmqConsumer.java
@Component @Slf4j public class RocketMqConsumer { private DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("producer_group"); { consumer.setNamesrvAddr("localhost:9876"); try { consumer.subscribe("topicA","*"); consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { log.info("Thread[{}] receive message [{}]", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer.start(); } catch (MQClientException e) { log.error("订阅失败", e); } } }
RocketmqController.java
@RestController @RequestMapping("/mq") public class RocketMqController { @Autowired private RocketMqProducer rocketMqProducer; @Autowired private RocketMqConsumer rocketMqConsumer; @RequestMapping(value = "/produce", method = RequestMethod.GET) public JSONObject produce(@RequestParam String topic) { rocketMqProducer.sendMessageByTopicTagContent(topic, "1234", "Hello world"); //topic tag msg return new JSONObject(); } }
-
启动项目,访问localhost:8080/spring/mq/produce?topic=topicA,
可以看到控制台上输出日志,producer发送了消息并且consumer成功的接收到了。
16:12:35.708 [http-nio-8080-exec-7] INFO root.rocketmq.RocketMqProducer - sendMessageByTopicTagContent(topic=topicA, tag=1234, message=Hello world) 16:12:35.901 [http-nio-8080-exec-7] INFO root.rocketmq.RocketMqProducer - sendResult=SendResult [sendStatus=SEND_OK, msgId=C0A8006926966983F2A02CAD50350000, offsetMsgId=C0A8006900002A9F000000000002D495, messageQueue=MessageQueue [topic=topicA, brokerName=adam-G3-3579, queueId=3], queueOffset=7] 16:12:35.902 [http-nio-8080-exec-7] INFO root.rocketmq.RocketMqProducer - sendMessageByTopicTagContent(topic=topicA, tag=1234, message=Hello world) 16:12:36.344 [ConsumeMessageThread_1] INFO root.rocketmq.RocketMqConsumer - Thread[ConsumeMessageThread_1] receive message [[MessageExt [queueId=3, storeSize=170, queueOffset=7, sysFlag=0, bornTimestamp=1573287155766, bornHost=/192.168.0.105:39590, storeTimestamp=1573287155770, storeHost=/192.168.0.105:10911, msgId=C0A8006900002A9F000000000002D495, commitLogOffset=185493, bodyCRC=198614610, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='topicA', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=8, CONSUME_START_TIME=1573287156344, UNIQ_KEY=C0A8006926966983F2A02CAD50350000, WAIT=true, TAGS=1234}, body=[72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100], transactionId='null'}]]]
-
关闭RocketMQ
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
记录一个坑:直接下载release包然后启动mq的话,可能会卡死。我的笔记本内存8g,在启动Broker的时候就直接卡死了,后来试了几次发现默认的jvm参数都很大,堆区namesrv是4g,broker是8g,所以超过了可用内存直接卡死了。所以一定记得要修改相应配置,避免跳坑。