Отмена вызова @Asynchronous EJB

Я пишу корпоративное 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?

7
задан malloc 24 January 2011 в 23:33
поделиться