0

私は Websphere MQ (IBM z/OS) テクノロジーを初めて使用します。JMS テクノロジーを使用して MQ サーバー (IBM z/OS 上。これは、アクセスが制限されている別の組織によって維持されています) に接続し、メッセージをキューに入れるスタンドアロン アプリケーションを実装する必要がありました。

以下は私のコードの一部です。

private void sendMessage(String queue, String msg) {
        JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
        JmsConnectionFactory cf = ff.createConnectionFactory();

        cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, host);
        cf.setIntProperty(WMQConstants.WMQ_PORT, port);
        cf.setStringProperty(WMQConstants.WMQ_CHANNEL, channel);
        cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
        cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, queueManagerName);
        cf.setStringProperty(WMQConstants.USERID, user);
        cf.setStringProperty(WMQConstants.PASSWORD, password);

    Connection connection = null;
    Session session = null;
    Destination destination = null;
    MessageProducer producer = null;


        connection = cf.createConnection(user, password);
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        destination = session.createQueue(queue);
        //((MQDestination)destination).setCCSID(37);
        producer = session.createProducer(destination);

        TextMessage message = session.createTextMessage();
        message.setIntProperty(WMQConstants.JMS_IBM_CHARACTER_SET, 37);
        //message.setIntProperty(WMQConstants.JMS_IBM_ENCODING, 785);

        message.setText(msg);
        // Start the connection
        connection.start();

        // And, send the message
        producer.send(message);
}

相手側の MQ サーバーに正常に接続し、メッセージをリモート サーバーに ASCII 形式で送信することができました。AIX サーバーからキューに入れたメッセージを消費することができました。

しかし、MQ は z/OS 上で実行されており、コンシューマーもメインフレーム アプリケーションであるため、私が入力したメッセージは、ゴミのような、または判読できない形式のようです。いくつかの調査の結果、メッセージを z/OS MQ に配置するには、メッセージを EBCDIC に変換する必要があることがわかりました。これは、IBM MQ ライブラリーによって処理されると予想していました。

メッセージを EBCDIC 形式にする方法を教えてください。

4

4 に答える 4

3

あなたはこれを間違っています:

message.setIntProperty(WMQConstants.JMS_IBM_CHARACTER_SET, 37);

キューに入れる文字セットを宣言する必要があります。これはJavaのように見えるので、UTF-16文字列であると想定しています。37 ではなく 1208 として宣言します。

一方、EBCDIC で受け取りたい場合は、GET-With-Convert を実行し、IBM 37/1140 で受け取ることを宣言します。MQ は、z/OS 用の Unicode 変換サービスを呼び出して、それを実現します。

于 2015-03-30T16:02:32.783 に答える
0

さらに重要なことに、受信者が Java クライアントでない場合は、次のように JMS ヘッダーを無効にする必要があります。

destination = session.createQueue("queue:///" + queue + "?targetClient=1")

または、ネイティブ MQ 実装を呼び出すことによって:

((MQDestination)destination).setMessageBodyStyle(WMQConstants.WMQ_MESSAGE_BODY_MQ)

見る:

https://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc/q032120_.htm

https://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc/q032140_.htm?lang=en

http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.0.1/com.ibm.mq.csqzaw.doc/jm10910_.htm

于 2016-02-24T21:16:15.727 に答える