我是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());
}
}
感谢任何帮助,如果需要,我可以提供任何其他代码。
答案 0 :(得分: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类的更新必须是向后兼容的,即你不能更改接口)。