Java游戏服务器开发之十一-- 将消息分发给线程队列执行及路由功能

添加的类有:
com.lizhaoblog.base.concurrent.commond.ICommand
com.lizhaoblog.base.concurrent.commond.IHandler
com.lizhaoblog.base.concurrent.dictionary.IMessageDictionary
com.lizhaoblog.base.concurrent.handler.AbstractHandler
com.lizhaoblog.base.network.processor.IProcessor
com.lizhaoblog.server.biz.constant.CommonValue
com.lizhaoblog.server.biz.dictionary.MessageHandlerDictionary
com.lizhaoblog.server.biz.handler.TestFirstHandler
com.lizhaoblog.server.core.processor.LogicProcessor;
  修改的类有
NetworkConsumer



  这次改的东西比较多了。
我们一个个来看,我们的主线目标,将消息通过不同的id来找到对应的执行类(handler/control),然后扔到线程池中执行。
这样我们写的话就是2个, 一个将消息放到线程池中执行,一个是消息通过不同的id来找到对应的执行类(handler/control)

所以我们先有一个线程池队列,使用IProcessor,里面只有一个方法process,然后看到实现类LogicProcessor,先是声明了一个具体的线程池变量(ThreadPoolExecutor),里面的方法就是执行线程具体线程(executor.execute(handler);)
线程池要执行的需要是一个线程,这个线程需要我们自己实现,所以我们写一个接口ICommand继承Runnable,然后后面的子类继承于ICommand。
在ICommand中就2个方法,一个是执行操作doAction,一个是runable的run方法。这2个都写着,让子类实现就好。
再看下IHandler,IHandler是ICommand的子类,是我们现在所有handler的接口,因为我们是消息传输,肯定会有message和session,所以就在里面写了get/set方法。
但我们写上多个handler后,其实会发现里面的执行逻辑都是一样的,就是在run里面调用doAction方法。就写了一个AbstractHandler,声明
protected T message; protected V param;,然后再run方法里面调用doAction
后面我们要写handler的话(TestFirstHandler),只要继承AbstractHandler然后实现里面的doAction方法
  
但我们的消息传输上来,我们不确定要通过哪个handler来执行,这时候就需要一个消息字典来进行区分IMessageDictionary(就像web中使用网址区分url一样),具体实现MessageHandlerDictionary就是管理一个map,然后根据键来获取handler。

  可以看下具体代码的实现了

com.lizhaoblog.base.concurrent.commond.ICommand

/*
 * Copyright (C), 2015-2018
 * FileName: ICommand
 * Author:   zhao
 * Date:     2018/6/25 15:37
 * Description: 继承runable接口,可以放在线程池中执行
 * History:
 *           

 

com.lizhaoblog.base.concurrent.commond.IHandler

 

/*
 * Copyright (C), 2015-2018
 * FileName: IHandler
 * Author:   zhao
 * Date:     2018/6/25 15:35
 * Description: 队列执行器
 * History:
 *           

 

com.lizhaoblog.base.concurrent.dictionary.IMessageDictionary

 

/*
 * Copyright (C), 2015-2018
 * FileName: IMessageDictionary
 * Author:   zhao
 * Date:     2018/6/25 14:51
 * Description: 消息字典接口
 * History:
 *           

 

com.lizhaoblog.base.concurrent.handler.AbstractHandler

 

/*
 * Copyright (C), 2015-2018
 * FileName: AbstractHandler
 * Author:   zhao
 * Date:     2018/6/25 15:54
 * Description: 继承ICommand,将一些通用的处理过程写在里面
 * History:
 *           

 

com.lizhaoblog.base.network.processor.IProcessor

 

/*
 * Copyright (C), 2015-2018
 * FileName: IProcessor
 * Author:   zhao
 * Date:     2018/6/25 15:34
 * Description: 进程接口
 * History:
 *           

 

com.lizhaoblog.server.biz.constant.CommonValue

 

/*
 * Copyright (C), 2015-2018
 * FileName: CommonValue
 * Author:   zhao
 * Date:     2018/6/25 16:45
 * Description: 放置常量
 * History:
 *           

 

com.lizhaoblog.server.biz.dictionary.MessageHandlerDictionary

 

/*
 * Copyright (C), 2015-2018
 * FileName: MessageHandlerDictionary
 * Author:   zhao
 * Date:     2018/6/25 16:39
 * Description: 消息字典绑定
 * History:
 *           

 

com.lizhaoblog.server.biz.handler.TestFirstHandler

 

/*
 * Copyright (C), 2015-2018
 * FileName: TestFirstHandler
 * Author:   zhao
 * Date:     2018/6/25 16:24
 * Description: 用于测试的第一个handler
 * History:
 *           


com.lizhaoblog.server.core.processor.LogicProcessor;

 

/*
 * Copyright (C), 2015-2018
 * FileName: LogicProcessor
 * Author:   zhao
 * Date:     2018/6/25 16:57
 * Description: 具体的消息处理器,进程
 * History:
 *           

NetworkConsumer

 

 

 

/*
 * Copyright (C), 2015-2018
 * FileName: INetworkConsumer
 * Author:   zhao
 * Date:     2018/6/23 21:06
 * Description: 网络消息处理器
 * History:
 *           

 


上面的代码在码云上 https://gitee.com/lizhaoandroid/JgServer
可以加qq群一起探讨Java游戏服务器开发的相关知识 676231564

 

你可能感兴趣的:(java,java游戏服务器开发,Java游戏服务器开发)