我的类中有一个变量--“受保护的静态上下文jndi;”,其中" Context“是一个接口。当我试图在下面提到的方法中访问它时,它会生成标题中提到的声纳冲突。
public JMSQueueResource createQueueResource(String queueBindingName, String qcfBindingName, boolean messagePersisted, boolean autoAcknowledge, boolean nonJMS) throws JMSException, NamingException {
JMSQueueResource qResource = new JMSQueueResource();
try {
jndi = createInitialContext();
if (queueConnectionFactory == null) {
queueConnectionFactory = (QueueConnectionFactory) lookup(jndi, qcfBindingName);
}
qResource.theQueueConnection = queueConnectionFactory.createQueueConnection();
if (autoAcknowledge) {
qResource.theQueueSession = qResource.theQueueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
}
else {
qResource.theQueueSession = qResource.theQueueConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
}
Queue queue = (Queue) lookup(jndi, queueBindingName);
//if (nonJMS && queue instanceof com.ibm.mq.jms.MQQueue) {
// com.ibm.mq.jms.MQQueue q = (com.ibm.mq.jms.MQQueue) queue;
// q.setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);
//}
qResource.theQueueSender = qResource.theQueueSession.createSender(queue);
if (messagePersisted) {
qResource.theQueueSender.setDeliveryMode(DeliveryMode.PERSISTENT);
}
else {
qResource.theQueueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
qResource.theQueueConnection.start();
}
catch (JMSException jmse) {
throw jmse;
}
catch (NamingException ne) {
throw ne;
}
finally {
if(jndi != null){
jndi.close();
}
}
return qResource;
}我可以看到一些建议,比如使用原子整数包装器。解决这个问题的最佳方法是什么?
发布于 2015-09-09 12:39:59
声纳违反行为是有效的,因为从实例方法中突变静态变量可能会导致一些非常混乱的行为,如:
createQueueResource方法访问该字段时,会发生什么?对于Java文档,使其静态并可能被多个线程访问是一个坏主意:
InitialContext实例与多个线程的并发访问不同步。每个处理不同InitialContext实例的多个线程不需要同步。需要并发访问单个InitialContext实例的线程之间应该同步,并提供必要的锁定。
建议的局部变量似乎是避免警告和相关问题的合理的第一种方法。
上下文的构建是否昂贵也取决于用于提供上下文的工厂。
首先您需要担心程序的正确性,然后您可以在测试真正的瓶颈所在时进行优化。
编辑:这个链接应该提供对Spring应用程序上下文的更深入了解,以及如何利用Spring容器的依赖注入来使用上下文,而不是将其存储在类https://spring.io/understanding/application-context中的变量中。
https://stackoverflow.com/questions/32476889
复制相似问题