Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现JMS MDB的类的构造函数实际上是如何工作的?_Java_Jms_Ejb - Fatal编程技术网

Java 实现JMS MDB的类的构造函数实际上是如何工作的?

Java 实现JMS MDB的类的构造函数实际上是如何工作的?,java,jms,ejb,Java,Jms,Ejb,我试图理解JMS消息驱动Bean的生命周期,特别是它与实现它的Java类的构造函数相关的生命周期 我有一个类JMSClass,它实现了javax.jms.MessageListener,这样我就可以有一个消息驱动Bean,它带有一个侦听队列的onMessage()方法。MDB的容器是JBoss EAP 7.2服务器。以下是该课程的简化和精简版本: @ResourceAdapter(value = "wmq.jmsra.rar") public class JMSClass i

我试图理解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实例,当调用
onMessage()
时,
x
继续成功地递增。一旦我关闭并重新启动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生命周期中的构造函数。

    MDB bean的生命周期在本文的第5章中进行了描述

    基本上,容器调用构造函数,注入依赖项,然后调用带有
    @PostConstruct
    注释(如果有)的方法。然后将bean添加到一个池中以服务传入的消息

    需要注意的是,池的任何实例都可以为传入消息提供服务,因此您不能依赖
    x
    的值来计算消息


    至于对构造函数的重复调用,这一定是JBoss特定于实现的行为。可能是它一直在向池中添加实例。也许出于某种原因,它创建了某种动态代理或MDB的子类。。。如果使用
    @PostConstruct
    @PreDestroy
    注释向MDB添加方法,您可以看到它是否是前者。

    MDB bean的生命周期在

    基本上,容器调用构造函数,注入依赖项,然后调用带有
    @PostConstruct
    注释(如果有)的方法。然后将bean添加到一个池中以服务传入的消息

    需要注意的是,池的任何实例都可以为传入消息提供服务,因此您不能依赖
    x
    的值来计算消息


    至于对构造函数的重复调用,这一定是JBoss特定于实现的行为。可能是它一直在向池中添加实例。也许出于某种原因,它创建了某种动态代理或MDB的子类。。。如果您使用
    @PostConstruct
    @PreDestroy
    注释向MDB添加方法,您可以看到它是否是前者。

    我认为重复的构造函数调用必须是某种JBoss实现决策,因此,当我有空的时候,我会玩
    @PostConstruct
    @PreDestroy
    来缩小它的范围。我认为重复的构造函数调用必须是某种JBoss实现决策,所以当我有空的时候,我会玩
    @PostConstruct
    @PreDestroy
    来缩小范围