Задержка запуска JMS Listener (MDB) в JBoss 6.0 - PullRequest
3 голосов
/ 13 февраля 2012

у нас есть несколько экземпляров JBoss-Server в кластерной среде. Для фоновых задач доступна глобальная очередь, которая управляет всеми заданиями, зарегистрированными в ней. Для этой очереди есть простой слушатель (MDB) на каждом узле, управляющий входящими сообщениями. Этот слушатель выполняет поиск вручную (без внедрения) для одноэлементного компонента и запускает предварительно определенный метод. Пока все работает нормально, но метод в одноэлементном компоненте использует некоторые другие (без одноэлементных сервисов), которые недоступны при некоторых обстоятельствах. Например, если узел будет перезапущен и в очереди останутся сообщения (еще не обработанные), сообщения будут приняты слушателем, и все остальные компоненты будут нулевыми, поэтому задание создает NPE. Можно ли определить время задержки в JMS-Listener после того, как сообщения будут подобраны, или можно определить ловушку «полностью развернутое приложение»? DependsOn-Annotation не работает из-за использования non singletons.

Можно установить для свойства MDB "DeliveryActive" значение false и запустить компонент после полного развертывания. Есть ли простой, работающий способ сделать это программно (не в jmx-console)? Любые руководства для этого я нашел, перенаправляет меня на ручной поиск jndi. Я думаю, должно быть возможно внедрить Бин в аннотацию и вызвать startDelivery ()? Есть ли хорошее место для этого в приложении?

Другая подсказка приводит меня к инициализации свойства order в application.xml, поскольку проблема может быть связана с порядком развертывания JBoss (некоторые EJB-компоненты будут доступны позже, чем слушатель), но, похоже, ошибка в JBoss 6.0 и обновлении до 6.1. это не вариант. Может быть, есть прохождение для этого?

Я надеюсь, что проблема достаточно хорошо объяснена, в противном случае, пожалуйста, запросите дополнительную информацию.

Спасибо заранее, Дэнни

Дополнительная информация:

  • JBoss 6.0.0 Final
  • HornetQ 2.2.5 Final (уже обновлен из-за ошибочной версии JBoss по умолчанию)

Слушатель:

@MessageDriven(activationConfig =
    {
            @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
            @ActivationConfigProperty(propertyName = "destination", propertyValue = "/queue/SchedulerQueue")
    })
public class SchedulerQueueListener implements MessageListener {
...
@Override
public void onMessage(Message message) {
   ...
   service = (IScheduledWorkerService) new InitialContext().lookup(jndiName);
   EJobResult eJobResult = service.executeJob(message);
   ...
}

Пример работника:

@Singleton
@LocalBinding(jndiBinding = SampleJobWorkerService.JNDI_NAME)
public class SampleJobWorkerService implements IScheduledWorkerService {

...
    @EJB(name = "SampleEJB/local")
    private ISampleEJB sampleEjb;
...
    @Override
    public EJobResult executeJob(Message message) {
    int state = sampleEjb.doSomething(message.getLongProperty(A_PROPERTY));
    }

В этом случае sampleEjb-member иногда будет нулевым

Ответы [ 2 ]

1 голос
/ 13 февраля 2012
  1. В качестве обходного пути, вместо вызова EJB напрямую из MDB, вы можете создать таймер с таймаутом с некоторой задержкой. Поэтому будет некоторая задержка в исполнении.

    В методе тайм-аута Timer вы можете вызвать синглтон EJB, который в случае вызовет другие не синглтон EJB.

  2. JBoss specific: может попытаться установить свойство в объекте сообщения перед отправкой.

    msg.setLongProperty("JMS_JBOSS_SCHEDULED_DELIVERY", (current + delay));

    Другая альтернатива - _JBM_SCHED_DELIVERY.

Редактировать:

Для 1-й части вы можете иметь транзакцию JTA, которая может охватывать JMS и EJB. Поэтому отработка отказа и другие вещи могут быть обработаны соответственно.

Вы также можете увеличить задержку доставки для объекта сообщения.

<address-setting match="jms.queue.someQueue">
        <redelivery-delay>5000</redelivery-delay>
</address-setting>
0 голосов
/ 23 мая 2012

У меня сейчас такие же проблемы.

Я предлагаю вам использовать аннотацию запуска EJB 3 @Startup на вашем одноэлементном компоненте для вызова метода startDelivery в ваших прослушивателях сообщений.

...