プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Serverプロキシ・プラグインを使用したOracle User Messaging Serviceによるアプリケーションの開発
12c (12.2.1.2.0)
E82668-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

3 ユーザー・メッセージング・サービスWebサービスAPIを使用したメッセージの送受信

この章では、ユーザー・メッセージング・サービス(UMS) WebサービスAPIを使用してアプリケーションを開発する方法について説明します。このAPIは、Fusion Middlewareアプリケーション開発者が、UMSサーバーに関連するリモート・コンテナで実行されるUMSメッセージング・アプリケーションを実装する際の、プログラム上のエントリ・ポイントとして機能します。

この章の内容は次のとおりです。


注意:

Oracle User Messaging Serviceのコード・サンプルに関する詳細を参照したり、サンプルを自分で実行するには、次の場所にあるサンプルを参照してください。

http://www.oracle.com/technetwork/indexes/samplecode/sample-ums-1454424.html


3.1 UMS WebサービスAPIの概要

UMS WebサービスAPIは、機能的にはJava APIと同じです。Webサービス・タイプおよびインタフェースのJAX-WSおよびJAXBバインディングは、対応するJava APIクラスと類似した名前を持ちます。つまり、UMS Java APIとUMS WebサービスAPIの両方のクライアント・コードは同じように見えます。ただし、APIクラスは、その独自のパッケージ領域内にあり、これら2つのAPIのクラスは相互運用できません。

UMS WebサービスAPIは、次のようにグループ化されたパッケージで構成されています。

  • 共通およびクライアントのパッケージ

    • oracle.ucs.messaging.ws

    • oracle.ucs.messaging.ws.types

  • WebサービスAPIのWeb Service Definition Language (WSDL)ファイル

    • messaging.wsdl: Webサービス・クライアントによって起動される操作を定義します。

    • listener.wsdl: 非同期メッセージまたはステータス通知を受信するためにクライアントで実装する必要のあるコールバック操作を定義します。

ソース・コードを含むサンプルは、Oracle Technology Network (OTN)から入手できます。

3.2 UMSクライアント・インスタンスの作成とランタイム・パラメータの指定

MessagingClientオブジェクトは、UMS WebサービスAPIを使用してクライアント・アプリケーションで作成する必要がある基本的なUMS APIオブジェクトです。oracle.ucs.messaging.ws.MessagingClientのインスタンスはパブリック・コンストラクタを使用して作成できます。クライアント・アプリケーションでは、クライアント・オブジェクトのインスタンス化の実行時に一連のパラメータを指定できます。たとえば、MessagingClientインスタンスを構成するには、複数のパラメータをキーと値のペアのマップとしてjava.util.Map<String, Object>に指定します。特に、これらの構成パラメータは、通信先のUMSサーバーを識別することによるWebサービスのエンドポイントURLの識別、およびセキュリティ・ポリシーなどの他のWebサービス関連情報の識別に役立ちます。クライアント・アプリケーションでは、使用可能なメカニズムを使用して構成パラメータを保存およびロードする必要があります。

デプロイメントに適した構成ストレージ・メカニズムがどのようなものであっても、それへのパラメータのマッピングまたはそこからのパラメータのマッピングは、ユーザーの責任です。MessagingClientクラスでは指定されたキーと値のペアが構成のために使用され、ベースとなるJAX-WSサービスにすべてのパラメータが渡されます。JAX-WSで認識されるパラメータはいずれも有効です。表3-1に、最も一般的な構成パラメータを示します。

表3-1 実行時に指定する構成パラメータ

キー データ型 用途

javax.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY

文字列

リモートUMS WSのエンドポイントURL。これは通常「http://<host>:<port>/ucs/messaging/webservice」です。

javax.xml.ws.BindingProvider.USERNAME_PROPERTY

文字列

該当する場合にWS-Securityヘッダーにアサートされるユーザー名。

oracle.ucs.messaging.ws.ClientConstants.POLICIES

文字列[]

クライアントの要求に添付するOWSM WS-Securityポリシーの配列。サーバー側で指定されたポリシーと一致する必要があります。

oracle.wsm.security.util.SecurityConstants.Config.KEYSTORE_RECIPIENT_ALIAS_PROPERTY

文字列

OWSMポリシーのアタッチに使用されます。資格証明ストアからの暗号化キーおよび署名キーの参照に使用する代替エイリアスを指定します。

oracle.wsm.security.util.SecurityConstants.ClientConstants.WSS_CSF_KEY

文字列

OWSMポリシーのアタッチに使用されます。Oracle Web Services Management資格証明ストア・マップからのリモート・ユーザー名/パスワード情報の参照に使用する資格証明ストア・キーを指定します。


OWSMポリシー・パラメータの詳細は、Oracle Web Services Manager Java APIリファレンスを参照してください。

インスタンス化された後のMessagingClientは、再構成できません。かわりに、新しい構成を使用してMessagingClientクラスの新しいインスタンスを作成する必要があります。

例3-1に、ユーザー名/トークンによるセキュリティを使用して、MessagingClientインスタンスを作成する場合のコードを示します。

例3-1 MessagingClientインスタンスの作成(ユーザー名/トークンによるセキュリティ)

HashMap<String, Object> config = new HashMap<String, Object>();
config.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
 "http://example.com:8001/ucs/messaging/webservice");
config.put(ClientConstants.POLICIES, new String[] {"oracle/wss11_username_token_
with_message_protection_client_policy"});
config.put(BindingProvider.USERNAME_PROPERTY, "user1");
config.put(oracle.wsm.security.util.SecurityConstants.Config.CLIENT_CREDS_
LOCATION, oracle.wsm.security.util.SecurityConstants.Config.CLIENT_CREDS_LOC_
SUBJECT);
config.put(oracle.wsm.security.util.SecurityConstants.ClientConstants.WSS_CSF_KEY,
 "user1-passkey");
config.put(MessagingConstants.APPLICATION_NAME, "MyUMSWSApp");
mClient = new MessagingClient(config);

例3-2に、SAMLトークンによるセキュリティを使用して、MessagingClientインスタンスを作成する場合のコードを示します。

例3-2 MessagingClientインスタンスの作成(SAMLトークンによるセキュリティ)

HashMap<String, Object> config = new HashMap<String, Object>();
config.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
 "http://example.com:8001/ucs/messaging/webservice");
config.put(ClientConstants.POLICIES, new String[] {"oracle/wss11_saml_token_
identity_switch_with_message_protection_client_policy"});
config.put(BindingProvider.USERNAME_PROPERTY, "user1");
config.put(oracle.wsm.security.util.SecurityConstants.Config.CLIENT_CREDS_
LOCATION, oracle.wsm.security.util.SecurityConstants.Config.CLIENT_CREDS_LOC_
SUBJECT);
config.put(oracle.wsm.security.util.SecurityConstants.Config.KEYSTORE_RECIPIENT_
ALIAS_PROPERTY, "example.com");
config.put(MessagingConstants.APPLICATION_NAME, "MyUMSWSApp");
mClient = new MessagingClient(config);

インスタンス化された後のMessagingClientは、再構成できません。かわりに、任意の構成を使用してMessagingClientクラスの新しいインスタンスを作成する必要があります。

WebサービスAPIタイプを作成するためのファクトリ・メソッドが、クラス「oracle.ucs.messaging.ws.MessagingFactory」に用意されています。

3.3 メッセージの送信

MessagingClientオブジェクトのsendメソッドを起動すると、Webサービス・リクエストのメッセージがUMSサーバーに送信されて適切に処理されます。sendメソッドは、メッセージの配信ステータスを取得したり、リスナーに配信される非同期ステータス通知と関連付けたりするために後でクライアント・アプリケーションで使用できる、String message識別子を戻します。戻されたステータスは、UMSの内部処理と外部ゲートウェイから受信した配信通知に基づいた最新のステータスです。

作成できるメッセージのタイプには、プレーン・テキスト・メッセージ、text/plainパートとtext/htmlパートで構成できるマルチパート・メッセージ、および異なる配信タイプを使用して、複数受信者用の単一メッセージに配信チャネル(DeliveryType)固有のペイロードを作成するメッセージがあります。

3.3.1 メッセージの作成

この項では、作成できる様々なタイプのメッセージについて説明します。

3.3.1.1 プレーン・テキスト・メッセージの作成

例3-3に、UMS WebサービスAPIを使用してプレーン・テキスト・メッセージを作成する2つの方法を示します。

例3-3 UMS WebサービスAPIを使用したプレーン・テキスト・メッセージの作成

Message message = MessagingFactory.createTextMessage("This is a Plain Text
 message.");

or

Message message = MessagingFactory.createMessage();
message.setContent(new DataHandler(new StringDataSource("This is a Plain Text
 message.", "text/plain; charset=UTF-8")));

3.3.1.2 テキスト・パートとバイナリ・パートを持つマルチパート/混合メッセージの作成

例3-4に、UMS WebサービスAPIを使用してマルチパート/混合メッセージを作成する方法を示します。

例3-4 UMS WebサービスAPIの使用によるマルチパート/混合メッセージの作成

Message message = MessagingFactory.createMessage();
MimeMultipart mp = new MimeMultipart("mixed");
 
// Create the first body part
MimeBodyPart mp_partPlain = new MimeBodyPart();
StringDataSource plainDS = new StringDataSource("This is a Plain Text part.",
 "text/plain; charset=UTF-8");
mp_partPlain.setDataHandler(new DataHandler(plainDS));
mp.addBodyPart(mp_partPlain);
 
byte[] imageData; 
// Create or load image data in the above byte array (code not shown for brevity)
 
// Create the second body part
MimeBodyPart mp_partBinary = new MimeBodyPart();
ByteArrayDataSource binaryDS = new ByteArrayDataSource(imageData, "image/gif");
mp_partBinary.setDataHandler(binaryDS);
mp.addBodyPart(mp_partBinary);
 
message.setContent(new DataHandler(mp, mp.getContentType()));

3.3.1.3 Text/PlainパートとText/HTMLパートを持つマルチパート/代替メッセージの作成

例3-5に、UMS WebサービスAPIを使用してマルチパート/代替メッセージを作成する方法を示します。

例3-5 UMS WebサービスAPIの使用によるマルチパート/代替メッセージの作成

Message message = MessagingFactory.createMessage();
MimeMultipart mp = new MimeMultipart("alternative");
MimeBodyPart mp_partPlain = new MimeBodyPart();
StringDataSource plainDS = new StringDataSource("This is a Plain Text part.", "text/plain; charset=UTF-8");
mp_partPlain.setDataHandler(new DataHandler(plainDS));
mp.addBodyPart(mp_partPlain);

MimeBodyPart mp_partRich = new MimeBodyPart();
StringDataSource richDS = new StringDataSource(
    "<html><head></head><body><b><i>This is an HTML part.</i></b></body></html>",
    "text/html");
mp_partRich.setDataHandler(new DataHandler(richDS));
mp.addBodyPart(mp_partRich);

message.setContent(new DataHandler(mp, mp.getContentType())); 

3.3.1.4 異なる配信タイプを使用した、複数受信者用の単一メッセージへの配信チャネル固有のペイロード作成

メッセージを複数の受信者に送信する際は、複数のチャネルが関連する場合があります。Oracle UMSアプリケーション開発者は、各チャネルに対して正しいマルチパート書式を指定する必要があります。

例3-6に、異なる配信タイプを使用して、複数受信者用の単一メッセージに、配信チャネル(DeliveryType)固有のペイロードを作成する方法を示します。

複数ペイロードのマルチパート/代替メッセージの各最上位パートには、このヘッダーの値が1つ以上含まれている必要があります。このヘッダーの値は、有効な配信タイプの名前である必要があります。DeliveryTypeの使用可能な値は、列挙DeliveryTypeを参照してください。

例3-6 異なる配信タイプを使用した、複数受信者用の単一メッセージへの配信チャネル固有のペイロード作成

Message message = MessagingFactory.createMessage();
 
// create a top-level multipart/alternative MimeMultipart object.
MimeMultipart mp = new MimeMultipart("alternative");
 
// create first part for SMS payload content.
MimeBodyPart part1 = new MimeBodyPart();
part1.setDataHandler(new DataHandler(new StringDataSource("Text content for SMS.",
 "text/plain; charset=UTF-8")));
part1.setHeader(Message.HEADER_NS_PAYLOAD_PART_DELIVERY_TYPE, "SMS");
// add first part
mp.addBodyPart(part1);
 
// create second part for EMAIL and IM payload content.
MimeBodyPart part2 = new MimeBodyPart();
MimeMultipart part2_mp = new MimeMultipart("alternative");
MimeBodyPart part2_mp_partPlain = new MimeBodyPart();
part2_mp_partPlain.setDataHandler(new DataHandler(new StringDataSource("Text
 content for EMAIL/IM.", "text/plain; charset=UTF-8")));
part2_mp.addBodyPart(part2_mp_partPlain);
MimeBodyPart part2_mp_partRich = new MimeBodyPart();
part2_mp_partRich.setDataHandler(new DataHandler(new
 StringDataSource("<html><head></head><body><b><i>" + "HTML content for EMAIL/IM."
 +
    "</i></b></body></html>", "text/html; charset=UTF-8")));
part2_mp.addBodyPart(part2_mp_partRich);
part2.setContent(part2_mp, part2_mp.getContentType());
part2.addHeader(Message.HEADER_NS_PAYLOAD_PART_DELIVERY_TYPE, "EMAIL");
part2.addHeader(Message.HEADER_NS_PAYLOAD_PART_DELIVERY_TYPE, "IM");
// add second part
mp.addBodyPart(part2);
 
// set the content of the message
message.setContent(new DataHandler(mp, mp.getContentType()));
    
// set the MultiplePayload flag to true 
MimeHeader multiHeader = new MimeHeader();
multiHeader.setName(oracle.sdp.client.Message.HEADER_SDPM_MULTIPLE_PAYLOAD);
multiHeader.setValue(Boolean.TRUE.toString());
message.getHeaders().add(multiHeader);

3.3.2 MessageインタフェースのAPIリファレンス

MessageインタフェースのAPIリファレンスには、Javadocからアクセスできます。

3.3.3 列挙DeliveryTypeのAPIリファレンス

列挙DeliveryTypeのAPIリファレンスには、ユーザー・メッセージング・サービスJava APIリファレンスからアクセスできます。

3.3.4 アドレスの作成

アドレスのタイプ、Addressオブジェクトの作成方法およびフェイルオーバー・アドレスの定義方法の詳細は、第2.3.2項「アドレスの作成」を参照してください。

Addressインタフェースの詳細は、ユーザー・メッセージング・サービスJava APIリファレンスを参照してください。

3.3.4.1 受信者のタイプ

WS APIでは、電子メール・ドライバで使用されるTo/Cc/Bcc受信者を使用したメッセージの送受信をサポートしています。

  • メッセージの送信でCc/Bcc受信者を指定するには、oracle.ucs.messaging.ws.MessagingFactory.buildAddressメソッドを使用してoracle.ucs.messaging.ws.Addressオブジェクトを作成します。引数はアドレス値(たとえばuser@domain.com)、配信タイプ(たとえばDeliveryType.EMAIL)および電子メール・モード(たとえば「Cc」や「Bcc」)です。

  • (たとえば受信したメッセージ内にある)既存のアドレス・オブジェクトの受信者タイプを特定するには、oracle.ucs.messaging.ws.MessagingFactory.getRecipientTypeメソッドを使用してAddressオブジェクトを渡します。それに対して受信者タイプを示す文字列が戻されます。

3.3.4.2 MessagingFactoryクラスのAPIリファレンス

クラスMessagingFactoryの詳細は、ユーザー・メッセージング・サービスJava APIリファレンスを参照してください。

3.3.5 メッセージ内のユーザー・プリファレンス

WS APIを使用してメッセージを作成する際、そのメッセージのユーザー・プリファレンスでビジネス条件のファクトを指定することもできます。詳細は、第2.3.3項「ユーザー・プリファレンス・ベースのメッセージング」を参照してください。

3.4 メッセージ・ステータスの取得

メッセージを送信した後は、Oracle UMSを使用して、メッセージ・ステータスを同期または非同期で取得できます。

3.4.1 メッセージ・ステータスの同期取得

現行ステータスの同期取得を実行するには、MessagingClient APIから次のフローを使用します。

String messageId = messagingClient.send(message);
List<Status> statuses = messagingClient.getStatus(messageId, null)

または、

List<Status> statuses = messagingClient.getStatus(messageId, addresses) --- where
addresses is a "List<Address>" of one or more of the recipients set in the message.

3.4.2 メッセージ・ステータスの非同期取得

ステータスを非同期的で取得するには、listener.wsdlに記載されているListener Webサービスがクライアント・アプリケーションで実装されている必要があります。リスナー・エンドポイントの実装方法に制約はありません。たとえば、1つの方法は、javax.xml.ws.Endpoint JAX-WS Service APIを使用してWebサービス・エンドポイントをパブリッシュすることです。このメカニズムはJava SE 6で利用でき、コンシューマはJava EEサーブレット・モジュールを明示的に定義する必要はありません。

ただし、サーブレット・ベースのリスナー実装も可能です。

メッセージを送信する際、クライアント・アプリケーションは、エンドポイントURLおよびSOAPインタフェース名で構成されるリスナー・エンドポイントへの参照を提供できます。ステータスはメッセージの処理中に生成されるため、UMSサーバーはリスナー・エンドポイントのonStatusメソッドを呼び出してクライアント・アプリケーションに通知します。

3.4.2.1 リスナーの作成

リスナーは、oracle.ucs.messaging.ws.Listenerインタフェースを実装して作成します。このインタフェースは、具体クラス(既存クラスの1つ、新規クラス、あるいは無名クラスか内部クラス)として実装できます。

次のコード例は、ステータス・リスナーの実装方法を示しています。

@PortableWebService(serviceName="ListenerService",
targetNamespace="http://xmlns.oracle.com/ucs/messaging/",
endpointInterface="oracle.ucs.messaging.ws.Listener",
wsdlLocation="META-INF/wsdl/listener.wsdl",
portName="Listener")
public class MyListener implements Listener {
  public MyListener() {
  }
    
  @Override
  public void onMessage(Message message, byte[] correlator) throws MessagingException {
    System.out.println("I got a message!");  
  }  @Override
  public void onStatus(Status status, byte[] correlator) throws MessagingException {
    System.out.println("I got a status!");
  }
}

3.4.2.2 コールバック・サービスのパブリッシュ

コールバック・サービスをパブリッシュするには、アプリケーション内のWebモジュールのweb.xmlでサーブレットを宣言するか、またはJAX-WSのjavax.xml.ws.Endpointクラスのパブリッシュ・メソッドを使用してプログラムによりWSエンドポイントをパブリッシュします(例3-7)。

例3-7 コールバック・サービスのパブリッシュ

Listener myListener = new MyListener();
String callbackURL = "http://host:port/umswscallback";
Endpoint myEndpoint = javax.xml.ws.Endpoint.publish(callbackURL, myListener);

3.4.2.3 動的にパブリッシュされたエンドポイントの停止

動的にパブリッシュされたエンドポイントを停止するには、Endpoint.publish()から戻されたEndpointオブジェクトでstop()メソッドを呼び出します(例3-8)。

例3-8 動的にパブリッシュされたエンドポイントの停止

// When done, stop the endpoint, ideally in a finally block or other reliable cleanup mechanism
myEndpoint.stop();

3.4.2.4 登録

リスナーWebサービスがパブリッシュされると、そのようなエンドポイントがクライアントにあることを登録する必要があります。MessagingClient APIには次の関連メソッドがあります。

  • setStatusListener(ListenerReference listener)

  • send(Message message, ListenerReference listener, byte[] correlator)

setStatusListener()ではデフォルトのステータス・リスナーを登録し、着信ステータス・メッセージに対してはそのリスナーのコールバックが呼び出されます。send()に渡されたリスナーは、対応するメッセージに関連するステータス更新に対してのみ呼び出されます。

3.5 メッセージの受信

この項では、アプリケーションでメッセージを受信する方法について説明します。

着信メッセージを受信するアプリケーションでは、メッセージの受信者アドレスを表すアクセス・ポイントを1つ以上登録する必要があります。サーバーでは、着信メッセージの受信者アドレスと一連の登録済アクセス・ポイントを照合し、一致したアクセス・ポイントを登録したアプリケーションに、その着信メッセージをルーティングします。アプリケーション側から見ると、メッセージを受信するモードには同期と非同期があります。

3.5.1 アクセス・ポイントの登録

AccessPointは、着信メッセージを受信するための1つ以上のデバイス・アドレスを表します。アクセス・ポイントの詳細は、第2.5.1項「アクセス・ポイントの登録」を参照してください。

3.5.2 同期受信

メソッドMessagingClient.receiveを使用して、UMSがアプリケーションで使用可能にしたメッセージを同期受信します。このメソッドは、メッセージの非同期受信による構成オーバーヘッドを望まない軽量なクライアント向けの便利なポーリング・メソッドです。


注意:

複数のUMSサーバーのデプロイメントでは、WS APIユーザーはすべてのUMSサーバーでreceiveが呼び出されることを確認する必要があります。これを行うには、たとえば、ロード・バランサでラウンドロビン・アルゴリズムが使用されるようにします。または、かわりに「非同期受信」で説明されているように、このユースケースでreceiveを使用せず、リスナーを使用して非同期受信を使用します。

受信は非ブロック操作です。アプリケーションやアクセス・ポイントに関して保留中のメッセージがない場合、該当するコールでは、空のリストが即時に戻されます。受信によって、すべての使用可能なメッセージが戻される保証はありませんが、効率上の理由から使用可能なメッセージのサブセットのみを戻すことはできます。


注意:

1回の起動で、使用可能なメッセージがすべて取得される保証はありません。ポーリングして、使用可能なすべてのメッセージを受信したことを確認する必要があります。

3.5.3 非同期受信

メッセージを非同期で受信するには、listener.wsdlに記載されているListener Webサービスがクライアント・アプリケーションで実装されている必要があります。リスナー・エンドポイントの実装方法に制約はありません。たとえば1つのメカニズムは、javax.xml.ws.Endpoint JAX-WS Service APIを使用してWebサービス・エンドポイントをパブリッシュすることです。このメカニズムはJava SE 6で利用でき、コンシューマはJava EEサーブレット・モジュールを明示的に定義する必要はありません。ただし、サーブレット・ベースのリスナー実装も可能です。

3.5.3.1 リスナーの作成

リスナーは、oracle.ucs.messaging.ws.Listenerインタフェースを実装して作成します。このインタフェースは、具体クラス(既存クラスの1つ、新規クラス、あるいは無名クラスか内部クラス)として実装できます。

次のコード例は、メッセージ・リスナーの実装方法を示しています。

@PortableWebService(serviceName="ListenerService",
targetNamespace="http://xmlns.oracle.com/ucs/messaging/",
endpointInterface="oracle.ucs.messaging.ws.Listener",
wsdlLocation="META-INF/wsdl/listener.wsdl",
portName="Listener")
public class MyListener implements Listener {
  public MyListener() {
  }
    
  @Override
  public void onMessage(Message message, byte[] correlator) throws MessagingException {
    System.out.println("I got a message!");  
  }  @Override
  public void onStatus(Status status, byte[] correlator) throws MessagingException {
    System.out.println("I got a status!");
  }
}

リスナー・オブジェクトへの参照は、「デフォルトのメッセージ・リスナー」および「アクセス・ポイントごとのメッセージ・リスナー」の説明に従って、setMessageListenerまたはregisterAccessPointメソッドに渡します。アプリケーションのメッセージが着信すると、UMSインフラストラクチャでは、リスナーのonMessageメソッドが起動されます。

3.5.3.2 デフォルトのメッセージ・リスナー

クライアント・アプリケーションでは通常、デフォルトのメッセージ・リスナー(例3-9)が設定されます。Oracle UMSでは、このクライアント・アプリケーションによって登録されたアクセス・ポイント宛てのメッセージを受信すると、そのクライアント・アプリケーションのデフォルトのリスナーに対してonMessageコールバックが起動されます。

デフォルトのリスナーを削除するには、nullの引数を指定してこのメソッドをコールします。

例3-9 デフォルトのメッセージ・リスナー

ListenerReference listenerRef = new ListenerReference();
listenerRef.setEndpoint("url_to_your_webservice_message_listener");
messagingClient.setMessageListener(listenerRef);

3.5.3.3 アクセス・ポイントごとのメッセージ・リスナー

クライアント・アプリケーションでは、アクセス・ポイントを登録し、Listenerオブジェクトとオプションの相関機能オブジェクトを指定できます(例3-10)。受信メッセージが指定のアクセス・ポイント・アドレスに着信すると、指定したリスナーのonMessageメソッドが起動されます。当初指定の相関機能オブジェクトもコールバック・メソッドに渡されます。

例3-10 アクセス・ポイントごとのメッセージ・リスナー

AccessPoint accessPoint =
 MessagingFactory.createAccessPoint(AccessPointType.SINGLE_ADDRESS,
DeliveryType.EMAIL, "test@example.org");
ListenerReference listenerRef = new ListenerReference();
listenerRef.setEndpoint("url_to_your_webservice_message_listener");
byte[] correlator = null; // Not to correlate the callback
messagingClient.registerAccessPoint(accessPoint, listenerRef, correlator);

3.5.4 メッセージ・フィルタ

アプリケーションでMessageFilterを使用すると、配信されるメッセージをより強力に制御できます。メッセージ・フィルタの作成の詳細は、第2.5.4項「メッセージのフィルタリング」を参照してください。

3.6 クラスタ環境の構成

UMS WebサービスAPIでは、クラスタ環境にクライアント・アプリケーションとUMSサーバーがデプロイされている環境をサポートしています。クラスタ化されたデプロイメントが期待どおりに機能するためには、第2.6項「クラスタ環境の構成」の説明のとおりにクライアント・アプリケーションを正しく構成する必要があります。

3.7 UMS WebサービスAPIを使用したメッセージ再送信の指定

メッセージの送信が完全に失敗であると分類された場合、つまり、フェイルオーバー・チェーンがすべて使用済である場合、そのメッセージのUMSサーバーによる再送信が自動的にスケジュールされます。これは、そのメッセージの送信が成功するまで、または構成した再送信回数に達するまで繰り返されます。ただし、UMS WebサービスAPIを使用すると、次の例に示すようにsetMaxResendメソッドをコールして1メッセージ当たりの再送信の回数をオーバーライドできます。

MessageInfo msgInfo = new oracle.ucs.messages.ws.types.MessageInfo();
msgInfo.setMaxResend(new Integer(1));
// When MessageInfo is created we must also set priority
msgInfo.setPriority(PriorityType.NORMAL);
message.setMessageInfo(msgInfo);
String mid = client.send(message, null, null);

フェイルオーバー・アドレスのステータスは、getTotalFailovers()およびgetFailoverOrder()のコールにより受信できます。フェイルオーバーの順序がフェイルオーバー総数と同じになると、APIユーザーには、フェイルオーバー・チェーンがすべて使用済であることがわかります。ただし、再送信機能は、フェイルオーバー・チェーンのループとして動作します。getMaxResend()getCurrentResend()をコールして、再送信とフェイルオーバー・チェーンがすべて使用済となるタイミングを知ることができます。

setMaxResendメソッド、getTotalFailoversメソッドおよびgetFailoverOrderメソッドの詳細は、ユーザー・メッセージング・サービスJava APIリファレンスを参照してください。

3.8 セキュリティの構成

次の項ではセキュリティに関する考慮事項が説明されています。

3.8.1 クライアントおよびサーバーのセキュリティ

UMS Web サービスでは、Security Assertions Markup Language (SAML)トークンとユーザー名トークンの2つのセキュリティ・モードがサポートされています。

サポートされているSAMLベースのポリシーは「oracle/wss11_saml_token_with_message_protection_client_policy」です。このポリシーにより、暗号キーの交換に基づいて、クライアント・アプリケーションとUMSサーバーの間の信頼関係が確立されます。これにより、クライアント・アプリケーションではUMSサーバーによって受け付けられるユーザー・アイデンティティをアサートできるようになります。WS-SecurityでSAMLトークンを使用するには、クライアントとサーバーの両方でキーストアの構成がいくらか必要になります。

UMS Webサービス・クライアントでのSAMLセキュリティの構成の詳細は、例3-2を参照してください。

サポートされているユーザー名トークン・ポリシーは"oracle/wss11_username_token_with_message_protection_client_policy"です。このポリシーがWS-Securityヘッダーで暗号化されたユーザー名/パスワードのトークンを渡し、指定された資格証明をサーバーが認証します。ユーザー名とパスワードは資格証明ストアに格納することをお薦めします。こうすると、MessagingClientコンストラクタには資格証明ストア・キーのみを渡せばよいため、安全性の低い形で資格証明をハードコードしたり格納したりする必要がなくなります。UMS Webサービス・クライアントでのSAMLセキュリティの構成の詳細は、例3-1を参照してください。

Oracle Web Services Managerを使用したWebサービスの保護の詳細は、Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理を参照してください。

3.8.2 リスナーまたはコールバックのセキュリティ

ユーザー名トークンおよびSAMLトークンによるセキュリティは、リスナー・コールバックWebサービスでもサポートされています。リスナーの登録時に、クライアント・アプリケーションでは、セキュリティ・ポリシーおよびセキュアな接続を確立するのにサーバーで必要となるキーや資格証明の参照情報を指定する、追加のパラメータを指定する必要があります。

例3-11は、ユーザー名トークンによるセキュリティを使用してセキュアなコールバック・エンドポイントを確立する方法を示しています。

例3-11 ユーザー名トークンによるセキュリティの使用によるセキュアなコールバック・エンドポイントの確立

MessagingClient client = new MessagingClient(clientParameters);
...
ListenerReference listenerRef = new ListenerReference();
// A web service implementing the oracle.ucs.messaging.ws.Listener
// interface must be available at the specified URL.
listenerRef.setEndpoint(myCallbackURL);
Parameter policyParam = new Parameter();
policyParam.setName(ClientConstants.POLICY_STRING);
policyParam.setValue("oracle/wss11_username_token_with_message_protection_client_policy");
listenerRef.getParameters.add(policyParam);
// A credential store entry with the specified key must be 
// provisioned on the server side so it will be available when the callback
// is invoked.
Parameter csfParam = new Parameter();
csfParam.setName(oracle.wsm.security.util.SecurityConstants.ClientConstants.WSS_CSF_KEY);
csfParam.setValue("callback-csf-key"); 
listenerRef.getParameters.add(csfParam);
client.setMessageListener(listenerRef);

3.9 スレッド・モデル

JAX-WSスタックによって提供される基礎となるサービスにより、Webサービス MessagingClientクラスのインスタンスはスレッドセーフではありません。そのため、各インスタンスが一度に1つのスレッドでのみ使用されていることを確認する必要があります。