前言
在之前的文章中,讲解过 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
########## 日志信息配置 ########## # 日志级别 不区分大小写 debug:调试信息 info:普通信息 WARN:警告信息 ERROR:错误信息 FATAL:严重错误信息 LOG_LEVEL = debug # 是否输出到控制台(默认为false) CONSOLE_PRINT = true # 是否输出到文件(默认为true) CONSOLE_FILE = true # 是否输出到文件(默认为true) CONSOLE_FILE_BUFFER = true # 日志文件存放路径 LOG_PATH =../log/sz.log
s
Holle world
首先打开NetBeans工具
新建项目 net.sz.blog.test
然后我们再按照同样的方式新建 项目net.sz.blog.test-scipts
切记脚本项目的项目名字是主项目名字+ (-scripts);读取脚本文件的约定;
项目创建完成后,我们调用方式,需要处理的是添加引用;根据自己需求,加入框架库引用;
主项目和脚本项目目录结构,脚本项目依赖于主项目
本次重点讲解实现脚本和定时器任务;
我们现在主项目下面建立 main 包在main包下面建立iscript包
我们建立主函数脚本接口
package net.sz.blog.test.main.iscript; import net.sz.framework.scripts.IInitBaseScript; /** * 主脚本 * <br> * author 失足程序员<br> * blog http://www.cnblogs.com/ty408/<br> * mail 492794628@qq.com<br> * phone 13882122019<br> */ public interface IAppManagerScript extends IInitBaseScript { /*程序启动完成后调用脚本函数*/ void startEnd(); /*需要停止服务器的时候调用的脚本*/ void stop(); }
我们在main包下面建立主类Test_App_Manager
package net.sz.blog.test.main; import java.util.ArrayList; import net.sz.blog.test.main.iscript.IAppManagerScript; import net.sz.framework.scripts.manager.ScriptManager; import net.sz.framework.szlog.SzLogger; /** * * <br> * author 失足程序员<br> * blog http://www.cnblogs.com/ty408/<br> * mail 492794628@qq.com<br> * phone 13882122019<br> */ public class Test_App_Manager { private static SzLogger log = SzLogger.getLogger(); /*单例脚本,脚本反向注册,而非集合调用*/ private static IAppManagerScript iAppManagerScript = null; public static IAppManagerScript getiAppManagerScript() { return iAppManagerScript; } public static void setiAppManagerScript(IAppManagerScript iAppManagerScript) { Test_App_Manager.iAppManagerScript = iAppManagerScript; } public static void main(String[] args) { /*加载所有脚本文件,默认加载项目路径 -scripts 文件下面所有问题*/ ArrayList<String> loadScripts = ScriptManager.getInstance().reload(); String join = String.join(",", loadScripts); log.error("脚本加载结果:" + join); if (iAppManagerScript != null) { /*调用启动脚本*/ iAppManagerScript.startEnd(); } } }
我们在主类中添加对主项目启动函数脚本接口的引用,等待加载脚本的时候注入;
我们在脚本项目下面建立main包添加AppManagerScript脚本文件
package net.sz.blog.test.scripts.main; import net.sz.blog.test.main.Test_App_Manager; import net.sz.blog.test.main.iscript.IAppManagerScript; import net.sz.framework.szlog.SzLogger; /** * * <br> * author 失足程序员<br> * blog http://www.cnblogs.com/ty408/<br> * mail 492794628@qq.com<br> * phone 13882122019<br> */ public class AppManagerScript implements IAppManagerScript { private static SzLogger log = SzLogger.getLogger(); @Override public void _init() { /*把脚本反向注册回主项目函数*/ Test_App_Manager.setiAppManagerScript(this); } @Override public void startEnd() { log.error("主项目单例模式脚本调用函数执行"); /* holle world! 放在脚本打印 */ log.error("holle world!"); } @Override public void stop() { } }
顺利完成了脚本的注册,输出holle world
定时器任务实现
在主项目下面和main包同级别下建立timer包
建立文件ServerInfoTimer 每一秒钟执行 需要手动注册的定时器任务执行;
我们暂时加入公共线程执行的定时器
package net.sz.blog.test.timer; import net.sz.framework.szlog.SzLogger; import net.sz.framework.szthread.TimerTaskModel; /** * * <br> * author 失足程序员<br> * blog http://www.cnblogs.com/ty408/<br> * mail 492794628@qq.com<br> * phone 13882122019<br> */ public class ServerInfoTimer extends TimerTaskModel { private static SzLogger log = SzLogger.getLogger(); public ServerInfoTimer() { super(1000);/*一秒钟无限执行*/ } @Override public void run() { log.error("我是主项目里面执行定时器"); } }
接下来我们在脚本项目中依然是main同级别建立timer包
建立TestTimerScript脚本文件,这里的定时器依然是每一秒钟执行,但是是自动执行的无需线程注册;
package net.sz.blog.test.scripts.timer; import net.sz.framework.szlog.SzLogger; import net.sz.framework.szthread.timer.iscript.ISecondsEventTimerScript; /** * * <br> * author 失足程序员<br> * blog http://www.cnblogs.com/ty408/<br> * mail 492794628@qq.com<br> * phone 13882122019<br> */ public class TestTimerScript implements ISecondsEventTimerScript { private static SzLogger log = SzLogger.getLogger(); /*自动调用*/ @Override public void run(int sec) { log.error("我是脚本里面执行定时器"); } }
我们在主函数main方法中加入ServerInfoTimer 定时器的手动注册代码
/*主动注册,选择线程执行的定时器任务*/ ThreadPool.addTimerTask(ThreadPool.GlobalThread, new ServerInfoTimer()); /* 值的注意,服务器程序准备好工作后,我们必须设置这个参数 这时因为本线程池线程分为 sys线程 和 user线程; 没有这个标识,user线程是不会执行定时器操作的; */ ThreadPool.setStarEnd(true);
看看效果先
两种定时任务执行;值的注意的是在脚本的定时器任务不能执行长时间任务,这样会占用其他定时器任务的执行时间;一般作为定时触发器;
到这里 net.sz.framework java 版本基础使用就算完成
C#版本的代码还需要进一步整合,所以就暂时不放出来;
net.sz.framework 框架 轻松搭建服务---让你更专注逻辑功能---初探的更多相关文章
-
net.sz.framework 框架 轻松搭建数据服务中心----读写分离数据一致性,滑动缓存
前言 前文讲述了net.sz.framework 框架的基础实现功能,本文主讲 net.sz.framework.db 和 net.sz.framework.szthread; net.sz.fram ...
-
net.sz.framework 框架 登录服务器架构 单服2 万 TPS(QPS)
前言 无论我们做什么系统,95%的系统都离不开注册,登录: 而游戏更加关键,频繁登录,并发登录,导量登录:如果登录承载不起来,那么游戏做的再好,都是徒然,进不去啊: 序言 登录所需要的承载,包含程序和 ...
-
net.sz.framework 框架 ORM 消消乐超过亿条数据排行榜分析 天王盖地虎
序言 天王盖地虎, 老婆马上生孩子了,在家待产,老婆喜欢玩消消乐类似的休闲游戏,闲置状态,无聊的分析一下消消乐游戏的一些技术问题: 由于我主要是服务器研发,客户端属于半吊子,所以就分析一下消消乐排行榜 ...
-
如何快速搭建一个基于ServiceStack框架的web服务
ServiceStack是一个高性能的.NET Web Service 平台,能够简化开发高性能的REST (支持JSON,XML,JSV,HTML,MsgPack,ProtoBuf,CSV等消息格式 ...
-
Python web 框架之 Django 基础搭建服务
1. 需要安装 Python 和 Django 环境,Python 环境的安装我就不在多说了 2. 安装框架 Django Django 安装,推荐先装个 pip吧,easyinstall也可以,然后 ...
-
无框架完整搭建安卓app及其服务端(一)
技术背景: 我的一个项目做的的是图片处理,用 python 实现图片处理的核心功能后,想部署到安卓app中,但是对于一个对安卓和服务器都一知半解的小白来说要现学的东西太多了. 而实际上,我们的项目要求 ...
-
使用Apache MINA框架搭建服务端
使用MINA框架搭建服务端步骤: 1.定义一个启动服务的类MinaServer,并实现接口ServletContextListener 2.定义一个处理业务逻辑的类MinaServerHandler, ...
-
Zend Framework 框架搭建
通过手工方法搭建Zend Framework的MVC框架结构.首先看一下zend framework mvc的目录结构 1. 在根目录下面创建 public ,并在 public 下创建 index. ...
-
KODExplorer可道云-轻松搭建属于自己/团队的私有云网盘服务
如今国内各大网盘关停的也快差不多,百度网盘限速严重.国外大牌的如 Dropbox 或 Google Drive又在长城之外,在各种VPN都被封禁的大背景下,*也困难重重,麻烦到要死.那么,除了购 ...
随机推荐
-
iOS emoji表情转码 或者判断
如果项目中有评论或者信息恢复的地方,往往会用到emoji,有时候如后台不支持emoji,就会显示乱码错误,我们可以把emoji转成unicode编码或者utf8编码格式传给服务器.当然如果后台服务器接 ...
-
【C语言入门教程】2.4 浮点型数据
浮点型数据又称实型数据,是一个以十进制表示的符号实数.符号实数的值包括整数部分.尾数部分和指数部分. 2.4.1 浮点型常量 一些较大的数值,或者有小数位.指数位的数值都需要用浮点型常量表示.浮点型常 ...
-
C++11带来的优雅语法
C++11带来的优雅语法 自动类型推导 auto auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以简化我们的编程工作; auto是在编译时对变量进行了 ...
-
修改Mac]Bringing interface etch0:Device
OS版本:Red Hat Enterprise Linux AS4/5 网上有很多关于linux下修改MAC地址的方法,大多依葫芦画瓢,似乎都没验证过,达不到修改的目的. 经过我的详细测试,最终成功解 ...
-
学习总结 html 表格标签的使用
表格: <table></table>表格 width:宽度.可以用像素或百分比表示. 常用960像素. border:边框,常用值为0. cellpadding:内容跟边框的 ...
-
android studio 改变主题及字体大小
一丶修改主题背景 1.点击图中的小扳子图标(设置),或者点击file->setting-> 2.找到Appearance->在Theme中选择Darcula,即可改变成当前最主流的主 ...
-
用DELPHI的RTTI实现数据集的简单对象化
在<强大的DELPHI RTTI--兼谈需要了解多种开发语言>一文中,我说了一下我用DELPHI的RTTI实现了数据集的简单对象化.本文将详细介绍一下我的实现方法. 首先从一个简单 ...
-
初学时遇到的小问题Your content must have a ListView whose id attribute is &#39;android.R.id.list&#39;
问题提出 错误提示:Your content must have a ListView whose id attribute is 'android.R.id.list' 关于解决Your conte ...
-
kubernetes实践之二:Kubernetes可视WEB UI Dashboard搭建
Kubernetes可视WEBUI Dashboard搭建 支持浏览器:火狐 一.Dashboard下载地址 git clone https://github.com/kubernetes/kuber ...
-
HTML一
什么是前端: 前端,也称web前端对于网站来说,通常是指网站的前台部分,通俗点就是用户可以看到的部分, 浏览器.APP.应用程序的界面展现和用户交互就是前端 前端要学习那些技术:html+css+ja ...