Jtcp-core自定义实现一个IOC容器,可对消息处理handler进行管理,并通过注解的方式制定消息转发机制 首先遍历main函数下所有class类,并缓存所有指定注解@JtcpComponet的class类对象并注入sproutBeanFactory实例工厂
/** * 缓存所有指定注解的class<?>类对象 * @param packageName * @return * @throws Exception */ public static Map<String, Class<?>> getBean(String packageName) throws Exception { if (componetMap == null) { Set<Class<?>> clsList = getClasses(packageName); if (clsList == null || clsList.isEmpty()) { return componetMap; } componetMap = new HashMap<>(16); for (Class<?> cls : clsList) { Annotation annotation = cls.getAnnotation(JtcpComponet.class); if (annotation == null) { continue; } JtcpComponet sproutComponet = (JtcpComponet) annotation; componetMap.put(sproutComponet.value() == null ? cls.getName() : sproutComponet.value(), cls); } } return componetMap; }
实现方法路由,通过@JtcpRoute并结合上面定义链接、断开、消息接收、超时、异常等事件枚举类型,把触发的网络通信事件转发至指定的业务方法中处理
/** * 根据注解调用方法 * @param method * @param annotation * @param args * @throws Exception */ public void invoke(RouteEnum routeEnum, Object[] args) throws Exception { Method method = RouterScanner.getInstance().routeMethod(routeEnum); if (method == null) { return; } Object bean = applicationContext.getBean(method.getDeclaringClass().getName()); if (args == null) { method.invoke(bean); } else { method.invoke(bean, args); } }
channelRead接收数据并转发
/** * 接收消息事件 */ @Override public void channelRead(ChannelHandlerContext ctx, Object source) { try { byte[] dataBytes = (byte[]) source; JtcpContext sproutContext = new JtcpContext(ctx, dataBytes); RouteMethod.getInstance().invoke(RouteEnum.OnRecevie, new Object[] { sproutContext }); } catch (Exception ex) { } }
推荐阅读
- 利用Pandas处理数据 缺失值的处理 数据库的使用 python-数据描述与分析2
- Docker | 镜像浅析,以及制作自己的镜像
- 大雁的雁拼音是 大雁的拼音是什么
- 华为nova8和nova8pro的区别_华为nova8和nova8pro哪个值得买
- 亲爱的汉修先生主要内容 亲爱的汉修先生电子书
- 大朗房屋出租|如何查找需要租房子的人呢
- 狼人杀怎样才能玩的好(狼人杀怎么玩难度高)
- 狼人杀现场怎么玩(十大最恐怖的狼人杀)
- 狼人杀全面教程(狼人杀的教程)
- 狼人杀游戏怎么玩(狼人杀的危害有多大)