Я пишу корпоративное Java-приложение, которое использует асинхронные методы EJB 3.1 для параллельного выполнения ряда задач. Чтобы поддержать отмену длительной задачи, я пытался использовать интерфейс Future.
К сожалению, вызов future.cancel(true)
из клиентского приложения, похоже, не влияет на контекст сеанса компонента, выполняющего задачу, несмотря на то, что вызов отмены возвращает true
.
У меня простой интерфейс:
public interface AsyncInterface
{
Future<Integer> run() throws Exception;
}
С реализацией компонента следующим образом:
@Stateless
@Remote(AsyncInterface.class)
public class AsyncBean
{
@Resource SessionContext myContext;
@Asynchronous
public Future<Integer> run() throws Exception
{
Integer result = 0;
System.out.println("Running AsyncBean");
while(myContext.wasCancelCalled() == false)
{
Thread.sleep(2000);
System.out.println("Working");
}
System.out.println("AsyncBean cancelled");
return new AsyncResult<Integer>(result);
}
}
Код клиента прост:
InitialContext ctx = new InitialContext();
AsyncInterface async = (AsyncInterface)ctx.lookup("AsyncBean/remote");
Future<Integer> future = async.run();
if( future.cancel(true) )
{
System.out.println("future.cancel() returned true");
}
else
{
System.out.println("future.cancel() returned false");
}
Выход из bean-компонента - это бесконечный поток «Working»; никогда не обнаруживает отмену.
Если это актуально, я запускаю приложение на сервере приложений JBoss 6.0.0. Я не нашел много примеров кода с помощью функции отмены интерфейса Future, поэтому мне интересно, правильно ли я использую Future. Это использование выглядит правильно? Есть ли лучшие варианты для отмены асинхронного вызова метода EJB?