簡述
1.目前有很多系統業務都非常繁雜,傳統模式舉例–客戶新註冊賬號,步驟如下:
1.1 保存表單,插入數據庫,此時客戶註冊的身份已經存在系統中 ;《客戶比較關心事情》
1.2 調用信息中臺<另外的系統>接口,發送郵件通知,或者發送其他消息通知;《客戶不關心的事情》
1.3 other;《客戶不關心的事情》
上述 1~3步都是同步執行(有可能有很多步驟),客戶註冊界面要等所有步驟執行完才收到註冊成功通知,假如某個步驟出錯,則有可能導致註冊失敗(具體要看設計這個程序的人怎麼做),此時客戶的體驗就會非常不好。
那麼換一種方式:假如步驟1.1完成後就返回註冊成功通知,客戶就能直接進入系統,而且同時1.2~以後的步驟後臺異步處理,不影響客戶登錄系統正常使用,這種體驗是不是更好呢?
廢話不多說,進入主題
以下例子的使用環境:
1.spring-boot 2.1.6
2.spring-boot-starter-data-redis 2.1.6
3.系統A,系統B,使用同一個redis服務器。
4.系統A爲發佈者,系統B爲訂閱者(消費者)
引入依賴:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
系統A的代碼
在你需要發送消息的業務方法中,調用以下方法 sendMsgToRedis
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 發佈消息
* @param topic
* @param object
*/
public void sendMsgToRedis(String topic, Object object) {
stringRedisTemplate.convertAndSend(topic, object);
}
系統B的代碼
/**
* 說明:
* redis 消息監聽配置
* @author wangxingquan
**/
@Component
public class RedisListenerConfig {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private SyncDocumentService syncDocumentService;
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//下面的topic與系統A
container.addMessageListener(listenerAdapter, new PatternTopic(RedisMsgType.REDIS_DOCUMENT_SYNC_TOPIC.getRedisKey()));
return container;
}
@Bean
MessageListenerAdapter listenerAdapter() {
//使用下面service中的handleMessage
return new MessageListenerAdapter(syncDocumentService, "handleMessage");
}
}
//SyncDocumentService 中的handleMessage方法定義:
@Service
public class SyncDocumentService {
private Logger logger = LoggerFactory.getLogger(this.getClass());
public void handleMessage(String jsonStr) {
logger.info("文檔同步消息訂閱頻道有新消息進來,參數:{}", jsonStr);
logger.info(jsonStr);
//開始處理同步業務邏輯
}
}
測試結果
系統A發佈:
String json = JSONObject.toJSONString(idList);
logger.info("開始往redis頻道發送消息...");
redisService.sendMsgToRedis(ConstantRedis.REDIS_SCHEDULE_QUEUE_KEY.SEND_DOCUMENT_SYNC_SERVICE.key, json);
logger.info("往redis頻道發送消息成功...");
系統B接收結果:
消息傳遞和接收成功,接下來就是邏輯的處理了。