前言
在之前的文章中,講解過 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 492794628@qq.com<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 492794628@qq.com<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 492794628@qq.com<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 492794628@qq.com<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 492794628@qq.com<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#版本的代碼還需要進一步整合,所以就暫時不放出來;