0

私は Jax-ws を初めて使用し、シンプルなクライアント/サーバー アプリケーションを使用しています。インターフェイス、それを実装する Scheduler クラス、およびスケジューラを localhost に発行する発行者クラスがあります。スタブを生成し、スケジューラでメソッドを呼び出すクライアントを持っています。今のところ問題ありません。

Scheduler クラスを変更したいときに問題が発生します。変更を保存してクライアントを再度実行すると、古いスケジューラがクライアントによって使用されます。再度公開しようとすると、ポートが既に使用されているため、BindException が発生します (使用していることはわかっています)。私が見つけた唯一の回避策は、毎回異なるポートに公開し、スタブを新しいポートに更新することですが、これはひどい解決策です。

コードを更新し、クライアントに新しい変更を使用させる簡単な方法はありますか?

これが私のクライアントです:

package assignment2;

import assignment2.endpoint.SchedulerInterface;
import assignment2.endpoint.SchedulerService;

public class Client {
    public static void main(String [] args){
        SchedulerService service = new SchedulerService();
        SchedulerInterface scheduler = service.getSchedulerPort();
        System.out.println(scheduler.getSchedule("Tuesday"));
    }
}

そして私の出版社:

package assignment2;

import javax.xml.ws.Endpoint;

import assignment2.endpoint.Scheduler;

public class Publisher {
    public static void main(String [] args){
        Endpoint.publish("http://localhost:8082/WS/Scheduler", new Scheduler());
    }
}

必要に応じて他のコードを提供できます。

4

1 に答える 1

1

より簡単な方法は、以前に公開されたサービスを再公開することです。そのためには、それを止めなければなりません。だから代わりに

Endpoint.publish("http://localhost:8082/WS/Scheduler", new Scheduler());

Endpoint オブジェクトの参照を保持し、時間が来たら停止するだけです。

Endpoint ep = Endpoint.create(new Scheduler());
ep.publish("http://localhost:8082/WS/Scheduler");
..
//STOP SIGNAL ARRIVED
ep.stop();

このようにして、同じポートに再度バインドし、クライアントを再実行できます (もちろん、Scheduler クラスの更新は下位互換性がなければなりません。つまり、インターフェイスを変更することはできません)。

于 2013-04-27T14:12:28.550 に答える