net.sz.framework 框架 輕鬆搭建服務---讓你更專注邏輯功能---初探
前言
在之前的文章中,講解過 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 = true10 # 日誌檔案存放路徑 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 }View Code
我們在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 }View Code
接下來我們在指令碼專案中依然是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 }View Code
我們在主函式main方法中加入ServerInfoTimer 定時器的手動註冊程式碼
/*主動註冊,選擇執行緒執行的定時器任務*/ ThreadPool.addTimerTask(ThreadPool.GlobalThread, new ServerInfoTimer()); /* 值的注意,伺服器程式準備好工作後,我們必須設定這個引數 這時因為本執行緒池執行緒分為 sys執行緒 和 user執行緒; 沒有這個標識,user執行緒是不會執行定時器操作的; */ ThreadPool.setStarEnd(true);
看看效果先
兩種定時任務執行;值的注意的是在指令碼的定時器任務不能執行長時間任務,這樣會佔用其他定時器任務的執行時間;一般作為定時觸發器;
到這裡 net.sz.framework java 版本基礎使用就算完成
C#版本的程式碼還需要進一步整合,所以就暫時不放出來;