0

我是 Jax-ws 的新手,我有一个简单的客户端/服务器应用程序。我有一个接口,一个实现它的调度程序类,以及一个将我的调度程序发布到本地主机的发布者类。我生成了存根并有一个客户端,它在我的调度程序上调用一个方法。到目前为止没有问题。

当我想更改调度程序类时,就会出现问题。如果我只是保存更改并再次运行客户端,则客户端将使用旧的调度程序。如果我尝试再次发布,我会收到一个 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 回答