相互運用プロダクション内での組み込み Python の使用法
InterSystems IRIS 内の相互運用プロダクション向けにカスタムのビジネス・ホスト・クラスやアダプタ・クラスを記述している場合、コールバック・メソッドはすべて ObjectScript で記述する必要があります。コールバック・メソッドは既定では何もしない継承メソッドですが、ユーザにより実装されるよう設計されています。ただし、コールバック・メソッドの ObjectScript コードは、Python ライブラリを活用したり、Python で実装されたその他のメソッドを呼び出すことができます。
以下の例は、受信メッセージから文字列値を取得し、Amazon Web Services (AWS) boto3 Python ライブラリを使用して、その文字列を Amazon Simple Notification Service (SNS) を介してテキスト・メッセージとして電話に送信するビジネス・オペレーションを示しています。この AWS ライブラリはここでの説明の範囲外ですが、この例では、OnInit() および OnMessage() コールバック・メソッドは ObjectScript で記述されているのに対し、PyInit() および SendSMS() のメソッドは Python で記述されていることがわかります。
/// Send SMS via AWS SNS
Class dc.opcua.SMS Extends Ens.BusinessOperation
{
Parameter INVOCATION = "Queue";
/// AWS boto3 client
Property client As %SYS.Python;
/// json.dumps reference
Property tojson As %SYS.Python;
/// Phone number to send SMS to
Property phone As %String [ Required ];
Parameter SETTINGS = "phone:SMS";
Method OnMessage(request As Ens.StringContainer, Output response As Ens.StringContainer) As %Status
{
#dim sc As %Status = $$$OK
try {
set response = ##class(Ens.StringContainer).%New(..SendSMS(request.StringValue))
set code = +{}.%FromJSON(response.StringValue).ResponseMetadata.HTTPStatusCode
set:(code'=200) sc = $$$ERROR($$$GeneralError, $$$FormatText("Error sending SMS,
code: %1 (expected 200), text: %2", code, response.StringValue))
} catch ex {
set sc = ex.AsStatus()
}
return sc
}
Method SendSMS(msg As %String) [ Language = python ]
{
response = self.client.publish(PhoneNumber=self.phone, Message=msg)
return self.tojson(response)
}
Method OnInit() As %Status
{
#dim sc As %Status = $$$OK
try {
do ..PyInit()
} catch ex {
set sc = ex.AsStatus()
}
quit sc
}
/// Connect to AWS
Method PyInit() [ Language = python ]
{
import boto3
from json import dumps
self.client = boto3.client("sns")
self.tojson = dumps
}
}
上記の OnMessage() メソッドのコードには、このドキュメントを印刷する際により適した書式設定とするために余分の改行が含まれています。
このルールの 1 つの例外は、アダプタからの入力を使用していない場合に、Python でコールバック・メソッドを実装できることです。
以下のビジネス・サービスの例は poller として知られています。この場合、ビジネス・サービスは間を置いて実行するよう設定でき、処理のためにビジネス・プロセスに送信される要求 (この場合はランダムな文字列値を含む) を生成します。この例では、OnProcessInput() コールバック・メソッドを Python に実装できます。これはこのメソッドのシグニチャで pInput 引数を利用していないためです。
Class Debug.Service.Poller Extends Ens.BusinessService
{
Property Target As Ens.DataType.ConfigName;
Parameter SETTINGS = "Target:Basic";
Parameter ADAPTER = "Ens.InboundAdapter";
Method OnProcessInput(pInput As %RegisteredObject, Output pOutput As %RegisteredObject,
ByRef pHint As %String) As %Status [ Language = python ]
{
import iris
import random
fruits = ["apple", "banana", "cherry"]
fruit = random.choice(fruits)
request = iris.cls('Ens.StringRequest')._New()
request.StringValue = fruit + ' ' + iris.cls('Debug.Service.Poller').GetSomeText()
return self.SendRequestAsync(self.Target,request)
}
ClassMethod GetSomeText() As %String
{
Quit "is something to eat"
}
}
相互運用プロダクションのプログラミングに関する詳細は、"ビジネス・サービス、ビジネス・プロセス、およびビジネス・オペレーションのプログラミング" を参照してください。