前言
在之前的文章中,讲解过 threadmodel,socket tcp ,socket http,log,astart ,scripts;
都是分片讲解,从今天开始,将带大家,一窥 net.sz.framework 框架;
net.sz.framework 框架分为java版本和C#.net 版本,两种语言版本保持高一致性;
net.sz.framework 能做什么呢?
net.sz.framework 是经过多年实践和研究,包括在线项目验证的底层框架,致力于解决框架问题;
让你更轻松,愉快,快捷,方便的开发自己的服务器(无论是游戏,微服务,webapi,数据中心,中转中心,数据集成中心,im服务器等);
让你轻松处理多线程,线程池,线程控制,无需过多考虑多线程的线程安全;
让你无需过多考虑socket传输问题,socket粘包,分包,分包一切;
让你轻松搭建实现基于 tcp协议 服务,基于 http协议 服务;
让你轻松在程序内部实现任意定时器,任意定时触发器;
让你轻松把 .java 和 .cs 的文件作为脚本使用还原你熟悉的脚本无需在去学习其他脚本语言;
让你轻松处理数据库 mysql , sqlite(可继续扩展其他数据源),数据存储,读取的快捷方式;
让你轻松解决高并发文件日志存储结构,记录完整日志数据;
日志处理如果默认参数有修改可以直接调用属性设置也可以用配置文件进行修改
需要在项目其他源根目录加入文件szlogger.ini
1 ########## 日志信息配置 ########## 2 # 日志级别 不区分大小写 debug:调试信息 info:普通信息 WARN:警告信息 ERROR:错误信息 FATAL:严重错误信息 3 LOG_LEVEL = debug 4 # 是否输出到控制台(默认为false) 5 CONSOLE_PRINT = true 6 # 是否输出到文件(默认为true) 7 CONSOLE_FILE = true 8 # 是否输出到文件(默认为true) 9 CONSOLE_FILE_BUFFER = true 10 # 日志文件存放路径 11 LOG_PATH =../log/sz.log
s
Holle world
首先打开NetBeans工具
新建项目 net.sz.blog.test
然后我们再按照同样的方式新建 项目net.sz.blog.test-scipts
切记脚本项目的项目名字是主项目名字+ (-scripts);读取脚本文件的约定;
项目创建完成后,我们调用方式,需要处理的是添加引用;根据自己需求,加入框架库引用;
主项目和脚本项目目录结构,脚本项目依赖于主项目
本次重点讲解实现脚本和定时器任务;
我们现在主项目下面建立 main 包在main包下面建立iscript包
我们建立主函数脚本接口
1 package net.sz.blog.test.main.iscript; 2 3 import net.sz.framework.scripts.IInitBaseScript; 4 5 /** 6 * 主脚本 7 * <br> 8 * author 失足程序员<br> 9 * blog http://www.cnblogs.com/ty408/<br> 10 * mail [email protected]<br> 11 * phone 13882122019<br> 12 */ 13 public interface IAppManagerScript extends IInitBaseScript { 14 15 /*程序启动完成后调用脚本函数*/ 16 void startEnd(); 17 18 /*需要停止服务器的时候调用的脚本*/ 19 void stop(); 20 }
我们在main包下面建立主类Test_App_Manager
1 package net.sz.blog.test.main; 2 3 import java.util.ArrayList; 4 import net.sz.blog.test.main.iscript.IAppManagerScript; 5 import net.sz.framework.scripts.manager.ScriptManager; 6 import net.sz.framework.szlog.SzLogger; 7 8 /** 9 * 10 * <br> 11 * author 失足程序员<br> 12 * blog http://www.cnblogs.com/ty408/<br> 13 * mail [email protected]<br> 14 * phone 13882122019<br> 15 */ 16 public class Test_App_Manager { 17 18 private static SzLogger log = SzLogger.getLogger(); 19 /*单例脚本,脚本反向注册,而非集合调用*/ 20 private static IAppManagerScript iAppManagerScript = null; 21 22 public static IAppManagerScript getiAppManagerScript() { 23 return iAppManagerScript; 24 } 25 26 public static void setiAppManagerScript(IAppManagerScript iAppManagerScript) { 27 Test_App_Manager.iAppManagerScript = iAppManagerScript; 28 } 29 30 public static void main(String[] args) { 31 32 /*加载所有脚本文件,默认加载项目路径 -scripts 文件下面所有问题*/ 33 ArrayList<String> loadScripts = ScriptManager.getInstance().reload(); 34 String join = String.join(",", loadScripts); 35 log.error("脚本加载结果:" + join); 36 37 if (iAppManagerScript != null) { 38 /*调用启动脚本*/ 39 iAppManagerScript.startEnd(); 40 } 41 42 } 43 }
我们在主类中添加对主项目启动函数脚本接口的引用,等待加载脚本的时候注入;
我们在脚本项目下面建立main包添加AppManagerScript脚本文件
1 package net.sz.blog.test.scripts.main; 2 3 import net.sz.blog.test.main.Test_App_Manager; 4 import net.sz.blog.test.main.iscript.IAppManagerScript; 5 import net.sz.framework.szlog.SzLogger; 6 7 /** 8 * 9 * <br> 10 * author 失足程序员<br> 11 * blog http://www.cnblogs.com/ty408/<br> 12 * mail [email protected]<br> 13 * phone 13882122019<br> 14 */ 15 public class AppManagerScript implements IAppManagerScript { 16 17 private static SzLogger log = SzLogger.getLogger(); 18 19 @Override 20 public void _init() { 21 /*把脚本反向注册回主项目函数*/ 22 Test_App_Manager.setiAppManagerScript(this); 23 } 24 25 @Override 26 public void startEnd() { 27 log.error("主项目单例模式脚本调用函数执行"); 28 /* holle world! 放在脚本打印 */ 29 log.error("holle world!"); 30 } 31 32 @Override 33 public void stop() { 34 } 35 36 }
顺利完成了脚本的注册,输出holle world
定时器任务实现
在主项目下面和main包同级别下建立timer包
建立文件ServerInfoTimer 每一秒钟执行 需要手动注册的定时器任务执行;
我们暂时加入公共线程执行的定时器
1 package net.sz.blog.test.timer; 2 3 import net.sz.framework.szlog.SzLogger; 4 import net.sz.framework.szthread.TimerTaskModel; 5 6 /** 7 * 8 * <br> 9 * author 失足程序员<br> 10 * blog http://www.cnblogs.com/ty408/<br> 11 * mail [email protected]<br> 12 * phone 13882122019<br> 13 */ 14 public class ServerInfoTimer extends TimerTaskModel { 15 16 private static SzLogger log = SzLogger.getLogger(); 17 18 public ServerInfoTimer() { 19 super(1000);/*一秒钟无限执行*/ 20 } 21 22 @Override 23 public void run() { 24 log.error("我是主项目里面执行定时器"); 25 } 26 27 }
接下来我们在脚本项目中依然是main同级别建立timer包
建立TestTimerScript脚本文件,这里的定时器依然是每一秒钟执行,但是是自动执行的无需线程注册;
1 package net.sz.blog.test.scripts.timer; 2 3 import net.sz.framework.szlog.SzLogger; 4 import net.sz.framework.szthread.timer.iscript.ISecondsEventTimerScript; 5 6 /** 7 * 8 * <br> 9 * author 失足程序员<br> 10 * blog http://www.cnblogs.com/ty408/<br> 11 * mail [email protected]<br> 12 * phone 13882122019<br> 13 */ 14 public class TestTimerScript implements ISecondsEventTimerScript { 15 16 private static SzLogger log = SzLogger.getLogger(); 17 18 /*自动调用*/ 19 @Override 20 public void run(int sec) { 21 log.error("我是脚本里面执行定时器"); 22 } 23 24 }
我们在主函数main方法中加入ServerInfoTimer 定时器的手动注册代码
/*主动注册,选择线程执行的定时器任务*/ ThreadPool.addTimerTask(ThreadPool.GlobalThread, new ServerInfoTimer()); /* 值的注意,服务器程序准备好工作后,我们必须设置这个参数 这时因为本线程池线程分为 sys线程 和 user线程; 没有这个标识,user线程是不会执行定时器操作的; */ ThreadPool.setStarEnd(true);
看看效果先
两种定时任务执行;值的注意的是在脚本的定时器任务不能执行长时间任务,这样会占用其他定时器任务的执行时间;一般作为定时触发器;
到这里 net.sz.framework java 版本基础使用就算完成
C#版本的代码还需要进一步整合,所以就暂时不放出来;