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