【问题标题】:Why InitialContext throws naming exception when call getEnvironment()?为什么 InitialContext 在调用 getEnvironment() 时会抛出命名异常?
【发布时间】:2015-11-24 02:18:34
【问题描述】:

异常堆栈跟踪并没有提供太多信息,只是

javax.naming.OperationNoSupportedException

public static Connection getConnection(Context ctx, String factoryName) throws JMSException, NamingException {
    Object objfac = null;
    try {
        objfac = ctx.lookup(factoryName);
    } catch (NoClassDefFoundError e) {
        throw new NamingException("Lookup failed: "+e.toString());
    }
    if (objfac instanceof javax.jms.ConnectionFactory) {
        @SuppressWarnings("unchecked") // The environment is supposed to use String keys only
        Map<String, Object> env = (Map<String, Object>)ctx.getEnvironment();
        if(env.containsKey(Context.SECURITY_PRINCIPAL)) {
            String username = (String)env.get(Context.SECURITY_PRINCIPAL);
            String password = (String)env.get(Context.SECURITY_CREDENTIALS);
            return ((javax.jms.ConnectionFactory) objfac).createConnection(username, password);                
        }
        else {
            return ((javax.jms.ConnectionFactory) objfac).createConnection();
        }
    }
    throw new NamingException("Expected javax.jms.ConnectionFactory, found "+(objfac != null ? objfac.getClass().getName(): "null"));
}

堆栈跟踪是:

javax.naming.OperationNotSupportedException 在 com.solacesystems.jndi.SolJNDIInitialContextFactory$SolJNDIInitialContextImpl.getEnvironment(SolJNDIInitialContextFactory.java:230) 在 javax.naming.InitialContext.getEnvironment(InitialContext.java:544) 在 javax.naming.InitialContext.getEnvironment(InitialContext.java:544) 在 org.apache.jmeter.protocol.jms.Utils.getConnection(Utils.java:155) 在 org.apache.jmeter.protocol.jms.client.Publisher.(Publisher.java:130) 在 org.apache.jmeter.protocol.jms.sampler.PublisherSampler.initClient(PublisherSampler.java:135) 在 org.apache.jmeter.protocol.jms.sampler.PublisherSampler.sample(PublisherSampler.java:154) 在 org.apache.jmeter.protocol.jms.sampler.BaseJMSSampler.sample(BaseJMSSampler.java:80) 在 org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:429) 在 org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257) 在 java.lang.Thread.run(Thread.java:722)

【问题讨论】:

  • 请提供完整的例外情况,对于包含您的代码的堆栈跟踪部分,请显示堆栈跟踪中引用的代码和标签行号。

标签: java jndi solace


【解决方案1】:

您使用的 JNDI 实现不支持 getEnvironment 方法,这意味着该代码无法访问用于访问 JMS 服务器的任何凭据。这是我的修复尝试(如果不需要凭据,这可能仅适用于您的情况,我不确定):

if (objfac instanceof javax.jms.ConnectionFactory) {
    @SuppressWarnings("unchecked") // The environment is supposed to use String keys only
    Map<String, Object> env = null;
    try {
       env = (Map<String, Object>)ctx.getEnvironment();
    } catch (javax.naming.OperationNotSupportedException ex) {}
    if(env != null && env.containsKey(Context.SECURITY_PRINCIPAL)) {
        String username = (String)env.get(Context.SECURITY_PRINCIPAL);
        String password = (String)env.get(Context.SECURITY_CREDENTIALS);
        return ((javax.jms.ConnectionFactory) objfac).createConnection(username, password);                
    }
    else {
        return ((javax.jms.ConnectionFactory) objfac).createConnection();
    }
}

【讨论】:

  • 这行得通。非常感谢。不实现getEnvironment是不是JMS服务器的缺陷?
  • 技术上我认为这是 jmeter 代码中的一个错误 - 它应该捕获这个异常。
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多