веб-службы jax, обновление конечной точки

Я новичок в 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());
    }
}

Любая помощь приветствуется, и я могу предоставить любой другой код, если это необходимо.


person Conor Pender    schedule 26.04.2013    source источник


Ответы (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();

Таким образом, вы можете снова выполнить привязку к тому же порту, а затем просто перезапустить клиент (конечно, обновления в классе планировщика должны быть обратно совместимыми, т. е. вам не разрешено изменять интерфейс).

person Miljen Mikic    schedule 27.04.2013