在turbine中实现自己的服务是非常容易的一件事.你的类只需要继承org.apache.turbine.services.turbinebaseservice(这是必须的,只有这样,turbine的servicebroker才能启动你的服务).
要告诉turbine你的这个服务,你必需在trubineresources.properties里这样配置:
services.myservicename.classname = full.class.name.of.your.service
配置好以后,当有程序请求这个服务的时候,turbine会初始化这个服务.必须说明的是,你的服务并不是在turbine启动的时候初始化的.这叫"lazy init",如果你需要你的服务在turbine启动是就初始化,你必须在turbineresources.properties里添加另一条配置:
services.myservicename.earlyinit = true
如果你查看一下db/turbinepoolbrokerservice或者servlet/turbineservletservice这两个简单的示例的话,你上手会更快一点.
in a nutshell
* 你不能试着提供带参数的构造函数,最好是不提供构造函数,因为在类构造时不需要做任何事情(我们只需要默认的构造函数就好了).
* 你的服务只能初始化一次.因此,你的类必须是线程安全的(threadsafe),不能使用类级的变量来处理session级的请求.
* 你需要提供一个"init()"方法,turbine会在第一次请求的时候调用他(如果earlyinit=true,则是在turbine启动时)并且初始化你的服务相关的内容.令人迷惑的是"init()"方法到底应该是什么样的?因为turbine使用不同的方法来进行服务的初始化.不过,从 turbine2.2开始,你只需要提供一个不带参数的方法就可以了:
public void init() throws initializationexception
{
}
* 如果正常初始化结束来,你必须调用"setinit(true)",否则你的服务仍然不能响应任何的用户请求.当你这么设置以后,你的服务服务就有可能被调用,所以你就不能再次调用"setinit()"了.
* 你可以提供一个"shutdown()"方法,turbine会在自己关闭之前调用他.你可以在这里清理你服务的一些内部数据,在执行完"shutdown()"之前,你应该调用"setinit(false)".
一般的模式
如果你要实现一个fooservice,声明一个继承org.apache.turbine.services.service的接口 (your.package.fooservice)是一个好习惯.这个接口应该提供一个叫service_name的常量,这是你的服务的名字,比如:
[code]
package your.package;
import org.apache.turbine.services.service;
public interface fooservice extends service
{
/**
* 服务的标记,应该是唯一的,以区分开别的服务
*/
public string service_name = "fooservice";
[...]
}
[/code]
your.package.turbinefooservice.java 继承了org.apache.turbine.services.turbinebaseservice类并且实现your.package.fooservice并提供来具体的实现 ,如:
[code]
package your.package;
import org.apache.turbine.services.turbinebaseservice;
public class turbinefooservice
extends turbinebaseservice
implements fooservice
{
/**
* 在这里提供具体的实现
*/
[...]
}
[/code]
your.package.turbinefoo.java 提供一些静态的facade方法来调用你的服务,如:
[code]
import org.apache.turbine.services.turbineservices;
public class turbinefoo
{
protected static fooservice getservice()
{
return (fooservice) turbineservices
.getinstance().getservice(fooservice.service_name);
}
[...]
public static void foomethod1()
{
getservice().foomethod1();
}
public static int foomethod2(int bar)
{
return getservice().foomethod2(bar);
}
[...]
}
[/code]
用户调用你的服务只需要简单的"turbinefoo.foomethod1();",在调用的代码里就不需要知道具体实现的类是哪一个.
注意:在turbine2.1和2.2中管理服务的生命周期(lifecycle)的init()和shutdown()方法可能在以后的版本中有所改变的.
闽公网安备 35060202000074号