Получить идентификатор корреляции из MQ в виде строки - PullRequest
0 голосов
/ 30 мая 2018

Я устанавливаю идентификатор корреляции при отправке сообщения в MQ.И мне нужно использовать CorrelationID из COA сообщения, которое я отправил, для дальнейшей обработки.

Я устанавливаю идентификатор корреляции и отправляю сообщение в очередь, используя следующий код.

MQMessage message = createMQMessage("12345");
message.write("Some message to push".getBytes());
queue.put(message);

private MQMessage createMQMessage(String corrID){

        MQMessage message = new MQMessage();
        message.messageFlags = MQConstants.MQMF_SEGMENTATION_ALLOWED;

        if (ackQueueName != null) {

            message.messageType = MQConstants.MQMT_REQUEST;
            message.replyToQueueManagerName = ackQueueManagerName;
            message.replyToQueueName = ackQueueName;
            message.report = MQConstants.MQRO_COA | MQConstants.MQRO_COD;
            message.correlationId = corrID.getBytes();



        }
        return message;
    }

Я читаю responseQueue из другого приложения, чтобы получить сертификат подлинности и извлечь идентификатор корреляции длядальнейшая обработка.

Но идентификатор корреляции в формате byte[], и я использовал приведенный ниже метод getHexString, чтобы получить строку.Но все, что я получил, - это 48-значный шестнадцатеричный формат моего идентификатора корреляции, такой как

414d5120514d41444556202020202020b5ca0d5b13b3bb20

public static String getHexString(byte[] b) throws Exception {
        String result = "";
        for (int i=0; i < b.length; i++) {
            result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
        }


        return result;

    }

Все, что мне нужно, - это метод преобразования 48-значных шестнадцатеричных чисел к исходному идентификатору корреляции, который я установил.Я попытался использовать приведенный ниже метод для преобразования, но он дает мне ненужные данные.

public static String hexStringToByteArray(String hex) {
        int l = hex.length();
        byte[] data = new byte[l/2];
        for (int i = 0; i < l; i += 2) {
            data[i/2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                    + Character.digit(hex.charAt(i+1), 16));
        }
        return new String(data);
    }

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Параметры вашего отчета не установлены явно.

MQRO_COPY_MSG_ID_TO_CORREL_ID Это действие по умолчанию и указывает, что если в результате этого сообщения генерируется отчет или ответ, MsgId этого сообщениякопируется в CorrelId отчета или ответного сообщения.

Из-за действия по умолчанию вы никогда не получите первоначальный идентификатор корреляции вашего сообщения.Как упоминал Роджер в своем ответе, неправильно устанавливать MsgID программно.Просто используйте следующую опцию, чтобы скопировать CorrelID в сообщение отчета:

MQRO_PASS_CORREL_ID Если в результате этого сообщения генерируется отчет или ответ, CorrelId этого сообщения копируется в CorrelId отчета или ответного сообщения.

message.report = MQConstants.MQRO_COA 
                 | MQConstants.MQRO_COD 
                 | MQConstants.MQRO_PASS_CORREL_ID;
0 голосов
/ 30 мая 2018

Я сам установил идентификатор сообщения, теперь у меня все нормально

НЕ устанавливайте сообщение в сообщении.Пусть администратор очередей создает уникальный идентификатор сообщения для каждого сообщения, помещаемого в очередь.Если вам необходимо передать информацию вместе с сообщением, либо (1) поместите ее в данные / полезную нагрузку сообщения, либо (2) добавьте свойство сообщения (именуемое свойство) к сообщению.

Если вы создаете свой собственныйmessageId, то есть вероятность дублирования messageIds, что очень плохо и противоречит рекомендациям.В IBM MQ Best Practices говорится, что администратор очередей может создать уникальный идентификатор сообщения.

...