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

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

7 голосов | спросил malloc 24 Jam1000000amMon, 24 Jan 2011 06:59:33 +030011 2011, 06:59:33

2 ответа


0

Отвечая на мой собственный вопрос - я обнаружил, что в JBoss AS 6.0.0 не поддерживается канкаляция асинхронных запросов.

В качестве альтернативы я реорганизовал код для использования сообщений в стиле запросов /ответов JMS.

Управляемый сообщениями компонент используется для выполнения асинхронной операции. Управляемый сообщениями компонент создает временную очередь и возвращает очередь вызывающей стороне через JMS. Это достигается путем использования поля replyTo сообщений JMS.

Затем управляемый сообщениями компонент периодически проверяет временную очередь на наличие сообщения отмены.

Это сложнее, чем @Asynchronous версия, но она работает на JBoss AS 6.0.0.

ответил malloc 16 FebruaryEurope/MoscowbWed, 16 Feb 2011 01:32:02 +0300000000amWed, 16 Feb 2011 01:32:02 +030011 2011, 01:32:02
0

Вы должны return a Future тип объекта вместо null. Кстати, ты не получаешь NPE? Я ожидаю, что с вашим кодом в вопросе.

Кроме того, cancel() не должно вызываться. См. документы здесь . Кстати, это не просто метод cancel(), который не должен вызываться, не должен вызываться метод экземпляра, согласно документы . Возникает вопрос: почему, черт возьми, метод должен вернуть AsyncResult . Я просто понятия не имею, может быть, его там для будущего использования. Но комментарии уровня класса предполагают, что все методы существуют для удобства, чтобы предоставить результат для контейнера.

Следовательно, я не уверен, возможно ли вообще отменить асинхронный вызов EJB или нет.

[Отредактировано после небольшого исследования]

Попробуйте эту реализацию,

@Stateless
@Remote(AsyncInterface.class)
public class AsyncBean
{
    @Resource SessionContext myContext;

    @Asynchronous
    public 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 result;
     }
}
ответил Adeel Ansari 24 Jam1000000amMon, 24 Jan 2011 07:27:24 +030011 2011, 07:27:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132