Skip to main content

相互運用プロダクション内での組み込み Python の使用法

InterSystems IRIS 内の相互運用プロダクション向けにカスタムのビジネス・ホスト・クラスやアダプタ・クラスを記述している場合、コールバック・メソッドはすべて ObjectScript で記述する必要があります。シグニチャが ByRef キーワードと Output キーワードを使用するためです。コールバック・メソッドは既定では何もしない継承メソッドですが、ユーザにより実装されるよう設計されています。ただし、コールバック・メソッドの ObjectScript コードは、Python パッケージを活用したり、Python で実装されたその他のメソッドを呼び出すことができます。

以下の例は、受信メッセージから文字列値を取得し、Amazon Web Services (AWS) boto3 SDK for Python を使用して、その文字列を Amazon Simple Notification Service (SNS) を介してテキスト・メッセージとして電話に送信するビジネス・オペレーションを示しています。このパッケージの詳細はここでの説明の範囲外ですが、この例では、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
}

}
Note:

上記の OnMessage() メソッドのコードには、このドキュメントを印刷する際により適した書式設定とするために余分の改行が含まれています。

以下のビジネス・サービスの例は poller として知られています。この場合、ビジネス・サービスは間を置いて実行するよう設定でき、処理のためにビジネス・プロセスに送信される要求 (この場合はランダムな文字列値を含む) を生成します。

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 = objectscript ]
{
    set request = ##class(Ens.StringRequest).%New()
    set request.StringValue = ..RandomMessage()
    return ..SendRequestSync(..Target, request, .pOutput)
}

ClassMethod RandomMessage() As %String [ Language = python ]
{
    import iris
    import random
    fruits = ["apple", "banana", "cherry"]
    fruit = random.choice(fruits)
    return fruit + ' ' + iris.Debug.Service.Poller.GetSomeText()
}

ClassMethod GetSomeText() As %String [ Language = objectscript ]
{
    quit "is something to eat"
}

}

相互運用プロダクションのプログラミングに関する詳細は、"ビジネス・サービス、ビジネス・プロセス、およびビジネス・オペレーションのプログラミング" を参照してください。

FeedbackOpens in a new tab