Я пишу корпоративное Java-приложение, которое использует асинхронные методы EJB 3.1 для параллельного выполнения ряда задач. Для поддержки отмены длительной задачи я пытался использовать интерфейс Future.
К сожалению, вызов future.cancel (true)
из клиентского приложения, похоже, не влияет на контекст сеанса компонента. выполнение задачи, несмотря на то, что вызов отмены возвращает истину
.
У меня простой интерфейс:
public interface AsyncInterface
{
Future<Integer> run() throws Exception;
}
С реализацией bean-компонента следующим образом:
@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-компонента является бесконечный поток «Работа»; он никогда не обнаруживает отмену.
В случае необходимости, я запускаю приложение на сервере приложений JBoss 6.0.0. Я не нашел много примеров кода, использующих функцию отмены интерфейса Future, поэтому мне интересно, правильно ли я использую Future. Правильно ли это использование? Есть ли лучшие варианты отмены вызова асинхронного метода EJB?