【问题标题】:NullPointer on new InitialContext()新 InitialContext() 上的 NullPointer
【发布时间】:2014-11-07 09:34:00
【问题描述】:

我们使用的是 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,并且在 new InitialContext() 中的附加创建失败

知道为什么吗?

感谢乔尔格

【问题讨论】:

    标签: jboss nullpointerexception jboss-eap-6 initial-context


    【解决方案1】:

    请记住以下几点:

    InitialContext 对象不同步,这意味着不同线程不应同时访问一个实例。 您已将 initialContext 变量声明为类成员(静态),因此,在某些时候不同的线程会同时使用它。

    一个简单的解决方案是将属性声明为实例成员。

    <!-- language: java -->
    private InitialContext initialContext;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多