2015-11-13 3 views
0

Я использую CXF для вызова веб-сервиса. Он используется в простой форме, как это описано в документации:Есть ли способ прекратить вызов веб-службы CXF?

HelloService service = new HelloService(); 
Hello client = service.getHelloHttpPort(); 

String result = client.sayHi("Joe"); 

Как я могу прекратить этот вызов службы, когда это требуется время?

Я нашел только один родственный вопрос, но это не дает никакого решения.

How to terminate CXF webservice call within Callable upon Future cancellation

ответ

0

Я думаю, что это больше функции веб-сервера. Например, если вы используете Jetty для обслуживания вашего контента CXF, вы можете установить пул потоков на то, что будет смотреть ваши потоки.

ThreadPoolExecutor pool = new ThreadPoolExecutor(...); 
ExecutorService svc = new ControlledExecutorService(pool); 
server.setThreadPool(new org.eclipse.jetty.util.thread.ExecutorThreadPool(svc)); 

Тогда для обслуживания пользовательского исполнителя (извините, весь код, набранным в браузере непосредственно. Я на IPad, без Java. Так что вам, вероятно, потребуется внести небольшие корректировки, но полезные детали должны здесь):

public class ControlledExecutorService implements ExecutorService { 
    private ExecutorService es; 

    public ControlledExecutorService(ExecutorService wrapped) { 
     es = wrapped; 
    } 

    @Override 
    public void execute(final Runnable command) { 
     Future<Boolean> future = submit(new Callable<Boolean>() { 
      public Boolean call() throws Exception { 
       command.run(); 
       return true; 
      } 
     }); 

     // Do the proper monitoring of your Future and interrupt it 
     // using Future.cancel(true) if you need to. 
    } 
} 

обязательно пройти true в cancel() так, что он посылает прерывание.

Также помните, как и любой поток, только потому, что вы отправляете ему прерывание, это не значит, что он будет соответствовать. Вы должны выполнить некоторую работу в своих потоках, чтобы убедиться, что они хорошо себя ведут. В частности, периодически проверяйте Thread.currentThread().isInterrupted() и правильно обрабатывайте InterruptedException, чтобы поднять его и прекратить задачу изящно, вместо того, чтобы просто исключить исключение.

+0

Благодарим вас за ответ. К сожалению, отмена (true) не прерывает вызов веб-службы. Это также обсуждается в упомянутой ссылке. Одним из возможных решений может быть использование MTOM, но в этом случае требуется конфигурация на стороне сервера. –

Смежные вопросы