实现目标:利用接口编程,接口有不同的实现,然后直接利用接口进行分发就行了,避免写大段的if-elseif语句,如果可选比较多,如果都写成if-elseif就显得非常不优雅,而且同一个方法也会特别臃肿。我有两种实现的想法,第一种是利用反射机制,代码示例:
public void receive(String message) {
("接收到来自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) {
("接收到来自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) {
("接收到来自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 来进行管理,这样在开发中能够使得资源更加合理化。