4

次のコードの場合

 public class JMSSamplePut 
    {
      private static String initialContextUrl = null;
      private static String connectionFactoryFromJndi = "UM_QMGR_QCF";
      private static String queueFromJndi = "BCUFXW.EXB.ATHENA.FX.IN";
      private static String outString = "A sample text message " +
                                    "from JMSSampleput";
      private static int retryInterval = 10;
      private static int retryCount = 3;
      private static int connStatus = 1;


      /**
       * @param args
       */
      public static void main( String[] args ) 
      {

        // Variables
        Queue                   ioQueue      = null;
        QueueSession            session      = null;
        QueueSender             queueSender  = null;
        QueueConnection         connection   = null;
        QueueConnectionFactory  factory      = null;
        boolean                 transacted   = false;
        int i = 0;

        try { 
          // Instantiate the initial context for JNDI
          String contextFactory ="com.sun.jndi.fscontext.RefFSContextFactory";
          Hashtable environment = new Hashtable();
          environment.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory);
          environment.put(Context.PROVIDER_URL, "file:/c:/jndi"); 
          Context context = new InitialDirContext(environment);
          System.out.println("Initial context found!");

          // Create a Queue ConnectionFactory
          factory = (QueueConnectionFactory) context.lookup(connectionFactoryFromJndi);

    ...........

最後の行は失敗しています

キャッチされたJMSException:com.ibm.msg.client.jms.DetailedJMSSecurityException:JMSWMQ2013:接続モード'Client'およびホスト名'NATMIB1.hostname.net(1414)'のQueueManager''に提供されたセキュリティー認証が無効でした。リンクされた例外に接続しているQueueManagerで、指定されたユーザー名とパスワードが正しいかどうかを確認してください。com.ibm.mq.MQException:JMSCMQ0001:WebSphere MQ呼び出しがcompcode「2」(「MQCC_FAILED」)理由「2035」( ' MQRC_NOT_AUTHORIZED')。終了した

JVM引数

-Djavax.net.ssl.keystore=c://keystore//a_dev.jks \
-Djavax.net.ssl.keyStorePassword=******** \
-Djavax.net.ssl.trustStorePassword=******** \
-Djavax.net.ssl.trustStore=c://keystore//cacerts.jks \
-Djavax.net.debug=all   

ポインタはありますか?次の行はなぜですか?

接続モードが「クライアント」でホスト名が「NATMIB1.hostname.net(1414)」のQueueManager''に提供されたセキュリティ認証が無効でした

JNDIエージェントがQueueManagerの名前を見つけることができないように見えますか?.bindingsファイルに次の行があり、キューマネージャー名はNATMIB1です。

UM_QMGR_QCF/RefAddr/3/Content=NATMIB1.xyz.net

前もって感謝します

スンダール

4

2 に答える 2

3

適切なツールがあれば、 WMQ セキュリティ エラーのデバッグは非常に簡単です。まず、SupportPac MS0Pを取得し、指示に従って WMQ Explorer にインストールします。最新バージョンの WMQ Explorer をお持ちでない場合は、SupportPac MS0Tからダウンロードできます。

次に、QMgr で認証イベントを有効にして、エラーを再現します。

この時点で、WMQ エクスプローラーでイベント キューを右クリックし、[イベント メッセージの書式設定] を選択します。これにより、次のようなエラーのすべての側面が表示されます。

  1. エラーを生成したユーザー ID。チャネルの設定、終了、およびクライアントの設定によっては、使用される ID が予期したものと異なる場合があります。
  2. 行われた API 呼び出し。この場合はおそらく接続しますが、これが期待どおりでない場合もあります。たとえば、IBM JMS クラスは常に QMgr を照会して DLQ 名を取得しますが、照会を許可していない場合は失敗します。
  3. 呼び出しに使用された正確なオプション。
  4. 呼び出しが発行された対象のオブジェクト。

エラーのこれらの要素がわかれば、ID 自体、チャネル、ID の権限などに問題があるかどうかを特定できます。


アップデート

コメント内の質問に答えて、許可イベントを有効にするには、MQ エクスプローラーまたは runmqsc を次のように使用します。

コマンドライン版

MQ エクスプローラー バージョンの場合、まず QMgr を右クリックし、[プロパティ] を選択します。

ここに画像の説明を入力

次に、ナビゲーション パネルで [イベント] を選択し、必要に応じてイベントを設定して、 をクリックしますOK

ここに画像の説明を入力

于 2013-01-20T03:34:49.923 に答える
2

この例では、ファイル システム コンテキストを JNDI プロバイダーとして使用しています。JMS オブジェクトは、c:/jndi ディレクトリにフラット ファイル形式で格納されています。このファイルをテキスト エディタで見ることができます。読みにくいですが、オブジェクトのいくつかの要素を見ることができます。余談ですが、ここで選択する管理ツールとして WMQ Explorer を使用することをお勧めします。これは、ファイル システム コンテキストを含む任意の JNDI を読み取って更新できます。

最後の行は、「UM_QMGR_QCF」という名前のオブジェクトの検索を行っています。これは、オブジェクトのルックアップのみを行っています。これを行うために QueueManager に接続することはなく、接続ファクトリ オブジェクトを作成しても QueueManager への接続は作成されません。

表示されているエラーは、createConnection 呼び出しに起因します。このエラーは、createConnection 呼び出しで指定されたユーザー ID/パスワードが一致しないか、QM で設定されているセキュリティで認証されていないことを意味します。

このエラーは、TCP/IP リンクの SSL セットアップとは関係ありません。

WMQ セキュリティの設定については、このシナリオhttp://publib.boulder.ibm.com/infocenter/prodconn/v1r0m0/index.jsp?topic=%2Fcom.ibm.scenarios.wmqwas101.doc%2Ftopics%から始めることができます。 2Fscenario_overview.htm

例外の発生元を検証することをお勧めします。また、JNDI から返されたオブジェクトに対して System.out.println() を実行してみてください。すべての WMQ Admin オブジェクトは、組み込みの toString() を介して自身をフォーマットします。

于 2013-01-18T13:49:12.223 に答える