5.1.7 サーバUAPの作成方法

XATMIインタフェースの通信で使うサービス関数(サーバUAP)から関数を呼び出す方法について説明します。OpenTP1のサービス関数とは,コーディングの方法が異なります。

<この項の構成>
(1) サーバUAPで提供するサービス関数のコーディング
(2) 一つのノードまたは複数のノードでの負荷分散と,tpunadvertise()の関係

(1) サーバUAPで提供するサービス関数のコーディング

C言語の場合は,サービス関数のコーディングをするときは,tpservice()で示す形式に従ってください。tpservice()では,コーディングするための標準的な形式を示します。

COBOL言語の場合は,サービスプログラムの処理でXATMIインタフェースのAPIを使う前にTPSVCSTARTを呼び出します。

(a) サービス関数の終了方法

サービス関数は,tpreturn()TPRETURNを呼び出すことでその処理が終了したことになります。XATMIインタフェースの通信では,returnでサービス関数を終了する直前に,必ずtpreturn()を呼び出してください。tpreturn()を呼び出したあとで何らかの処理をした場合,その動作については保証しません。

(b) サービス名の広告

サーバUAPでは,自分のサービス名がサービスを提供できる状態であることを宣言できます(サービス名の広告)。サービス名を広告する場合は,tpadvertise()TPADVERTISEを使います。

サーバUAPの起動時には,ユーザサービス定義に指定してあるサービスが広告済みとなります。ユーザサービス定義に指定してあるサービス名でtpadvertise()を呼び出す必要はありません。

サービス名の広告を取り消す場合は,tpunadvertise()TPUNADVERTISEを使います。tpunadvertise()を呼び出すことで,該当のサービス名に対するサービス要求はエラーリターンします。いったんtpunadvertise()で広告を取り消したサービス名でも,そのあとでtpadvertise()を呼び出せば,再びサービス要求を受け付けることができます。

tpadvertise()とtpunadvertise()は,SPPでだけ使えます。ただし,dc_rpc_mainloop関数を呼び出す前には使えません。

tpadvertise()は,広告する関数アドレスを引数に持っていて,広告できるかどうかをチェックします。OpenTP1では,tpadvertise()を呼び出すサーバへのサービスグループと,サービスを広告しているサーバのサービスグループが同じであれぱ,すでに広告されていると見なして正常リターンします。サービスグループが一致しないと,tpadvertise()はエラーリターンします。

(2) 一つのノードまたは複数のノードでの負荷分散と,tpunadvertise()の関係

(a) 一つのノードでの負荷分散の場合(マルチサーバ)

一つのノードで負荷分散している場合(マルチサーバ),tpunadvertise()をどれか一つのプロセスから呼び出すと,負荷分散しているプロセスすべてでサービスを受け付けられなくなります。その後,tpadvertise()で再びサービスを広告すれば,サービス要求を受け付けられるようになります。

マルチサーバを使えるのは,キュー受信型サーバ(スケジュールサービスでスケジュールされるSPP)です。ソケット受信型サーバはマルチサーバを使えません。

(b) 複数のノードでの負荷分散の場合(ノード間負荷バランス機能およびノード間負荷バランス拡張機能)

複数のノードで負荷分散している場合(ノード間負荷バランス機能およびノード間負荷バランス拡張機能),tpunadvertise()を呼び出したプロセスのノードではサービスを実行しなくなりますが,ほかのノードのサーバでサービスを受け付けることができます。その後,tpadvertise()で再びサービスを広告すれば,サービス要求を受け付けられるようになります。

ノード間負荷バランス機能は,キュー受信型サーバ,ソケット受信型サーバのどちらでも使えます。ノード間負荷バランス拡張機能は,キュー受信型サーバだけで使えます。