我们在集群环境中有多个 JBoss-Server 实例。对于后台任务,有一个可用的全局队列,用于管理在其中注册的所有作业。对于这个队列,每个节点上都有一个简单的侦听器 (MDB),用于管理传入的消息。此侦听器对单例 bean 进行手动查找(无注入)并启动预定义的方法。到目前为止一切正常,但是单例 bean 中的方法使用了在某些情况下不可用的其他一些(无单例服务)。例如,如果一个节点将被重新启动并且队列中有剩余的消息(尚未处理),则消息将被侦听器拾取并且所有进一步的 bean 都为空,因此该作业会产生 NPE。是否可以在接收消息后在 JMS-Listener 中定义延迟时间,或者是否可以定义“
一种可能是将 MDB 属性“DeliveryActive”设置为 false 并在完全部署后启动 bean。是否有一种简单的工作方式以编程方式执行此操作(不在 jmx-console 中)?我找到的任何手册都会将我重定向到手动 jndi 查找。我认为必须可以为每个注释注入 Bean 并调用 startDelivery()?在应用程序中是否有这样做的好地方?
另一个提示将我带到 application.xml 中的 order 属性的初始化,因为问题可能与 JBoss 部署顺序有关(某些 EJB 将比侦听器更晚可用),但JBoss 6.0 中似乎存在错误并升级到6.1。不是一种选择。也许有一个演练?
我希望问题得到充分解释,否则请询问更多信息。
在此先感谢,丹尼
附加信息:
- JBoss 6.0.0 最终版
- 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 - 成员有时会为空