前言

在之前的文章中,讲解过 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 框架 轻松搭建服务---让你更专注逻辑功能---初探的更多相关文章

  1. net.sz.framework 框架 轻松搭建数据服务中心----读写分离数据一致性,滑动缓存

    前言 前文讲述了net.sz.framework 框架的基础实现功能,本文主讲 net.sz.framework.db 和 net.sz.framework.szthread; net.sz.fram ...

  2. net.sz.framework 框架 登录服务器架构 单服2 万 TPS(QPS)

    前言 无论我们做什么系统,95%的系统都离不开注册,登录: 而游戏更加关键,频繁登录,并发登录,导量登录:如果登录承载不起来,那么游戏做的再好,都是徒然,进不去啊: 序言 登录所需要的承载,包含程序和 ...

  3. net.sz.framework 框架 ORM 消消乐超过亿条数据排行榜分析 天王盖地虎

    序言 天王盖地虎, 老婆马上生孩子了,在家待产,老婆喜欢玩消消乐类似的休闲游戏,闲置状态,无聊的分析一下消消乐游戏的一些技术问题: 由于我主要是服务器研发,客户端属于半吊子,所以就分析一下消消乐排行榜 ...

  4. 如何快速搭建一个基于ServiceStack框架的web服务

    ServiceStack是一个高性能的.NET Web Service 平台,能够简化开发高性能的REST (支持JSON,XML,JSV,HTML,MsgPack,ProtoBuf,CSV等消息格式 ...

  5. Python web 框架之 Django 基础搭建服务

    1. 需要安装 Python 和 Django 环境,Python 环境的安装我就不在多说了 2. 安装框架 Django Django 安装,推荐先装个 pip吧,easyinstall也可以,然后 ...

  6. 无框架完整搭建安卓app及其服务端(一)

    技术背景: 我的一个项目做的的是图片处理,用 python 实现图片处理的核心功能后,想部署到安卓app中,但是对于一个对安卓和服务器都一知半解的小白来说要现学的东西太多了. 而实际上,我们的项目要求 ...

  7. 使用Apache MINA框架搭建服务端

    使用MINA框架搭建服务端步骤: 1.定义一个启动服务的类MinaServer,并实现接口ServletContextListener 2.定义一个处理业务逻辑的类MinaServerHandler, ...

  8. Zend Framework 框架搭建

    通过手工方法搭建Zend Framework的MVC框架结构.首先看一下zend framework mvc的目录结构 1. 在根目录下面创建 public ,并在 public 下创建 index. ...

  9. KODExplorer可道云-轻松搭建属于自己/团队的私有云网盘服务

    如今国内各大网盘关停的也快差不多,百度网盘限速严重.国外大牌的如 Dropbox 或 Google Drive又在长城之外,在各种VPN都被封禁的大背景下,科学上网也困难重重,麻烦到要死.那么,除了购 ...

随机推荐

  1. ABP框架 - 嵌入资源

    文档目录 本节内容: 简介 创建嵌入文件 xproj/project.json 格式 csproj 格式 添加到嵌入式资源管理器 使用嵌入式视图 使用嵌入式资源 ASP.NET Core 配置 忽略文 ...

  2. APP中的 H5和原生页面如何分辨、何时使用

    一.APP内嵌H5和原生的区别 1.原生的页面运行速度快,比较流畅. H5页面相对原生的运行性能低,特别是一些动画效果有明显卡顿. 2.H5页面的很多交互都没有原生的好,比如弹层.输入时候的页面滑动 ...

  3. 【转】IntelliJ IDEA2016.1 + maven 创建java web 项目

    最近开始使用idea 来写java项目了,这个很流行,相比Eclipse方便了很多.功能多了,相对应的使用的复杂度也较高了,因为网上很多的使用和创建项目的简单教程,都是基于老版本的,每个新版本都有不一 ...

  4. spring+struts2+ibatis 框架整合以及解析

    一. spring+struts2+ibatis 框架 搭建教程 参考:http://biancheng.dnbcw.net/linux/394565.html 二.分层 1.dao: 数据访问层(增 ...

  5. BZOJ 1337: 最小圆覆盖1336: [Balkan2002]Alien最小圆覆盖(随机增量法)

    今天才知道有一种东西叫随机增量法就来学了= = 挺神奇的= = A.令ci为包括前i个点的最小圆,若第i+1个点无法被ci覆盖,则第i+1个点一定在ci+1上 B.令ci为包括前i个点的最小圆且p在边 ...

  6. 对await(),notify()的理解

    await(),notify()是java Object类的方法.在两个线程同时访问一个对象的时候可以利用这2个方法实现线程的通信.看下面的例子. public class Account { pri ...

  7. 归纳篇(一)CSS的position定位和float浮动

    近期会更新一系列博客,对基础知识再度做个巩固和梳理. 一.position定位 (一):position的属性 1.absolute:生成绝对定位的元素,相对于最近一级定位不是static的父元素来进 ...

  8. HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(二)

    HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一) 下面来查看其他对保存HSTS信息的enabled_sts_hosts ...

  9. 关于Xmanager使用问题的总结

    做大数据的人对Xmanager这类远程连接工具应该都不陌生,我在使用Xmanager时遇到了一些问题并经过google和亲测解决,写在这里与大家分享. 1. [问题描述] 在windows上使用Xma ...

  10. UVa1587 盒子

    前言 第一次刷题,ac的感觉真的很棒! 题目 题目 大意是说,输入6个面,判断是否是个长方体. 思路 根据长方体的特质来判断,比如说6个面中3个面是相互对应的,只有3条不同的边等等. 我就知道我肯定会 ...