SpringBoot-2.X 學習筆記09 整合RocketMQ

1 下載部署 RocketMQ

1.1 Windows 系統

1.1.1 下載 Apache RocketMQ-4.5.2

進入 Apache RocketMQ官網 下載你需要的版本的二進制或者源碼(需要手動編譯)。
在這裏插入圖片描述
如果選擇 Source 需要自己編譯

1.1.2 安裝 Apache RocketMQ-4.5.2

解壓或者編譯好 RocketMQ-4.5.2,並將對應的 RocketMQ 文件目錄添加到 Windows 環境變量中。
Windows 配置 RocketMQ 環境變量

1.1.3 啓動 Apache RocketMQ-4.5.2

#  切換到 RocketMQ 的 bin 目錄
cd C:\Users\Administrator\Videos\RocketMQ-4.5.2\bin
# 啓動 RocketMQ nameserver
start mqnamesrv.cmd
# 啓動 RocketMQ broker
start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true

# 關閉 RocketMQ nameserver
mqshutdown.cmd namesrv
# 關閉 RocketMQ broker
mqshutdown.cmd broker

1.1.4 Apache RocketMQ-4.5.2 nameserver 啓動成功

RocketMQ nameserver

1.1.5 Apache RocketMQ-4.5.2 broker 啓動成功

RocketMQ broker

1.2 非 Windows 系統

1.2.1 進入 Apache RocketMQ 官網

進入 Apache RocketMQ官網
在這裏插入圖片描述

1.2.2 參考 Apache RocketMQ 快速開始

參考 Apache RocketMQ 快速開始
在這裏插入圖片描述

2 安裝 RocketMQ 可視化工具

2.1 使用Git克隆或者直接下載 Apache RocketMQ 工具集

使用Git克隆或者直接下載 Apache RocketMQ 工具集
在這裏插入圖片描述
在這裏插入圖片描述

2.2 選擇 rocketmq-console 的目錄

2.2.1 修改 rocketmq-console 的 application.properties。

切換到 rocketmq-console 的目錄,找到 application.properties ,按自己的實際情況修改 rocketmq-console 的配置。

server.contextPath=
server.port=8077

### SSL setting
#server.ssl.key-store=classpath:rmqcngkeystore.jks
#server.ssl.key-store-password=rocketmq
#server.ssl.keyStoreType=PKCS12
#server.ssl.keyAlias=rmqcngkey

#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
#set the message track trace topic if you don't want use the default one
rocketmq.config.msgTrackTopicName=
rocketmq.config.ticketKey=ticket

#Must create userInfo file: ${rocketmq.config.dataPath}/users.properties if the login is required
rocketmq.config.loginRequired=false

2.2.2 使用 Maven 編譯 rocketmq-console

切換到 rocketmq-console 的目錄

# 1
cd C:\Users\Administrator\Videos\rocketmq-externals-master\rocketmq-console
# 2
mvn clean package -Dmaven.test.skip=true

2.2.3 啓動 rocketmq-console

編譯完成後 rocketmq-console 的目錄會多出一個 target 目錄,進入 target 目錄,使用Java CMD 命令運行 rocketmq-console

cd target
java -jar rocketmq-console-ng-1.0.1.jar

2.2.4 rocketmq-console 啓動成功

在這裏插入圖片描述

2.2.5 查看 Apache RocketMQ-4.5.2 啓動狀態

C:\Users\Administrator\Videos\RocketMQ-4.5.2\bin>jps
10056 NamesrvStartup
12424 jar
13160
11228 BrokerStartup
13580 Jps

3 SpringBoot-2.X 整合 RocketMQ

3.1 添加 Apache RocketMQ 依賴

<dependency>
	<groupId>org.apache.rocketmq</groupId>
	<artifactId>rocketmq-client</artifactId>
	<version>4.5.2</version>
</dependency>

3.2 修改 SpringBoot-2.X 的 application.properties 配置

#producer 該應用是否啓用生產者
rocketmq.producer.isOnOff=on

#發送同一類消息的設置爲同一個group,保證唯一,默認不需要設置,rocketmq會使用ip@pid(pid代表jvm名字)作爲唯一標示
rocketmq.producer.groupName=producer

#mq的nameserver地址
rocketmq.producer.namesrvAddr=127.0.0.1:9876

#消息最大長度 默認1024*4(4M)
rocketmq.producer.maxMessageSize=4096

#發送消息超時時間,默認3000
rocketmq.producer.sendMsgTimeout=3000

#發送消息失敗重試次數,默認2
rocketmq.producer.retryTimesWhenSendFailed=2

#consumer 該應用是否啓用消費者
rocketmq.consumer.isOnOff=on
rocketmq.consumer.groupName=test_consumer

#mq的nameserver地址
rocketmq.consumer.namesrvAddr=127.0.0.1:9876

#該消費者訂閱的主題和tags
rocketmq.consumer.topics=test_topic
rocketmq.consumer.consumeThreadMin=20
rocketmq.consumer.consumeThreadMax=64

#設置一次消費消息的條數,默認爲1條
rocketmq.consumer.consumeMessageBatchMaxSize=1

3.3 消息生產者 ProducerConfigure.java

package com.xu.springboot.rocketmq;

import java.util.UUID;

import javax.annotation.PostConstruct;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ProducerConfigure {

	/**
	 * 生產者組名
	 */
	@Value("${rocketmq.producer.groupName}")
	private String producerGroup;

	/**
	 * namesrvAddr
	 */
	@Value("${rocketmq.producer.namesrvAddr}")
	private String namesrvAddr;

	private DefaultMQProducer producer;

	public DefaultMQProducer getProducer() {
		return this.producer;
	}

	@PostConstruct
	public void init() {
		producer = new DefaultMQProducer(producerGroup);
		//NamesrvAddr 有多個 可以 producer.setNamesrvAddr("127.0.0.1:9876;192.168.0.1:9876;192.168.0.2:9876")
		producer.setNamesrvAddr(namesrvAddr);
		producer.setVipChannelEnabled(false);
		//防止 InstanceName 重複
		producer.setInstanceName(UUID.randomUUID().toString());
		try {
			//producer 在使用前必須調用 start() 只能初始化一次
			producer.start();
		} catch (Exception e) {
			e.printStackTrace();
			producer.shutdown();
		}
	}

}

3.4 消息消費者 ConsumerConfigure.java

package com.xu.springboot.rocketmq;

import java.util.UUID;

import javax.annotation.PostConstruct;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ConsumerConfigure {
	
	/**
	 * 消費者者組名
	 */
	@Value("${rocketmq.consumer.groupName}")
	private String consumerGroup;

	/**
	 * namesrvAddr
	 */
	@Value("${rocketmq.consumer.namesrvAddr}")
	private String namesrvAddr;

	private DefaultMQPushConsumer consumer;

	public DefaultMQPushConsumer getProducer() {
		return this.consumer;
	}

	@PostConstruct
	public void consumer() {
		consumer = new DefaultMQPushConsumer(consumerGroup);
		//NamesrvAddr 有多個 可以 producer.setNamesrvAddr("127.0.0.1:9876;192.168.0.1:9876;192.168.0.2:9876")
		consumer.setNamesrvAddr(namesrvAddr);
		//防止 InstanceName 重複
		consumer.setInstanceName(UUID.randomUUID().toString());
		try {
			consumer.subscribe("test_topic", "*");
			consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
			consumer.registerMessageListener((MessageListenerConcurrently)(list,context)->{
				try {
					for(MessageExt msg:list) {
						System.out.println("消費者:MsgId = "+msg.getMsgId()+"\t消費內容: SendStatus = "+new String(msg.getBody(),RemotingHelper.DEFAULT_CHARSET));
					}
				} catch (Exception e) {
					return ConsumeConcurrentlyStatus.RECONSUME_LATER;
				}
				return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
			});
			consumer.start();
		} catch (Exception e) {
			consumer.shutdown();
		}
	}
	
}

3.5 消費者加入到監聽器(HttpSessionIdListener)中測試 Consumer.java

監聽器屬於SpringMVC所以需要在啓動內中加入@ServletComponentScan(“com.xu.springboot.listener”)

package com.xu.springboot.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionIdListener;

import org.springframework.stereotype.Component;

import com.xu.springboot.rocketmq.ConsumerConfigure;

@Component
public class Consumer extends ConsumerConfigure implements HttpSessionIdListener {

	@Override
	public void sessionIdChanged(HttpSessionEvent se, String oldSessionId) {
		super.consumer();
	}

}

3.6 修改啓動類代碼加入 @ServletComponentScan

修改啓動類代碼加入 @ServletComponentScan(“com.xu.springboot.listener”) Application.java

package com.xu.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan("com.xu.springboot.listener")
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}

3.7 編寫控制類 RocketMQController.java

package com.xu.springboot.controller;

import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.xu.springboot.rocketmq.ProducerConfigure;

@Controller
@RequestMapping("/rocketmq")
public class RocketMQController {

	@Autowired
	private ProducerConfigure producer;

	@RequestMapping("/order1")
	@ResponseBody
	public Object order1(String msg,String tag) throws Exception {
		Message message=new Message("test_topic",tag,msg.getBytes(RemotingHelper.DEFAULT_CHARSET));
		SendResult result=producer.getProducer().send(message);
		System.out.println("生產者:MsgId = "+result.getMsgId()+"\t發送狀態:SendStatus = "+result.getSendStatus());
		return result.getSendStatus();
	}

	@RequestMapping("/order2")
	@ResponseBody
	public void order2(String msg,String tag) throws Exception {
		Message message=new Message("test_topic",tag,msg.getBytes(RemotingHelper.DEFAULT_CHARSET));
		producer.getProducer().send(message,new SendCallback() {
			@Override
			public void onSuccess(SendResult sendResult) {
				System.out.println("生產者:MsgId = "+sendResult.getMsgId()+"\t發送狀態:SendStatus = "+sendResult.getSendStatus());
			}
			@Override
			public void onException(Throwable e) {
				System.out.println("發送失敗");
			}
		});
	}

}

3.8 測試及結果

測試1
測試2

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