RocketMQ入門實例

RocketMQ入門實例

RocketMQ官網:http://rocketmq.apache.org

  1. 從RocketMQ官網下載rocketmq,解壓到/usr/local/rocketmq-all-4.4.0目錄。

  2. 啓動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
    
  3. 啓動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
    
  4. 在spring項目中引入依賴

            <dependency>
                <groupId>org.apache.rocketmq</groupId>
                <artifactId>rocketmq-client</artifactId>
                <version>4.4.0</version>
            </dependency>
    
  5. 編寫代碼

    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();
        }
    
    }
    
  6. 啓動項目,訪問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'}]]]
    
  7. 關閉RocketMQ

sh bin/mqshutdown broker
sh bin/mqshutdown namesrv

記錄一個坑:直接下載release包然後啓動mq的話,可能會卡死。我的筆記本內存8g,在啓動Broker的時候就直接卡死了,後來試了幾次發現默認的jvm參數都很大,堆區namesrv是4g,broker是8g,所以超過了可用內存直接卡死了。所以一定記得要修改相應配置,避免跳坑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章