DB 독립적인 어플리케이션을 만드는 것은 DB를 사용하는 모든 어플리케이션 개발 회사의 바램일 것이다.
Ensemble은 이럴 위해 비즈니스 오퍼레이션을 추가하여 쉽게 이런 문제를 해결할 수 있다.
Files 게시판에 예제를 첨부한다.(첨부가 안돼 아래에 정리함)
1. Web Services 클래스에서 Ensemble Business Service 호출예제:
Method CallDBProcess(Action As %String, ColumnName As %String) As %String [ WebMethod ]
{
set tReq=##class(SearchReq).%New()
set tReq.Action=Action
set tReq.Columns=ColumnName
set tSC=##class(Ens.Director).CreateBusinessService("DummySvc",.bs)
if 'tSC quit "Error to find BS"
set tSC=bs.OnProcessInput(tReq, .tRes)
set a=tRes.ResultText
quit a
}
2. Ens Business Service는 Synchronoous 호출을 한다.
Class DummySvc Extends Ens.BusinessService [ ProcedureBlock ]
{
Method OnProcessInput(pInput As SearchReq, pOutput As SearchRes) As %Status
{
set tApplication = pInput
Set tSC = ..SendRequestSync("DataProcess",tApplication,.res) Quit:$$$ISERR(tSC) tSC
Set pOutput = res
Quit tSC
}
}
3. Ensemble Business Process 예제- DBMode의 값에 따라 알맞은 비즈니스 오퍼레이션을 호출한다.
Class DataProcess Extends Ens.BusinessProcessBPL [ ClassType = persistent ]
{
/// BPL Definition
XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl" ]
{
<process language='objectscript' request='SearchReq' response='SearchRes' height='2000' width='2000' >
<sequence xend='550' yend='550' >
<switch name='Check the DBMode' xpos='550' ypos='200' xend='550' yend='450' >
<case condition='^DBMode="INTERSYSTEMS"' >
<call name='Ens Call' target='EnsDBOperation' async='0' timeout='5' xpos='685' ypos='350' >
<request type='SearchReq' >
<assign property='callrequest' value='request' action='set' />
request>
<response type='SearchRes' >
<assign property='response' value='callresponse' action='set' />
response>
call>
case>
<case condition='^DBMode="ORACLE"' >
<call name='Ora Call' target='OraDBOperation' async='0' timeout='5' xpos='955' ypos='350' >
<request type='SearchReq' >
<assign property='callrequest' value='request' action='set' />
request>
<response type='SearchRes' >
<assign property='response' value='callresponse' action='set' />
response>
call>
case>
<default/>
switch>
sequence>
process>
}
}
4. Ens DB Operation 의 예제 (Ensemble DB의 경우)
Class EnsDBOperation Extends Ens.BusinessOperation [ ProcedureBlock ]
{
Parameter ADAPTER = "EnsLib.SQL.OutboundAdapter";
Parameter INVOCATION = "Queue";
Method Search(pRequest As SearchReq, Output pResponse As SearchRes) As %Status
{
// parse Action
set pResponse=##class(SearchRes).%New()
if (pRequest.Action="Study") {
set sql="select top 2 * from sample.person" //"select top 50 key from Study"
set tSC= ..Adapter.ExecuteQuery(.rs,sql)
while (rs.Next()) {
set pResponse.ResultText=pResponse.ResultText_","_rs.GetData(1)_" "_rs.Get($P(pRequest.Columns,","))
}
}
else {
set pResponse.ResultText="No Study"
}
Quit $$$OK
}
XData MessageMap
{
<MapItems>
<MapItem MessageType="SearchReq">
<Method>SearchMethod>
MapItem>
MapItems>
}
}
5. Production의 예제
Class MainProduction Extends Ens.Production
{
XData ProductionDefinition
{
<Production Name="MainProduction" TestingEnabled="true" LogGeneralTraceEvents="false">
<Description>DB Independant ProductionDescription>
<ActorPoolSize>2ActorPoolSize>
<Setting Target="Production" Name="ShutdownTimeout">120Setting>
<Setting Target="Production" Name="UpdateTimeout">10Setting>
<Item Name="EnsDBOperation" Category="InterSystems" ClassName="EnsDBOperation" PoolSize="1" Enabled="true" Foreground="false" InactivityTimeout="0" Comment="CacheDB" LogTraceEvents="true" Schedule="">
<Setting Target="Host" Name="AlertRetryGracePeriod">0Setting>
<Setting Target="Host" Name="RetryInterval">5Setting>
<Setting Target="Host" Name="FailureTimeout">15Setting>
<Setting Target="Host" Name="AlertOnError">0Setting>
<Setting Target="Host" Name="ArchiveIO">0Setting>
<Setting Target="Adapter" Name="DSN">ENSEMBLE SamplesSetting>
<Setting Target="Adapter" Name="Credentials">SYSTEMSetting>
<Setting Target="Adapter" Name="StayConnected">-1Setting>
<Setting Target="Adapter" Name="ConnectTimeout">5Setting>
Item>
<Item Name="OraDBOperation" Category="Oracle" ClassName="EnsDBOperation" PoolSize="1" Enabled="false" Foreground="false" InactivityTimeout="0" Comment="Oracle DB " LogTraceEvents="false" Schedule="">
<Setting Target="Host" Name="AlertRetryGracePeriod">0Setting>
<Setting Target="Host" Name="RetryInterval">5Setting>
<Setting Target="Host" Name="FailureTimeout">15Setting>
<Setting Target="Host" Name="AlertOnError">0Setting>
<Setting Target="Host" Name="ArchiveIO">0Setting>
<Setting Target="Adapter" Name="DSN">OracleSetting>
<Setting Target="Adapter" Name="Credentials">ORAUSERSetting>
<Setting Target="Adapter" Name="StayConnected">-1Setting>
<Setting Target="Adapter" Name="ConnectTimeout">5Setting>
Item>
<Item Name="TestOp" Category="Test" ClassName="EnsDBOperation" PoolSize="1" Enabled="true" Foreground="false" InactivityTimeout="0" Comment="Test" LogTraceEvents="false" Schedule="">
Item>
<Item Name="DataProcess" Category="" ClassName="DataProcess" PoolSize="0" Enabled="true" Foreground="false" InactivityTimeout="0" Comment="" LogTraceEvents="false" Schedule="">
Item>
<Item Name="DummySvc" Category="" ClassName="DummySvc" PoolSize="0" Enabled="true" Foreground="false" InactivityTimeout="0" Comment="" LogTraceEvents="false" Schedule="">
Item>
Production>
}
}
|