例をもとに、AXIS利用時にSOAPのRPC機能(JAX-RPC)を、スタブで利用するアプリケーションの開発手順を説明します。
アプリケーションの開発は、以下の手順で行います。
スタブを作成するためには、AXISが利用できる環境が必要となります。AXISのバージョン1.3(説明:Final Version 1.3 日付:October 5, 2005)を使用してください。
図D.13 開発の手順
アクセス先のISIサーバで用意されているWSDLファイル(ESIService.wsdl)を取得し、任意のディレクトリに格納します。
例)“D:\WSDL\ESIService.wsdl”
ISIのWSDLファイルの取得方法は、ISIサーバの運用管理者に問い合わせてください。
AXISのコマンドを使用し、手順1で取得したWSDLファイルを利用して、クライアントスタブを自動生成します。
なお、コマンドを実行するためには、org.apache.axis.wsdl.WSDL2Javaが実行できる環境の設定が必要です。
java org.apache.axis.wsdl.WSDL2Java D:\WSDL\ESIService.wsdl ……(a) |
手順1で取得したWSDLファイルを指定してください。
以下のファイルが生成されたことを確認します。
“com\fujitsu\esi\client\ESIJMSReceiveFilter.java”
“com\fujitsu\esi\message\ESIAttachment.java”
“com\fujitsu\esi\message\ESIBytePayload.java”
“com\fujitsu\esi\message\ESIFunction.java”
“com\fujitsu\esi\message\ESIHeader.java”
“com\fujitsu\esi\message\ESIHistoryInfo.java”
“com\fujitsu\esi\message\ESIMessage.java”
“com\fujitsu\esi\message\ESIParameter.java”
“com\fujitsu\esi\message\ESIParameterItem.java”
“com\fujitsu\esi\message\ESIPayload.java”
“com\fujitsu\esi\message\ESISequence.java”
“com\fujitsu\esi\message\ESISequnceLogInfo.java”
“ESIServer\ESIServerPortSoapBinding.java”
“ESIServer\ESIServerPortType.java”
“ESIServer\ESIServerService.java”
“ESIServer\ESIServerServiceLocator.java”
自動生成された上記のファイルをすべて、コンパイルします。
ロケータオブジェクトを作成します。
プロキシオブジェクトを作成します。
Webサービスを呼び出します。
ISI 8.0以降では、WSDLファイルが変更されています。ISI 7.0で提供しているWSDLファイルを用いてアプリケーションを作成している場合、アプリケーションを修正する必要があります。詳細は、“D.3.3 アプリケーションの移行”を参照してください。
以下のサンプルプログラム“ESIClientSample.java”の斜体部分は、同期送信サービスの呼出し例です。
package sample; import java.net.MalformedURLException; import java.net.URL; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import com.fujitsu.esi.client.*; import com.fujitsu.esi.message.*; import ESIServer.ESIServerPortType; import ESIServer.ESIServerService; import ESIServer.ESIServerServiceLocator; public class ESIClientSample { public static void main(String[] args){ try { //(5)ロケータオブジェクトの作成 ESIServerService serviceLocator = new ESIServerServiceLocator(); //(6)プロキシオブジェクトの作成 ESIServerPortType serviceProxy = serviceLocator.getESIServerPort(); ……(a) ESIMessage reqmsg = new ESIMessage(); ……(b) ESIParameter param = reqmsg.getHeader().getParameter(); //シーケンス名設定 ESIParameterItem[] items= new ESIParameterItem[1]; |
送信先WebサービスのURLの指定には、2種類の方法があります。
手順1で取得したWSDLファイルに記述されている送信先WebサービスのURLに送信する場合は、パラメタなしでプロキシオブジェクトを作成します。(サンプルプログラム“ESIClientSample.java”の方法)
例:ESIServerPortType serviceProxy = serviceLocator.getESIServerPort();
手順1で取得したWSDLファイルに記述されている送信先WebサービスのURLとは異なるURLに送信する場合、送信先URLをパラメタに設定し、プロキシオブジェクトを作成します。
例:ESIServerPortType serviceProxy = serviceLocator.getESIServerPort(new URL("送信先URL"));
注意事項を参照してください。
ISIがWebサービスとして提供しているメソッドは、以下のとおりです。
同期送信サービス:sendESIMsgSync(ESIMessage)
非同期送信サービス:sendESIMsgAsync(ESIMessage)
非同期受信サービス:receiveESIMsgAsync(ESIJMSReceiveFilter, Queue名)
メッセージ送受信APIを利用した送信用メソッドは同一ですが、スタブを利用した送信用のメソッドは異なります。
各メソッドを呼び出す場合、共通メッセージ(ESIMessage)に設定が必要な項目を以下に示します。
メソッド名 | キュー名 | シーケンス名 |
---|---|---|
sendESIMsgSync(ESIMessage) | - | ○ |
sendESIMsgAsync(ESIMessage) | △ | ○ |
○:ESIMessageに設定必須
△:ESIMessageに設定可(省略時は、デフォルト値が有効となります。)
-:ESIMessageに設定不要(設定は無効となります。)
共通メッセージの作成方法については、“D.4 共通メッセージの作成・操作”を参照してください。
以下のキー名を指定して値を取得すると、ISI呼出し結果情報やエラーが発生した原因情報を取得できます。
キー名 | 情報 |
---|---|
com.fujitsu.esi.status | ISIの処理結果です。
|
com.fujitsu.esi.error.code | ISIの処理中に最初に発生したエラーのエラーコードです。 |
com.fujitsu.esi.error.stepname | エラーが発生したステップです。 |
com.fujitsu.esi.error.methodtype | エラーが発生したメソッド種別です。 |
com.fujitsu.esi.error.handle.status | ISI処理のエラー発生時に呼び出したシーケンスの処理結果です。
|
com.fujitsu.esi.error.handle.code | エラー発生時に呼び出したシーケンスの中で、最初に発生したエラーのエラーコードです。 |
com.fujitsu.esi.error.handle.stepname | エラー発生時に呼び出したシーケンスの中で、エラーが発生したステップです。 |
com.fujitsu.esi.error.handle.methodtype | エラー発生時に呼び出したシーケンスの中で、エラーが発生したメソッド種別です。 |
注意事項
ESIMessageの要素を初期化するためには、以下の設定が必要です。
ESIMessage reqmsg = new ESIMessage(); ESIHeader header = new ESIHeader(); ESIParameter parameter = new ESIParameter(); ESIParameterItem[] items= new ESIParameterItem[0]; parameter.setItems(items); header.setParameter(parameter); ESISequence sequence = new ESISequence(); ESISequenceLogInfo[] sequenceLogList = new ESISequenceLogInfo[0]; sequence.setSequenceLogInfoList(sequenceLogList); ESIFunction[] fuctionList = new ESIFunction[0]; sequence.setFunctionList(fuctionList); ESIBytePayload objectPayload = new ESIBytePayload(); ESIPayload payload = new ESIPayload(); payload.setBytePayload(objectPayload); ESIAttachment attachment = new ESIAttachment(); ESIBytePayload[] bytePayload = new ESIBytePayload[0]; attachment.setBytePayloadList(bytePayload); payload.setAttachment(attachment); header.setSequence(sequence); reqmsg.setHeader(header); reqmsg.setPayload(payload); |
サンプルプログラム“ESIClientSample.java”で呼出し例をあげた同期送信サービス以外の各メソッドの呼出し例を、以下に示します。サンプルプログラム“ESIClientSample.java”の斜体の部分を置き換えてください。
ESIMessage reqmsg = new ESIMessage();
ESIParameter param = reqmsg.getHeader().getParameter();
//キュー名、シーケンス名設定
ESIParameterItem[] items= new ESIParameterItem[2];
items[0] = new ESIParameterItem();
items[0].setKey("com.fujitsu.esi.queue.name ");
items[0].setValue("sampleQueue");
items[1] = new ESIParameterItem();
items[1].setKey("com.fujitsu.esi.sequence.name");
items[1].setValue("sample_sequence");
param.setItems(items);
:
//(7)Webサービスの呼出し
ESIMessage rspmsg = serviceProxy.sendESIMsgAsync(reqmsg);
//戻り値ESIMessageのシーケンス名、キュー名取得
String sequenceName = null;
String queueName = null;
ESIParameterItem[] resultItems = rspmsg.getHeader().getParameter().getItems();
for( int i= 0; i < resultItems.length; i++){
if( resultItems[i].getKey().equals("com.fujitsu.esi.sequence.name") ){
sequenceName = resultItems[i].getValue();
}else if( resultItems[i].getKey().equals("com.fujitsu.esi.queue.name") ){
queueName = resultItems[i].getValue();
}
} |
ESIJMSReceiveFilter fltr = new ESIJMSReceiveFilter(); //クエリ設定 fltr.setQuery("sampleKey='SampleValue'"); ……(a) //キュー名設定 String queue = "sampleQueue"; : |
ESIJMSReceiveFilterにクエリを設定しない場合は、キューの先頭に格納されている共通メッセージを受信します。
■Basic認証、接続タイムアウト時間、セション管理の設定
Basic認証の設定は、スタブオブジェクトのプロパティで設定します。
接続タイムアウト時間、セション管理の設定は、スタブオブジェクトのメソッドで設定します。
例:サンプルプログラム“ESIClientSample.java”をもとに、各設定方法を以下に示します。
: import org.apache.axis.client.Stub; public class ESIClientSample { public static void main(String[] args){ try { //(1)ロケータオブジェクトの作成 ESIServerService serviceLocator = new ESIServerServiceLocator(); //(2)プロキシオブジェクトの作成 ESIServerPortType serviceProxy = serviceLocator.getESIServerPort(); //Basic認証:ユーザ名、パスワード設定 ((Stub) serviceProxy)._setProperty(Stub.USERNAME_PROPERTY, "username"); ((Stub) serviceProxy)._setProperty(Stub.PASSWORD_PROPERTY, "password"); //接続タイムアウトの設定 ((Stub) serviceProxy).setTimeout(50000); ……(a) //セション管理 ((Stub) serviceProxy).setMaintainSession(true); ……(b) : |
AXISが提供しているStubクラスの以下のメソッドを使用し、接続を切断するタイムアウト時間(ミリ秒)を設定します。
設定しない場合は、デフォルト値“60000(1分)”が有効となります。
public void setTimeout(int timeout)
AXISのバージョン1.3を利用した場合です。
タイムアウト時間がISIサーバの処理時間より短い場合、接続タイムアウトが発生します。接続タイムアウトが発生すると、クライアント側でエラーになったり、データが消失したりする可能性があるため、タイムアウト時間は、ISIサーバの処理時間より長めに設定してください。
AXISが提供しているStubクラスの以下のメソッドを使用し、HTTPセション継続を行うかどうか設定します。
設定しない場合は、デフォルト値“false”が有効となります。
public void setMaintainSession(boolean session)
AXISのバージョン1.3を利用した場合です。
■Proxy、SSLの設定
プロキシ情報、SSL情報は、アプリケーション実行時のJavaVMオプションからシステムプロパティに設定します。
例:ESIClientSample.java
java -Dhttp.proxySet=true -Dhttp.proxyHost=proxy.proxyhost.com -Dhttp.proxyPort=8080 -Dhttp.nonProxyHosts =localhost|*.myhost.com -Dhttp.proxyUser=proxyUserName -Dhttp.proxyPassword=proxyPassword -Djavax.net.ssl.trustStore=C:\cert\truststore\keystore -Djavax.net.ssl.trustStorePassword=trustpass -Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.keyStore=C:\cert\keystore\keystore -Djavax.net.ssl.keyStorePassword=keystorepass -Djavax.net.ssl.keyStoreType=jks ESIClientSample |
プロパティ名 | 値 | 備考 |
---|---|---|
http.proxySet | 以下のいずれかを指定します。
|
|
http.proxyHost | プロキシサーバのホスト名 |
|
http.proxyPort | プロキシサーバのポート番号 |
|
http.nonProxyHosts | プロキシを経由せずに接続するホスト名 | “|”区切りで複数のホストを指定できます。 |
http.proxyUser | プロキシサーバのユーザ名 | プロキシがBasic認証を行っている場合に設定してください。 |
http.proxyPassword | プロキシサーバのパスワード | プロキシがBasic認証を行っている場合に設定してください。 |
javax.net.ssl.trustStore | SSLサーバ認証用のキーストアのパス名 |
|
javax.net.ssl.trustStorePassword | SSLサーバ認証用のキーストアのパスワード |
|
javax.net.ssl.trustStoreType | SSLサーバ認証用のキーストアのタイプ |
|
javax.net.ssl.keyStore | SSLクライアント認証用のキーストアのパス名 |
|
javax.net.ssl.keyStorePassword | SSLクライアント認証用のキーストアのパスワード |
|
javax.net.ssl.keyStoreType | SSLクライアント認証用のキーストアのタイプ |
|