今週も先週に引き続き、JAX-RPC 1.0で提供されていなかった機能について紹介します。

はじめにちょっとしたクイズを行いましょう。

Webサービスで戻り値がvoidのメソッドを公開した場合を考えます。このメソッドをWebサービスとしてコールした場合、戻り値を返すためのサーバーからクライアントへの通信は行われるでしょうか。

答えは通信は行われるです。

もちろん、戻り値はないのですが、処理が終了したこと、もしくはエラーを返すために通信します。したがって、サービスの実行に時間がかかる場合、クライアントはブロックします。

もちろん終了状態を返すことが必要な場合もありますが、単にサービスをコールするだけでその終了状態は必要ないこともあります。そのような場合に使用できるのが一方向操作モードです。

一方向操作モードではサーバからクライアントへの通信は行われません。そのため、クライアントでは処理がブロックされることはありません。

しかし、サービスの実行処理が失敗したとしても、それをクライアントに知らせるすべはありません。

このような特徴を持つ一方向操作モードですが、実際にサンプルを作成して試してみましょう。一方向操作モードはサーバとクライアントの双方で設定を行う必要があります。

まずはサーバー側から見ていきましょう。

サンプルのソース OnewayTask.java
OnewayTaskServiceLauncher.java
OnewayTask.zip

OnewayTaskクラスにはWebサービスとして公開するメソッドを定義したクラスです。

@WebService
public class OnewayTask {
    private String name = "World";
    
    private synchronized String getName() {
        return name;
    }
    
    private synchronized void setName(String name) {
        this.name = name;
    }
    
    @WebMethod
    @Oneway	
    public void set(String name) {
        setName(name);
    }
    
    @WebMethod
    public String sayHello() {
        return "Hello, " + getName() + "!";
    }
}

Webサービスとして公開しているメソッドは、@WebMethodアノテーションで修飾されたsetメソッドとsayHelloメソッドです。ところが、setメソッドには見なれないアノテーションが記述されています。

もうお分かりですね。この赤字で示した@Onewayアノテーションが一方向操作モードを示すためのアノテーションです。

一方向操作モードといっても難しく考えることなく、単に@Onewayアノテーションで修飾するだけという手軽さです。もちろん、@Onewayで修飾するメソッドは戻り値がvoidでなければなりません。void以外の場合、wsgenを実行する時にエラーが発生します。