Skip to content

通用服务功能

提供一种面向对象的服务管理开发方式 类似于原生的SystemCls但更为轻量级

python
from QuModLibs.Modules.Service.Server import BaseService
# from QuModLibs.Modules.Service.Client import BaseService

BaseService 服务类

基于 BaseService 创建您的服务

python
# -*- coding: utf-8 -*-
from QuModLibs.Server import *
from QuModLibs.Modules.Services.Server import BaseService

@BaseService.Init
class MyService(BaseService):
    def __init__(self):
        BaseService.__init__(self)
        print("服务实例化")
    
    def onCreate(self):
        # 实例化过程正常走完没有遇到报错时将会触发该方法
        BaseService.onCreate(self)
        print("服务创建成功")
    
    def onServiceStop(self):
        # 游戏关闭时会强制停用所有服务
        BaseService.onServiceStop(self)
        print("服务停用触发")

    def onServiceUpdate(self):
        # Update触发逻辑 默认每秒30次
        BaseService.onServiceUpdate(self)
    
    def call(self):
        print("执行逻辑")
        
	# 使用默认提供的注解注册游戏监听 您也可以自定义注解
    @BaseService.Listen(Events.ServerItemTryUseEvent)
    def tryUseItem(self, args={}):
        # 服务类继承了定时器加载器 因此此处可以使用内部定时器(在服务关闭时将会跟随销毁)
        self.addTimer(BaseService.Timer(self.call, time=2.0))
        print(serverApi.GetPlayerList())

    @BaseService.LoopTimer(1.5)
    def onTick(self):
        print("tick")
    
    @BaseService.REG_API("MyService/MY_API")
    def MY_API(self):
        print("该方法将允许其他服务调用 通过self.syncRequest(...)")

关于服务

服务是一种单例的管理模式, 同一个服务类至多存在一个实例, 通过类方法 start 启用 stop关闭或是使用装饰器@BaseService.Init初始化持久工作 此外服务提供了注解加载器功能 方便用户开发

基于 AutoStopService 创建定时关闭服务

python
# -*- coding: utf-8 -*-
from QuModLibs.Server import *
from QuModLibs.Modules.Services.Server import AutoStopService

class TEST_SERVICE(AutoStopService):
    def __init__(self):
        AutoStopService.__init__(self)
        self.STOP_SERVICE_MAX_TIME = 60.0	# 规定60s未通过access访问自动关闭
        print("服务实例化")
    
    def onCreate(self):
        AutoStopService.onCreate(self)
        print("服务创建成功")
    
    def onServiceStop(self):
        AutoStopService.onServiceStop(self)
        print("服务停用触发")
    
    def onServiceAutoStop(self):
        AutoStopService.onServiceAutoStop(self)
        print("服务因长时间无访问自动关闭触发 随后触发onServiceStop")

    def onServiceUpdate(self):
        # Update触发逻辑 默认每秒30次
        AutoStopService.onServiceUpdate(self)
    
    def doSomeThing(self):
        """ 实现一些功能 利用定时关闭特性可以对内缓存数据 """
        pass

@Listen(Events.xxxx)
def TEST_FUN(_={}):
    # 在一定条件下使用服务业务功能
    TEST_SERVICE.access().doSomeThing()		# access类方法 未启用服务时将会启用服务并返回实例

基于 BaseEvent 定义您的服务事件

python
# -*- coding: utf-8 -*-
from QuModLibs.Server import *
from QuModLibs.Modules.Services.Server import BaseService, BaseEvent

class C_T_RAP_AND_BASKETBALL(BaseEvent):
    """ 定义一个事件 """
    def __init__(self, playerId):
        BaseEvent.__init__(self)
        self.playerId = playerId
        self.stop_rap = False	# 是否停止rap 接收方可以修改以便发起方读取结果

@BaseService.Init
class MyService(BaseService):
    """ 服务1 发起事件广播 """
    def __init__(self):
        BaseService.__init__(self)
        
    @BaseService.Listen(Events.ServerItemTryUseEvent)
    def ServerItemTryUseEvent(self, args={}):
		playerId = args["playerId"]
        eventData = C_T_RAP_AND_BASKETBALL(playerId)	# 创建事件对象
        self.broadcast(eventData)						# 广播事件 (仅支持服务访问)
        if eventData.stop_rap:
            print("{} 取消了RAP".format(playerId))
        else:
            # doSomeThing
            ...

@BaseService.Init
class Service2(BaseService):
    """ 服务2 接受事件广播 """
    def __init__(self):
        BaseService.__init__(self)
        
    @BaseService.ServiceListen(C_T_RAP_AND_BASKETBALL)
    def C_T_RAP_AND_BASKETBALL_EVENT(self, data):
        # type: (C_T_RAP_AND_BASKETBALL) -None
        data = C_T_RAP_AND_BASKETBALL.getData(data)		# 显性转换类型(不是必要的) 仅辅助补全提示
        # 事件内置的上下文临时属性 通常情况下可能用不上
        # 上下文属性为临时结果 请勿尝试储存结果
        index = data._T_CONTEXT_INDEX			# 返回你是第几个收到事件通知的
        fromService = data._T_FROM_SERVICE		# 返回广播此事件的服务是谁
        if data.playerId == "-114514":
            data.stop_rap = True	# 你不许跳

自定义服务事件

服务事件仅适用于当前系统环境下的服务广播 不会跨MOD/系统端 如需通信请使用Call 如需设计开放性API(MOD通信)请使用动态导入并制定一份API文件

BaseBusiness 子业务类

BaseBusiness 子业务 提供了服务内多个运行时实例的解决方案

python
# -*- coding: utf-8 -*-
from QuModLibs.Server import *
from QuModLibs.Modules.Services.Server import BaseService, BaseBusiness

class PlayerRuntimerBusiness(BaseBusiness):
    """ 玩家运行时业务 """
    def __init__(self, playerId):
        BaseBusiness.__init__(self)
        self.playerId = playerId

    def onCreate(self):
        """ 业务构建成功触发 """
        parent = self.getParentService() # 获取父级服务对象
        # parent对象 请勿随意储存避免互相引用导致垃圾回收困难(即便Python会试图使用分代回收 在一定的时机) 遵循用时再获取即可

    def onStopBefore(self):
        """ 业务终止之前触发 """
        pass

    def onStop(self):
        """ 业务终止触发 业务终止之后将无法再获取parent对象 """
        pass
    
    def onTick(self):
        BaseBusiness.onTick(self)
        print("玩家ID: {}".format(self.playerId))

	@BaseBusiness.Listen(Events.__ANY_EVENT__)
    def AnyEvent(self, args={}):
        """ 同服务一样 子业务也能使用注解管理资源 并跟随生命周期一同释放 """
        pass

@BaseService.Init
class MyService(BaseService):
    def __init__(self):
        BaseService.__init__(self)
        self.playerBusinessMap = {}		# 定义字典以便快速查表优化性能
        # 尽管服务内具有业务储存管理 由于储存方式并非使用map 想要高性能查询仍需自己定制化
        print("服务实例化")
    
    def onCreate(self):
        BaseService.onCreate(self)
        print("服务创建成功")
    
    def onServiceStop(self):
        BaseService.onServiceStop(self)
        print("服务停用触发")

    def onServiceUpdate(self):
        BaseService.onServiceUpdate(self)
    
    @BaseService.Listen(Events.AddServerPlayerEvent)
    def AddServerPlayerEvent(self, args={}):
        """ 系统级 玩家加入游戏事件 """
        playerId = args["id"]
        # 对内添加一个玩家运行时业务 此业务享有相关生命周期事件
        businessObj = PlayerRuntimerBusiness(playerId)
        self.addBusiness(businessObj)
        self.playerBusinessMap[playerId] = businessObj
        
	@BaseService.Listen(Events.DelServerPlayerEvent)
	def DelServerPlayerEvent(self, args={}):
        """ 系统级 玩家离开游戏事件 """
        playerId = args["id"]
        if playerId in self.playerBusinessMap:
            self.removeBusiness(self.playerBusinessMap[playerId])
            del self.playerBusinessMap[playerId]

注意事项

子业务运行在服务之下 当服务被关闭时所有子业务都将终止 通过这一机制您可以方便的管理对内资源

Released under the BSD3 License