跳到主要内容

game_server.services

简介

以service实体的形式实现的service管理器

service实体的特性和普通实体的特性是一致的

service实体的基础组件是ServiceEntity,自定义扩展时需要包含该组件

组件接口

ServiceEntity.gs

service实体对象的基础类

一般情况下,使用pkg.game_server.services创建新的service实体对象时,需要component此对象

服务开启, override bool ServiceEntity.on_start()

服务关闭, override void ServiceEntity.on_stop()

服务心跳, override void ServiceEntity.on_heartbeat()

函数原型函数作用
void FEntityPrevClose.prev_close()虚函数: 析构时的前处理函数
void set_service_name(string service_name)设置服务名称
bool is_service()判断是否为服务实体
void FEntity.post_factory_create(bool new_create)虚函数:创建对象时的后处理
void FEntity.post_factory_fully_create(bool new_create)虚函数: 完整创建对象时的后处理函数
bool start()启动服务
void stop()停止服务
void try_auto_save()尝试自动存盘

services.gs

函数原型函数作用
bool setup(map para = )初始化模块
object load_or_create_service(string name, mixed class_id_or_alias, map dbase = )加载或创建service对象
object get_service(string service_name)根据service名称获取service对象
object get_service_by_rid(string rid)根据rid获取service对象
void iterate_service(function func)遍历所有service对象
object find_service(function func)查找第一个符合条件的service对象
bool start_service(string name)启动指定名称的service对象服务
void stop_service(string name)停止指定名称的service对象服务
void stop_all_services()停止所有service对象服务
void add_service(string name, object service_ob)添加service对象
void remove_service(string name)移除service对象
void dump()调试接口,输出service实体列表

样例

import pkg.game_server.services;
import engine.preimport;

public void test()
{
cfg.init_by_map({
"server_id" : 1,
"product_name" : "test_services",
"disable_mongo" : true
});
engine.boot();

//注册几个service的entity配置
EntityFactory.append_dynamic_entity_type("service", {
"type": "service",
"prefix" : "SER",
"class_id" : [ 200, 299 ],
"title":"服务",
"db_collection": "entity",
"entity_dbase": { "is_global": true }
});

EntityFactory.append_dynamic_entity_info("service", {
"class_id": 200,
"alias": "global",
"name":"全局服务",
"ob_file": __DIR__ "GlobalService.gs",
"desc":"全局服务,管理各种全局数据",
}, true);

// 因为没有提供mongodb,所以以下操作结果都是失败
string service_name = "test0";
object service_ob = services.load_or_create_service(service_name, 200);
test_equal(service_ob, nil);
bool start_result = services.start_service(service_name);
test_equal(start_result, false);

string service_name2 = "test2";
object service_ob2 = services.load_or_create_service(service_name2, "global");
test_equal(service_ob2, nil);
bool start_result2 = services.start_service(service_name2);
test_equal(start_result2, false);
}