我们正在使用JBoss EAP 6.2.4,并且在无状态会话bean中,我们将JMS消息发送到WMQ-queuemanager。
我们的代码如下:
@Stateless
@LocalBean
public class MessageSenderBean {
private static ConnectionFactory connectionFactory;
private static InitialContext initialContext;
@EJB
IntegrationPropertyBean ipb;
Logger logger = Logger.getLogger(getClass());
/**
* Default constructor.
*/
public MessageSenderBean() {
}
@PostConstruct
public void postConstruct() {
logger.debug(" MessageSenderBeanPostConstruct called");
try {
initialContext = new InitialContext();
String connectionFactoryName = ipb.getProperty(
MessageSenderBean.class, "connectionFactory");
connectionFactory = (ConnectionFactory) initialContext
.lookup(connectionFactoryName);
} catch (NamingException e) {
logger.error("Exception occurred: " + e.toString());
logger.error(e);
}
}
public String sendMessage(String queueName, String content) {
String result = null;
Connection connection = null;
try {
connection = connectionFactory.createConnection();
} catch (JMSException e) {
logger.error("Exception occurred: " + e.toString());
logger.error(e);
}
// prüfen ob InitialContext leer
try {
if (initialContext == null)
initialContext = new InitialContext();
} catch (NamingException e) {
logger.error("Exception occurred: " + e.toString());
logger.error(e);
}
在启动服务器之后,bean完全适用于第一个操作,但是在没有任何操作的一段时间之后,bean丢失了initialContext,并且在新的InitialContext()中添加了一个addtional创建
知道为什么吗?
感谢Joerg
答案 0 :(得分:2)
请注意以下事项:
InitialContext对象未同步,这意味着不应由不同的线程同时访问实例。 您已将initialContext变量声明为类成员(静态),因此,在某些时候,不同的线程将同时使用它。
一个简单的解决方案是将该属性声明为实例成员。
<!-- language: java -->
private InitialContext initialContext;