у нас есть несколько экземпляров 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 иногда будет нулевым