【问题标题】:Accessing IBM MQ via Domino agent - JMSException通过 Domino 代理访问 IBM MQ - JMSException
【发布时间】:2017-12-07 21:51:54
【问题描述】:

基于以下问题:

Connecting to a Websphere MQ in Java with SSL/Keystore

我设置了一个 Domino 代理来访问 IBM MQ。但是我得到了消息:

javax.jms.JMSException:MQJMS2005:未能为“ibmmq.mycorp.se:QMANAGER”创建 MQQueueManager

我正在使用以下代码:

import lotus.domino.*;

import javax.jms.*;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueueConnectionFactory;

import java.io.InputStream;
import java.security.KeyStore;


public class JavaAgent extends AgentBase {

    /*   
     * not working. factory incorrect set?
     */

    private static final boolean debug = true;
    private static final boolean debugDefault = true;   


    String msg;

    public void NotesMain() {

        lotus.domino.Session s = getSession();
        OpenLogItem oli = new OpenLogItem(s);

        try {           
            msg = "Agent started";
            toLogDebug(msg);

            Environment env = setEnvVariables();

            InputStream res = this.getClass().getResourceAsStream("key.jks");
            char[] pw = {'p','a','s','s','w','o','r','d'};

            KeyStore ks;
            ks = KeyStore.getInstance("JKS");
            ks.load(res, pw);

            msg = "after keystore loaded";  
            toLogDebug(msg);

             // Create a keystore object for the truststore
            KeyStore trustStore = KeyStore.getInstance("JKS");

            InputStream res2 = this.getClass().getResourceAsStream("key.jks");


             // Open our file and read the truststore (no password)
            trustStore.load(res2, null);

            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

            keyManagerFactory.init(ks, pw);
            trustManagerFactory.init(trustStore);

            msg = "After Managers .init.";  
            toLogDebug(msg);                

            SSLContext sslContext = SSLContext.getInstance("SSL_TLS");

            msg = "SSLContext provider: " + sslContext.getProvider().toString();
            toLogDebug(msg);    

            sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

            msg = "After sslContext.init."; 
            toLogDebug(msg);

            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            msg = "After getSocketFactory()";   
            toLogDebug(msg);

            // Create default MQ connection factory
            MQQueueConnectionFactory factory = new MQQueueConnectionFactory();

            msg = "After MQQueueConnectionFactory()";   
            toLogDebug(msg);

            // Customize the factory
             factory.setSSLSocketFactory(sslSocketFactory);
             // Use javac SSLTest.java -Xlint:deprecation
             factory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
             factory.setQueueManager(env.getQueManager());
             factory.setHostName(env.getHost());
             factory.setChannel(env.getChannel());
             factory.setPort(env.getPort());
             factory.setSSLFipsRequired(false);
             factory.setSSLCipherSuite("TLS_RSA_WITH_AES_256_CBC_SHA256");

             msg = "After factory set"; 
             toLogDebug(msg);

             QueueConnection connection = null;
             connection = factory.createQueueConnection("",""); //empty user, pass to avoid MQJMS2013 messages

             msg = "after createQueueConnection(\"\",\"\")";
             toLogDebug(msg);

             connection.start();
             msg = "JMS SSL client connection started!";
             toLogDebug(msg);
             connection.close();

            msg =  "Agent done!";
            toLogDebug(msg);
         } catch (JMSException ex) {
             oli.logError(ex);
          } catch (Exception ex){
             oli.logError(ex);
          }
    }

    public Environment setEnvVariables(){

        Environment env = null;

        lotus.domino.Session s = getSession();
        try{
            Database adminDb = s.getCurrentDatabase();
            if (adminDb.isOpen()){
                View adminVw = adminDb.getView("settings");
                if (null != adminVw){
                    adminVw.setAutoUpdate(false);
                    Document adminDoc = adminVw.getFirstDocument();
                    if (null != adminDoc){

                        env = new Environment();
                        if (adminDoc.hasItem("mqhost")){                            
                            env.setHost(adminDoc.getItemValueString("mqhost"));
                        }
                        if (adminDoc.hasItem("mqport")){
                            env.setPort(Integer.parseInt(adminDoc.getItemValueString("mqport")));
                        }
                        if (adminDoc.hasItem("mqchannel")){
                            env.setChannel(adminDoc.getItemValueString("mqchannel"));
                        }
                        if (adminDoc.hasItem("mqquemanager")){
                            env.setQueManager(adminDoc.getItemValueString("mqquemanager"));
                        }                   

                    }
                }

            }
        }catch(Exception e){
            //
        }

        return env;

    }

    public void toLogDebug(String msg){
        if (debug){
            lotus.domino.Session session = getSession();
            OpenLogItem oli = new OpenLogItem(session);
            oli.logEvent(msg, OpenLogItem.SEVERITY_LOW, null);
        }
    }

    public void toLogDefault(String msg){
        if (debugDefault){
            lotus.domino.Session session = getSession();
            OpenLogItem oli = new OpenLogItem(session);
            oli.logEvent(msg, OpenLogItem.SEVERITY_HIGH, null);
        }
    }

    public class Environment{

        String host;
        int port;
        String channel;
        String queManager;

        lotus.domino.Session s = getSession();
        OpenLogItem oli = new OpenLogItem(s);

        public Environment(){
            oli.logEvent("Environment constructor", OpenLogItem.SEVERITY_LOW, null);
        }

        public String getHost() {
            return host;
        }

        public void setHost(String host) {
            this.host = host;
        }

        public int getPort() {
            return port;
        }

        public void setPort(int port) {
            this.port = port;
        }

        public String getChannel() {
            return channel;
        }

        public void setChannel(String channel) {
            this.channel = channel;
        }

        public String getQueManager() {
            return queManager;
        }

        public void setQueManager(String queManager) {
            this.queManager = queManager;
        }       
    }


}

我将环境变量存储在 Notes 关键字文档中。有谁知道为什么这段代码会在以下位置中断:

connection = factory.createQueueConnection("","");

?

密钥文件作为资源包含在代理中并提供给我。

【问题讨论】:

    标签: java ibm-mq lotus-domino


    【解决方案1】:

    有没有人知道为什么这段代码会在以下位置中断:

    connection = factory.createQueueConnection("","");
    

    那是实际导致客户端连接到队列管理器的代码行。您使用的是 IBM JRE 还是 Oracle JRE?队列管理器错误日志中的错误消息是什么?

    您提供的是空白的用户 ID 和密码。非常糟糕的主意。此外,队列管理器的 CHLAUTH 规则应阻止空白 UserId。

    【讨论】:

    • 嗨 Roger,我将我的代理设置为用户提供的用户 ID、密码,还为该用户设置了密钥库。尽管如此,我仍然停留在为 MQQueueconnectionfactory 创建队列连接的部分。无论如何要调查出厂设置的哪一部分可能会导致问题?
    • 这是我的错误消息:javax.jms.JMSException: MQJMS2005: failed to create MQQueueManager for 'ibmmq.mycorp.se:QMANAGER' at com.ibm.mq.jms.services.ConfigEnvironment.newException (ConfigEnvironment.java:586) 在 com.ibm.mq.jms.MQConnection.createQM(MQConnection.java:2110) 在
    • com.ibm.mq.jms.MQConnection.createQMNonXA(MQConnection.java:1532) 在 com.ibm.mq.jms.MQQueueConnection.(MQQueueConnection.java:150) 在 com. ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:185) at JavaAgent.NotesMain(Unknown Source) at lotus.domino.AgentBase.runNotes(Unknown Source) at lotus.domino.NotesThread.run(Unknown Source)跨度>
    • @PatrickKwinten,正如 Roger 已经问过的“队列管理器错误日志中的错误消息是什么?”。此外,最好编辑您的问题并提供更多详细信息,因为您可以格式化错误消息。在 cmets 中你不能格式化它们。
    • 我通过循环异常找到了线索。 catch (JMSException ex) { oli.logError(ex);可抛出的 innerException = ex.getLinkedException(); if (innerException != null) { msg = "内部异常:"; toLogDebug(msg); } while (innerException != null) { msg = innerException.toString(); toLogDebug(msg); innerException = innerException.getCause(); } } 捕捉(异常前){ oli.logError(前); }
    猜你喜欢
    • 2021-01-02
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多