1

例外スタック トレースは多くの情報を提供しません。

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"));
}

スタックトレースは次のとおりです。

com.solacesystems.jndi.SolJNDIInitialContextFactory$SolJNDIInitialContextImpl.getEnvironment(SolJNDIInitialContextFactory.java:230) での javax.naming.OperationNotSupportedException 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) at org.apache.jmeter.protocol.jms.sampler.PublisherSampler.sample(PublisherSampler.java:154) at org.apache.jmeter. org.apache.jmeter.threads.JMeterThread の protocol.jms.sampler.BaseJMSSampler.sample(BaseJMSSampler.java:80)。process_sampler(JMeterThread.java:429) で org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257) で java.lang.Thread.run(Thread.java:722) で

4

1 に答える 1

4

使用している 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();
    }
}
于 2014-01-04T18:32:41.000 に答える