Это больше похоже на запрос о разъяснении, но оно слишком длинное, чтобы уместиться в качестве комментария ..
Я не уверен, как вы делаете это прямо сейчас, так как из того, что вы написали, просто используяпоток обработки запросов, кажется, путь.Вот так:
//Some webservice method (synchronous)
public Result process(Blah blah){
try{
return getResult(TimeUnit.SECONDS, 10);
}catch(InterruptedException e){
//No result within 10 seconds!
throw new ServiceUnavailableException("blah");
}
}
Я не уверен, зачем вы вообще создаете темы.Если вы вынуждены использовать потоки, потому что метод getResult
вообще не имеет времени ожидания, у вас будет утечка потоков.Если он истекает через более длительное время и, таким образом, вы хотите «сократить» свой ответ пользователю, это будет единственный случай, когда я рассмотрю использование потока, как я представляю, как вы его используете.Это может привести к накоплению потоков под нагрузкой, и я постараюсь избежать такой ситуации.
Может быть, вы можете опубликовать некоторый код и сообщить нам, почему вы вообще создаете в своем сервисе?
Кроме того, каков ваш клиентский интерфейс?Похоже, это синхронный веб-сервис или что-то в этом роде?
В этом случае на вашем месте я бы использовал HashedWheelTimer
в качестве одиночного ... этот механизм должен прекрасно работать с вашим требованием ( здесь есть реализация ).Однако, к сожалению, это противоречит запрету на многопоточность и запрету на синглтон в спецификации EJB.В действительности, хотя на самом деле нет проблем, если бы вы сделали это.См. это обсуждение например.Мы также использовали шаблон синглтона в нашем приложении EJB.который использовал JBoss.Однако, если это не жизнеспособный выбор, я мог бы взглянуть на изоляцию обработки в ее собственной JVM, определив новый веб-сервис (и развернув его в веб-контейнере или чем-то подобном), и вызвать этот сервис из приложения EJB.Однако это, очевидно, повлечет за собой снижение производительности, и теперь у вас будет еще одно совершенно новое приложение.