Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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/0/assembly/6.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 在无状态EJB中缓存MessageProducer和/或jms会话_Java_Jakarta Ee_Jms - Fatal编程技术网

Java 在无状态EJB中缓存MessageProducer和/或jms会话

Java 在无状态EJB中缓存MessageProducer和/或jms会话,java,jakarta-ee,jms,Java,Jakarta Ee,Jms,我们在网络上遇到延迟问题。 我对每个连接、会话和制作人创建都有1ms的惩罚。 这就是为什么我想在无状态EJB实例变量中缓存jms连接、会话和MessageProducer 我可以在@PostConstruct中创建它们,这样做安全吗 @无状态 公共类{ @资源(mappedName=Messaging.LOCAL\u JNDI\u CONN\u工厂) 私有连接工厂连接工厂; @资源(mappedName=autorecoltendexerconsumer.QUEUE\u NAME) 专用队列;

我们在网络上遇到延迟问题。 我对每个连接、会话和制作人创建都有1ms的惩罚。 这就是为什么我想在无状态EJB实例变量中缓存jms连接、会话和MessageProducer

我可以在@PostConstruct中创建它们,这样做安全吗

@无状态
公共类{
@资源(mappedName=Messaging.LOCAL\u JNDI\u CONN\u工厂)
私有连接工厂连接工厂;
@资源(mappedName=autorecoltendexerconsumer.QUEUE\u NAME)
专用队列;
专用连接;
非公开会议;
私人信息生产者;
@施工后
公共void init(){
connection=connectionFactory.createConnection();//1ms
session=connection.createSession(true,session.session_transactived);//1ms
producer=session.createProducer(队列);//1ms
}
公共无效发送(对象数据){
ObjectMessage obj=session.createObjectMessage();
对象设置对象(数据);
制作人发送(obj);
}
}

预先初始化连接工厂、连接和会话等重型对象没有错,事实上,这是一种很好的做法,因为我们不希望每次发送消息时都创建这些东西

但我认为您混淆了无状态EJB和有状态EJB。您正在初始化bean的状态,因此它不是无状态的,而是有状态的。第二,由于您有状态,您的代码应该假设最坏的情况,并在出现错误时清理资源,如下所示

   public void send(Object data) {
        ObjectMessage obj = session.createObjectMessage();
        obj.setObject(data);
        try{
           producer.send(obj);

        }catch( JMSException jex){
          producer.close();
          session.close();
          connection.close();
          throw new EJBException( jex);
        }
    }

通过清理避免资源泄漏,然后抛出EJBException,以便容器销毁EJB实例并在其位置创建一个新实例

谢谢,我将尝试使用Stateful,申请将在周末进行预处理,我将根据结果在周一接受您的答复:)。顺便说一句,我在@PreDestroy中清理资源,我想它甚至在EJBException上也被调用。它可以工作。为了检查JMS连接池是否适合,我必须了解池是如何工作的。我在最大池为3的MDB中使用此有状态。但我看到许多人造卫星(可能10或15)在几个小时后被摧毁(钝化?)。我将进一步分析这种行为。谢谢