gpt4 book ai didi

java - 在无状态 EJB 中缓存 MessageProducer 和/或 jms session

转载 作者:行者123 更新时间:2023-11-30 09:21:31 25 4
gpt4 key购买 nike

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

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

@Stateless
public class MyEJB {
@Resource(mappedName = Messaging.LOCAL_JNDI_CONN_FACTORY)
private ConnectionFactory connectionFactory;

@Resource(mappedName = AutoRecolteIndexerConsumer.QUEUE_NAME)
private Queue queue;

private Connection connection;
private Session session;
private MessageProducer producer;


@PostConstruct
public void init() {
connection = connectionFactory.createConnection();// 1ms
session = connection.createSession(true, Session.SESSION_TRANSACTED);// 1ms
producer = session.createProducer(queue); //1ms
}

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

}

最佳答案

预先初始化连接工厂、连接和 session 等重量级对象并没有错,事实上,这是一个很好的做法,因为我们不想在每次发送消息时都创建这些东西。

但我认为您混淆了无状态 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 实例并在其位置创建一个新实例。

关于java - 在无状态 EJB 中缓存 MessageProducer 和/或 jms session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16967998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com