ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC Webサービスの高度な機能のプログラミング
12cリリース1(12.1.1)
B65947-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

6 非同期機能の併用

この章では、WebLogic Java API for XML-based RPC (JAX-RPC) Webサービスと非同期機能を併用する方法について説明します。

この章では、以下のトピックについて説明します。

非同期機能の併用

ここまでの各項では、WebLogic Webサービスの非同期機能(Webサービスの信頼性のあるメッセージング、会話、非同期のリクエストとレスポンス、およびバッファリング)を単独で使用する方法を説明します。ただし、通常、Webサービスではこれらの機能を併用しています。例については、「信頼性のある会話型Webサービスを実装するJWSファイルの例」および「信頼性のある会話型Webサービスを非同期で呼び出すクライアントWebサービスの例」を参照してください。

併用すると、個々の機能についての節で説明した制限事項の一部が適用されなくなったり、場合によっては追加の制限事項が適用されたりします。次の表に、様々な機能を組み合せる場合の考慮事項をまとめます。

表6-1 非同期機能を一緒に使用する場合の考慮事項

機能の組合せ 考慮事項

非同期のリクエスト/レスポンス機能とWebサービスの信頼性のあるメッセージング/バッファ機能

  • 信頼性のあるWebサービスからの非同期レスポンスも信頼性があります。つまり、レスポンスを処理するためには、宛先WebLogic Serverインスタンスを構成するのと同じように、ソースWebLogic Serverインスタンス上でもJMSサーバー、モジュールおよびキューを構成する必要があります。

    ソースWebLogic Serverインスタンス上でJMSキューを作成する際には、weblogic.wsee.DefaultQueueのJNDI名を指定することが要求されます。キューの名前は任意に付けることができます。また、このJMSキューが「ローカル」であることも指定する必要があります。通常は、ローカルJNDI名の設定により指定できます。

  • 信頼性のある操作またはバッファ付きの操作を一方向にすることはできません。つまり、実装メソッドに@Onewayアノテーションを付加することはできません。

非同期のリクエスト/レスポンス機能とWebサービスの信頼性のあるメッセージング機能

非同期コンテキストのいずれか1つ(AsyncPreCallContextまたはAsyncPostCallContext)でプロパティを設定する場合、そのプロパティはjava.io.Serializableを実装する必要があります。

非同期のリクエスト/レスポンス機能とバッファ機能

バッファ付きWebサービス操作を呼び出すクライアントWebサービスで@ServiceClient JWSアノテーションを使用する必要があります。

会話機能とWebサービスの信頼性のあるメッセージング機能

  • JWSの会話は、信頼性のあるシーケンスとは異なり、いかなる方法によってもリンクされません。信頼性のあるシーケンスの管理は、会話のライフサイクルとは別に検討する必要があります。たとえば、信頼性のあるメッセージングを使用して、クライアント・サービスと信頼性のある会話型サービスとの間でメッセージを送信する場合、会話を終了しても信頼性のあるシーケンスは終了されません。信頼性のあるシーケンスは(WsrmUtils.setFinalMessage()などの許容可能なメソッドを使用して)明示的に終了させる必要があります。または、シーケンスの存続期間が経過して期限切れになるまでアクティブにしておくことができます。信頼性のあるメッセージ・シーケンスのライフサイクルの詳細については、「信頼性のあるメッセージ・シーケンスのライフサイクルの管理」を参照。

  • プロパティWLStub.CONVERSATIONAL_METHOD_BLOCK_TIMEOUTは、クライアントWebサービスのスタブに対して設定された場合、クライアントがブロックしないため無視されます。

  • 信頼性のある会話型Webサービスの少なくとも1つのメソッドは、@Onewayアノテーションでマークしないでください

会話機能と非同期のリクエスト/レスポンス機能

クライアントの会話型Webサービスとその他のWebサービスとの間における非同期のレスポンスもまた、会話に参加します。たとえば、WebServiceAが会話型で、非同期リクエスト/レスポンスを使用してWebServiceBを呼び出すとします。WebServiceAは会話型であるため、WebServiceBからの非同期レスポンスも同じ会話に参加します。


信頼性のある会話型Webサービスを実装するJWSファイルの例

次のサンプルのJWSファイルでは、信頼性があり、かつ会話型でもあるWebサービスを実装しています。

package examples.webservices.async_mega;

import java.io.Serializable;

import weblogic.jws.WLHttpTransport;
import weblogic.jws.Conversation;
import weblogic.jws.Policy;

import javax.jws.WebService;
import javax.jws.WebMethod;

@WebService(name="AsyncMegaPortType",
            serviceName="AsyncMegaService",
            targetNamespace="http://examples.org/")

@Policy(uri="AsyncReliableConversationPolicy.xml",
        attachToWsdl=true)

@WLHttpTransport(contextPath="asyncMega",
                 serviceUri="AsyncMegaService",
                 portName="AsyncMegaServicePort")

/**
 * Web Service that is both reliable and conversational.
 */

public class AsyncMegaServiceImpl implements Serializable {

  @WebMethod
  @Conversation (Conversation.Phase.START)
  public String start() {
    return "Starting conversation";
  }

  @WebMethod
  @Conversation (Conversation.Phase.CONTINUE)
  public String middle(String message) {
    return "Middle of conversation; the message is: " + message;
  }

  @WebMethod
  @Conversation (Conversation.Phase.FINISH)
  public String finish(String message ) {
    return "End of conversation; the message is: " + message;
  }

}

信頼性のある会話型Webサービスを非同期で呼び出すクライアントWebサービスの例

次のJWSファイルでは、「信頼性のある会話型Webサービスを実装するJWSファイルの例」に記載のWebサービスにおける様々な会話型のメソッドを確実に呼び出すクライアントWebサービスの実装方法を示します。クライアントJWSファイルでは、非同期のリクエストとレスポンス機能も使用しています。

package examples.webservices.async_mega;

import weblogic.jws.WLHttpTransport;
import weblogic.jws.ServiceClient;
import weblogic.jws.AsyncResponse;
import weblogic.jws.AsyncFailure;

import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.xml.rpc.Stub;

import weblogic.wsee.async.AsyncPreCallContext;
import weblogic.wsee.async.AsyncCallContextFactory;
import weblogic.wsee.async.AsyncPostCallContext;
import weblogic.wsee.reliability.WsrmUtils;

import examples.webservices.async_mega.AsyncMegaPortType;
import examples.webservices.async_mega.AsyncMegaService;
import examples.webservices.async_mega.AsyncMegaService_Impl;

import java.rmi.RemoteException;

@WebService(name="AsyncMegaClientPortType",
            serviceName="AsyncMegaClientService",
            targetNamespace="http://examples.org/")

@WLHttpTransport(contextPath="asyncMegaClient",
                 serviceUri="AsyncMegaClient",
                 portName="AsyncMegaClientServicePort")

/**
 * Client Web Service that has a conversation with the AsyncMegaService
 * reliably and asynchronously.
 */

public class AsyncMegaClientImpl {

  @ServiceClient(
     wsdlLocation="http://localhost:7001/asyncMega/AsyncMegaService?WSDL",
     serviceName="AsyncMegaService",
     portName="AsyncMegaServicePort")

  private AsyncMegaPortType port;

  @WebMethod
  public void runAsyncReliableConversation(String message) {

    AsyncPreCallContext apc = AsyncCallContextFactory.getAsyncPreCallContext();
    apc.setProperty("message", message);

    try {
      port.startAsync(apc);
      System.out.println("start method executed.");

      port.middleAsync(apc, message );
      System.out.println("middle method executed.");

      // Since this service is not conversational, any state kept in the port
      // field will be lost when this method returns. In the case of reliable
      // messaging, this state includes the ID of the reliable sequence being
      // used to send messages. The setFinalMessage method specifies
      // that this is the final message to be sent on this sequence. This
      // will allow the reliable messaging subsystem to proactively clean up
      // the reliable sequence instead of timing out.
      WsrmUtils.setFinalMessage((Stub)port);
      port.finishAsync(apc, message );
      System.out.println("finish method executed.");

    }
    catch (RemoteException e) {
      e.printStackTrace();
    }

  }

  @AsyncResponse(target="port", operation="start")
  public void onStartAsyncResponse(AsyncPostCallContext apc, String message) {
    System.out.println("-------------------");
    System.out.println("Got message " + message );
    System.out.println("-------------------");
  }

  @AsyncResponse(target="port", operation="middle")
  public void onMiddleAsyncResponse(AsyncPostCallContext apc, String message) {
    System.out.println("-------------------");
    System.out.println("Got message " + message );
    System.out.println("-------------------");
  }

  @AsyncResponse(target="port", operation="finish")
  public void onFinishAsyncResponse(AsyncPostCallContext apc, String message) {
    System.out.println("-------------------");
    System.out.println("Got message " + message );
    System.out.println("-------------------");
  }

  @AsyncFailure(target="port", operation="start")
  public void onStartAsyncFailure(AsyncPostCallContext apc, Throwable e) {
    System.out.println("-------------------");
    e.printStackTrace();
    System.out.println("-------------------");
  }

  @AsyncFailure(target="port", operation="middle")
  public void onMiddleAsyncFailure(AsyncPostCallContext apc, Throwable e) {
    System.out.println("-------------------");
    e.printStackTrace();
    System.out.println("-------------------");
  }

  @AsyncFailure(target="port", operation="finish")
  public void onFinishAsyncFailure(AsyncPostCallContext apc, Throwable e) {
    System.out.println("-------------------");
    e.printStackTrace();
    System.out.println("-------------------");
  }
}