作为生产者角色的消息客户端,还需要接收来自业务系统的事件,然后将其转换为请求消息,发送给服务端。
这里有两种方案,方案1是业务系统与消息客户端独立部署,业务系统通过调用消息客户端暴露的rest服务来推送业务数据;方案2是消息客户端内置于业务系统中,业务系统直接调用消息客户端服务层的方法。
这里我们采用方案1,做一个控制器,对外接收rest请求,业务系统传入事件(必填)与单据标识(非必填,某些事件为全局,无标识的概念)。前面提过,我们约定将事件的编码与消息主题编码保持一致。
/**
* 接收事件控制器
* @author wqliu
* @date 2022-1-18 16:14
**/
@RestController
@RequestMapping("/event")
public class ReceiveEventController {
//TODO:方便测试,暂时使用get请求,后续考虑调整为post
@GetMapping
public String receive(String event,String id){
//数据验证
if(StringUtils.isBlank(event)){
throw new RuntimeException("事件不能为空");
}
//根据消息主题查找发送器
try {
RequestMessageSender messageSender = (RequestMessageSender) MessageSenderFactory.createSender(event);
messageSender.sendMessage(id);
return "ok";
}catch (MessageException e){
throw new RuntimeException(e.getMessage());
}
}
}
当我们模拟业务系统(生产者)请求地址http://localhost:10001/event?event=lms.transportbill.consignmentbill.create&id=1时,就会触发消息客户端向服务器端推送一条消息。