今週も先週に引き続き、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を実行する時にエラーが発生します。