[wpdreams_ajaxsearchlite]

概观


服务器启动脚本world.sh启动了许多Java虚拟机(JVM)进程。每个服务器进程都有一个atavism.server.engine.Engine类实例和一个消息代理。服务器消息代理参与Atavism消息系统。进程(或代理)可以有多个服务器插件,每个插件对应一个atavism.server.engine.EnginePlugin实例。


代理

代理是Atavism消息域中的一个进程。使用相同消息域的代理可以使用Atavism消息系统相互通信。要访问消息传递代理,请使用atavism.server.engine.Engine.getAgent()方法,该方法返回atavism.msgsys.MessageAgent对象。代理具有代理类型和代理名称。默认情况下,代理名称与启动Java VM时的记录器名称相同。按照惯例,代理类型和代理名称是小写的。如果只有一个代理类型的实例,它们应该是相同的。如果代理类型有多个实例,则应通过在代理类型中附加“_”和数字来构造代理名称。例如,代理类型“代理”和代理名称“proxy_1”。


代理类型

代理类型标识一类代理,通常运行相同的插件集。例如,“proxy”可以是运行ProxyPlugin的代理的代理类型。多个代理可以具有相同的代理类型。代理类型还确定进程使用的消息通告文件。构造文件名:agent-type-ads.txt代理名称代理名称在消息域中必须是唯一的(即,对于特定的游戏/世界服务器安装)。代理名称确定代理的日志文件名。构造日志文件名:<agent-name> .out。此外,域服务器被告知预期哪些代理名称正在运行。它使用此信息来了解所有代理程序何时运行。流程和代理之间存在一对一的对应关系;因此,单个代理可以托管零个或多个插件。


插件

插件是atavism.server.engine.EnginePlugin子类的一个实例。例如,ProxyPlugin,ObjectManagerPlugin和CombatPlugin。插件在代理进程中运行。插件使用代理提供的域,消息传递和日志记录服务。插件具有插件类型和插件名称。插件必须在其构造函数中设置其插件类型和插件名称。插件类型标识插件类,通常是类名的缩写形式。例如,“Proxy”是ProxyPlugin的插件类型。给定插件类的实例应具有相同的插件类型。插件名称在其邮件域中必须是唯一的。按照惯例,插件类型和插件名称使用“CamelCase”并省略字符串“Plugin”。如果域中只有一个插件类型的实例,它们应该是相同的。如果存在多个插件类型的实例,则应通过在插件类型中附加数字来构造插件名称。例如,插件类型“Proxy”和插件名称“Proxy1”。插件依赖项(请参阅world.properties)以插件类型表示。域服务器跟踪每个插件类型的可用插件数。当预期的插件数量可用时,则满足依赖性。有关更多信息,请参阅插件依赖项。


生成名称

域服务器包括用于生成唯一名称的工具。在域服务器重新启动之前,这些名称是唯一的。通过将数字附加到给定前缀来生成唯一名称。数字从一(1)开始并向上递增。每个前缀都有自己的数字序列。此工具用于生成唯一的代理和插件名称。对于代理名称,启动脚本首先启动域服务器,然后运行请求唯一名称的小程序。有关示例,请参阅atavism.sh中的函数alloc_domain_name。如果运行代理程序或插件的多个副本,则只需生成名称。对于插件名称,插件构造函数使用MessageAgent API从域服务器请求唯一名称。例如:


 public MyPlugin()
 {
     super();
     setPluginType("Mine");
     String myPluginName;
     try {
         myPluginName = 
         Engine.getAgent().getDomainClient().allocName("PLUGIN",getPluginType()+"#");
     }
     catch (java.io.IOException e) {
         throw new AORuntimeException("Could not allocate a plugin name",e);
     }
     setName(myPluginName);
     // Other plugin initialization ...
 }

此示例使用插件类型“Mine”。通过用数字替换“#”来构造插件名称。


插件依赖项

插件激活的顺序由world.properties中表示的插件依赖项控制。依赖关系是插件类型,而不是插件名称。当激活给定类型的预期插件数时,则满足依赖性。请注意,插件构造函数永远不应创建任何订阅或发布消息。这应该只在插件onActivate()之后完成。依赖性由atavism.plugin_dep属性描述:atavism.plugin_dep.MyPluginType = OtherPluginType [,MorePluginTypes]当OtherPluginType(可能还有MorePluginTypes)完成激活时,MyPluginType将被激活。即使插件类型没有依赖项,它们也必须具有“plugin_dep”属性。您可以通过在“plugin_dep”之后附加世界名称来创建特定于世界的插件依赖项:atavism.plugin_dep.my_world.MyPluginType = OtherPluginType这些是默认的插件依赖项:

  • atavism.plugin_dep.Login=ObjectManager,Instance
  • atavism.plugin_dep.Instance=ObjectManager,Quest,MobManager,Inventory,WorldManager
  • atavism.plugin_dep.Proxy=Instance
  • atavism.plugin_dep.MobManager=ObjectManager,WorldManager,Inventory,Quest,Social
  • atavism.plugin_dep.sampleworld.MobManager=ObjectManager,WorldManager,Inventory,Quest,Combat
  • atavism.plugin_dep.ObjectManager=
  • atavism.plugin_dep.WorldManager=
  • atavism.plugin_dep.Inventory=
  • atavism.plugin_dep.Quest=
  • atavism.plugin_dep.Trainer=
  • atavism.plugin_dep.ClassAbility=
  • atavism.plugin_dep.Combat=
  • atavism.plugin_dep.Vendor=
  • atavism.plugin_dep.Domain=Instance,Proxy
  • atavism.plugin_dep.DataLogger=
  • atavism.plugin_dep.Arena=
  • atavism.plugin_dep.Social=
  • atavism.plugin_dep.Voxel=