在Turbine中实现自己的服务是非常容易的一件事你的类只需要继承orgapacheturbineservicesTurbineBaseService(这是必须的只有这样Turbine的ServiceBroker才能启动你的服务) 要告诉Turbine你的这个服务你必需在TrubineResourcesproperties里这样配置: servicesMyServiceNameclassname = fullclassnameofyourservice 配置好以后当有程序请求这个服务的时候Turbine会初始化这个服务必须说明的是你的服务并不是在Turbine启动的时候初始化的这叫lazy init如果你需要你的服务在Turbine启动是就初始化你必须在TurbineResourcesproperties里添加另一条配置: servicesMyServiceNameearlyInit = true 如果你查看一下db/TurbinePoolBrokerService或者servlet/TurbineServletService这两个简单的示例的话你上手会更快一点 In a Nutshell * 你不能试着提供带参数的构造函数最好是不提供构造函数因为在类构造时不需要做任何事情(我们只需要默认的构造函数就好了) * 你的服务只能初始化一次因此你的类必须是线程安全的(threadsafe)不能使用类级的变量来处理Session级的请求 * 你需要提供一个init()方法Turbine会在第一次请求的时候调用他(如果earlyInit=true则是在Turbine启动时)并且初始化你的服务相关的内容令人迷惑的是init()方法到底应该是什么样的?因为Turbine使用不同的方法来进行服务的初始化不过从 Turbine开始你只需要提供一个不带参数的方法就可以了: public void init() throws InitializationException { } * 如果正常初始化结束来你必须调用setInit(true)否则你的服务仍然不能响应任何的用户请求当你这么设置以后你的服务服务就有可能被调用所以你就不能再次调用setInit()了 * 你可以提供一个shutdown()方法Turbine会在自己关闭之前调用他你可以在这里清理你服务的一些内部数据在执行完shutdown()之前你应该调用setInit(false) 一般的模式 如果你要实现一个FooService声明一个继承orgapacheturbineservicesService的接口 (yourpackageFooService)是一个好习惯这个接口应该提供一个叫SERVICE_NAME的常量这是你的服务的名字比如: [code] package yourpackage; import orgapacheturbineservicesService; public interface FooService extends Service { /** * 服务的标记应该是唯一的以区分开别的服务 */ public String SERVICE_NAME = FooService; [] } [/code] yourpackageTurbineFooServicejava 继承了orgapacheturbineservicesTurbineBaseService类并且实现yourpackageFooService并提供来具体的实现 如: [code] package yourpackage; import orgapacheturbineservicesTurbineBaseService; public class TurbineFooService extends TurbineBaseService implements FooService { /** * 在这里提供具体的实现 */ [] } [/code] yourpackageTurbineFoojava 提供一些静态的facade方法来调用你的服务如: [code] import orgapacheturbineservicesTurbineServices; public class TurbineFoo { protected static FooService getService() { return (FooService) TurbineServices getInstance()getService(FooServiceSERVICE_NAME); } [] public static void fooMethod() { getService()fooMethod(); } public static int fooMethod(int bar) { return getService()fooMethod(bar); } [] } [/code] 用户调用你的服务只需要简单的TurbineFoofooMethod();在调用的代码里就不需要知道具体实现的类是哪一个 注意:在Turbine和中管理服务的生命周期(lifecycle)的init()和shutdown()方法可能在以后的版本中有所改变的 |