首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >声纳违章:从实例方法到静态字段的错误写入

声纳违章:从实例方法到静态字段的错误写入
EN

Stack Overflow用户
提问于 2015-09-09 10:17:46
回答 1查看 1.6K关注 0票数 1

我的类中有一个变量--“受保护的静态上下文jndi;”,其中" Context“是一个接口。当我试图在下面提到的方法中访问它时,它会生成标题中提到的声纳冲突。

代码语言:javascript
复制
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;
}

我可以看到一些建议,比如使用原子整数包装器。解决这个问题的最佳方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-09 12:39:59

声纳违反行为是有效的,因为从实例方法中突变静态变量可能会导致一些非常混乱的行为,如:

  • 如何确保在静态读取访问之前由实例方法初始化字段?
  • 当多个线程直接或通过createQueueResource方法访问该字段时,会发生什么?

对于Java文档,使其静态并可能被多个线程访问是一个坏主意:

InitialContext实例与多个线程的并发访问不同步。每个处理不同InitialContext实例的多个线程不需要同步。需要并发访问单个InitialContext实例的线程之间应该同步,并提供必要的锁定。

建议的局部变量似乎是避免警告和相关问题的合理的第一种方法。

上下文的构建是否昂贵也取决于用于提供上下文的工厂。

首先您需要担心程序的正确性,然后您可以在测试真正的瓶颈所在时进行优化。

编辑:这个链接应该提供对Spring应用程序上下文的更深入了解,以及如何利用Spring容器的依赖注入来使用上下文,而不是将其存储在类https://spring.io/understanding/application-context中的变量中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32476889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档