赞
踩
实现目标:利用接口编程,接口有不同的实现,然后直接利用接口进行分发就行了,避免写大段的if-elseif语句,如果可选比较多,如果都写成if-elseif就显得非常不优雅,而且同一个方法也会特别臃肿。我有两种实现的想法,第一种是利用反射机制,代码示例:
public void receive(String message) { LOGGER.info("接收到来自spider_queue队列的消息:" + message); // TODO: 2018/12/26 先去redis里面判断该message是否已经存在了,而且是没有执行完的,执行完了就会删除,这样也不会造成后续的问题 boolean check = redisService.isMessageCache(message); if (!check){ try { Map<String, Object> messagemap = (Map<String, Object>) JSON.parse(message); Integer messageId = CastUtil.toInteger(messagemap.get("msgid")); // TODO: 2018/12/26 如何实现消息分发功能 尝试1: 通过反射机制实现 Class clz = Class.forName(Consts.msgHandlerMap.get(messageId)); Object obj = clz.newInstance(); Method m = obj.getClass().getDeclaredMethod("handle", String.class); m.invoke(obj, messagemap); }catch (Exception e){ // TODO: 2018/12/26 向web发送消息不合法 } }else { // TODO: 2018/12/26 向web端返回不要重复发送 message 的指令 } } // public class Consts { // msgId -> className public static final Map<Integer, String> msgHandlerMap = new HashMap<Integer, String>(){ { put(MessageType.PROJECT_MESSAGE.getCode(), "com.shengqian.spider.handler.PaChongHandler"); } }; }
或使用接口的方式:
public void receive(String message) { LOGGER.info("接收到来自spider_queue队列的消息:" + message); // TODO: 2018/12/26 先去redis里面判断该message是否已经存在了,而且是没有执行完的,执行完了就会删除,这样也不会造成后续的问题 boolean check = redisService.isMessageCache(message); if (!check){ try { Map<String, Object> messagemap = (Map<String, Object>) JSON.parse(message); Integer messageId = CastUtil.toInteger(messagemap.get("msgid")); // TODO: 2018/12/26 如何实现消息分发功能 尝试1: 通过反射机制实现 Class clz = Class.forName(Consts.msgHandlerMap.get(messageId)); Object obj = clz.newInstance(); if (obj instanceof BaseHandler){ ((BaseHandler) obj).handle(messagemap); } }catch (Exception e){ // TODO: 2018/12/26 向web发送消息不合法 } }else { // TODO: 2018/12/26 向web端返回不要重复发送 message 的指令 } }
另外一种办法是在map里面放入实例:
public static final Map<Integer, BaseHandler> msgHandlerMap = new HashMap<Integer, BaseHandler>(){ { put(MessageType.PROJECT_MESSAGE.getCode(), new PaChongHandler()); } }; // public void receive(String message) { LOGGER.info("接收到来自spider_queue队列的消息:" + message); // TODO: 2018/12/26 先去redis里面判断该message是否已经存在了,而且是没有执行完的,执行完了就会删除,这样也不会造成后续的问题 boolean check = redisService.isMessageCache(message); if (!check){ try { Map<String, Object> messagemap = (Map<String, Object>) JSON.parse(message); Integer messageId = CastUtil.toInteger(messagemap.get("msgid")); // TODO: 2018/12/26 如何实现消息分发功能 尝试1: 通过反射机制实现 // Class clz = Class.forName(Consts.msgHandlerMap.get(messageId)); // Object obj = clz.newInstance(); // if (obj instanceof BaseHandler){ // ((BaseHandler) obj).handle(messagemap); // } // TODO: 2018/12/26 尝试2 在map里面放实例 Consts.msgHandlerMap.get(messageId).handle(messagemap); }catch (Exception e){ // TODO: 2018/12/26 向web发送消息不合法 } }else { // TODO: 2018/12/26 向web端返回不要重复发送 message 的指令 } }
这样就可以用一行代码解决大段的if-elseif了
最后贴一个用spring 进行管理的办法,
这个是我第一天下班向公司的leader请教了之后,leader第二天发给我的版本,用spring 来进行管理,这样在开发中能够使得资源更加合理化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。