Java 在无状态EJB中缓存MessageProducer和/或jms会话
我们在网络上遇到延迟问题。 我对每个连接、会话和制作人创建都有1ms的惩罚。 这就是为什么我想在无状态EJB实例变量中缓存jms连接、会话和MessageProducer 我可以在@PostConstruct中创建它们,这样做安全吗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) 专用队列;
@无状态
公共类{
@资源(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)在几个小时后被摧毁(钝化?)。我将进一步分析这种行为。谢谢