我试图理解jms消息驱动bean的生命周期,特别是当它与实现它的java类的构造函数相关时。
我有一节课 JMSClass
实现 javax.jms.MessageListener
这样我就可以有一个消息驱动bean onMessage()
侦听队列的方法。mdb的容器是 JBoss EAP 7.2
服务器。下面是该类的简化和精简版本:
@ResourceAdapter(value = "wmq.jmsra.rar")
public class JMSClass implements MessageListener {
private int x = 0;
public JMSClass() {
System.out.println("X: " + x);
}
@Override
public void onMessage(Message message) {
System.out.println("Value of x: " + ++x);
}
}
``` `x` 属于bean示例,并且 `x` 继续成功增加 `onMessage()` 被称为。一旦我关闭并重新启动jboss示例,以及bean示例, `x` 返回0并再次开始递增。这是预期的行为。
不期望的是构造函数在之前被调用两次 `onMessage()` 调用,并且值始终为0。所以我的输出结果如下:
10:55:29,763 INFO [stdout] (default-threads - 32) X: 0
10:55:29,861 INFO [stdout] (default-threads - 32) X: 0
10:55:29,862 INFO [stdout] (default-threads - 32) Value of x: 1
10:55:29,910 INFO [stdout] (default-threads - 35) X: 0
10:55:29,910 INFO [stdout] (default-threads - 35) X: 0
10:55:29,957 INFO [stdout] (default-threads - 35) Value of x: 2
10:55:30,005 INFO [stdout] (default-threads - 33) X: 0
10:55:30,005 INFO [stdout] (default-threads - 33) X: 0
10:55:30,052 INFO [stdout] (default-threads - 33) Value of x: 3
10:55:30,117 INFO [stdout] (default-threads - 38) X: 0
10:55:30,117 INFO [stdout] (default-threads - 38) X: 0
10:55:30,165 INFO [stdout] (default-threads - 38) Value of x: 4
10:55:30,209 INFO [stdout] (default-threads - 37) X: 0
10:55:30,209 INFO [stdout] (default-threads - 37) X: 0
10:55:30,259 INFO [stdout] (default-threads - 37) Value of x: 5
如果每次消息通过时都调用构造函数 `onMessage()` ,我希望 `x` 每次都设置回0(为什么一开始要调用两次?)
如果 `x` 随着每条消息递增,那么我希望在jboss容器示例化bean时,构造函数在开始时只被调用一次。从那时起,只有 `onMessage()` 代码应该正在执行。
有人能提供一些关于这里正在进行的生命周期以及容器如何示例化mdb的见解吗?我没有找到任何资源提到mdb生命周期中的构造函数。
1条答案
按热度按时间y53ybaqx1#
ejb3.2规范的第5章描述了mdbbean的生命周期
基本上,容器调用构造函数,注入依赖项,然后使用
@PostConstruct
注解(如有)。然后将bean添加到一个池中,为传入的消息提供服务。需要注意的是,池的任何示例都可以提供传入消息,因此您不能依赖
x
统计信息。至于对构造函数的重复调用,这一定是jboss的特定于实现的行为。可能它一直在向池中添加示例。也许它会因为某种原因创建某种动态代理或mdb的子类。。。如果使用
@PostConstruct
以及@PreDestroy
你可以看看是不是前者。