在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使用不同的方法來進行服務的初始化
不過
從 Turbine
開始
你只需要提供一個不帶參數的方法就可以了:
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 fooMethod
()
{
getService()
fooMethod
();
}
public static int fooMethod
(int bar)
{
return getService()
fooMethod
(bar);
}
[
]
}
[/code]
用戶調用你的服務只需要簡單的
TurbineFoo
fooMethod
();
在調用的代碼裡就不需要知道具體實現的類是哪一個
注意:在Turbine
和
中管理服務的生命周期(lifecycle)的init()和shutdown()方法可能在以後的版本中有所改變的
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19804.html