写代码期间遇到一个问题,在我自己的服务里面,对一个送礼的消息需要进行多个业务操作,而且后期还要继续增加针对送礼事件的业务操作
我的第一反应直接接收送礼消息,然后在消息处理器中累加代码,但是考虑到服务的可维护性和热插拔性,这样只会在业务迭代的过程中累积下来过多的废旧代码,不利于代码的维护和后期开发,为了不给以后埋坑,思考许久,设计了一个小小的消息分发器,分享给大家
public interface SendGiftEventProcessor {
void processSendGiftEvent(SendGiftEventevent);
@Component
class Dispatcher {
private static final Logger LOGGER = LoggerFactory.getLogger(Dispatcher.class);
@Autowired
private List<SomeEventProcessor> processors;
//消息触发
@Event("SEND_GIFT")
void onSomeEvent(SendGiftEvent event) {
for (SomeEventProcessor processor : processors) {
try {
processor.processSomeEvent(event);
} catch (Exception e) {
LOGGER.error("process SomeEvent error.", e);
}
}
}
}
}
/**
* @author HMAN
* @createTime 2018/4/23
* @description 排行榜-->送礼消息逻辑实现
*/
@Component
public class RankSendGiftEventProcessor implements SendGiftEventProcessor {
@Override
public void processSendGiftEvent(SendGiftEvent event) {
}
}
/**
* @author HMAN
* @createTime 2018/4/23
* @description 任务-->送礼消息逻辑实现
*/
@Component
public class TaskSendGiftEventProcessor implements SendGiftEventProcessor {
@Override
public void processSendGiftEvent(SendGiftEvent event) {
}
}
设计思路: 定义一个接口SomeEventProcessor ,内部写一个内部类处理器Dispatcher ,用来接收并处理消息,在Dispatcher 内部使用spring的依赖注入,将所有实现SomeEventProcessor 接口的实现类注入到处理器中,每次处理器接收到这个mq事件之后,循环processors,并且调用processSomeEvent方法,即可实现消息的分发处理
如代码所示:成功将排行榜和任务两个同时针对送礼消息的消息处理器接藕,在日后维护中,若不需要维护排行榜或者任务,则直接删掉class即可