Trocando um registro formatado com um aplicativo nãoJMS

Siga os passos sugeridos nesta tarefa para projetar e construir uma saída de conversão de dados, e um aplicativo cliente JMS que possa trocar mensagens com um aplicativo nãoJMS usando JMSBytesMessage. A troca de uma mensagem formatada com um aplicativo nãoJMS pode ocorrer com ou sem chamar uma saída de conversão de dados.

Antes de Começar

Você pode ser capaz de projetar uma solução mais simples para trocar mensagens com um aplicativo nãoJMS usando um JMSTextMessage. Elimine que possibilidade antes de seguir as etapas nesta tarefa.

Sobre esta tarefa

Um cliente JMS é mais fácil de escrever se não estiver envolvido nos detalhes de formatação JMS mensagens trocadas com outros clientes JMS . Desde que o tipo de mensagem seja JMSTextMessage, JMSMapMessage, JMSStreamMessageou JMSObjectMessage, IBM® MQ looks após os detalhes de formatação da mensagem. IBM MQ trata das diferenças nas páginas de código e da codificação numérica em diferentes plataformas.

Você pode usar esses tipos de mensagens para trocar mensagens com aplicativos nãoJMS . Para isso, você deve entender como essas mensagens são construídas por IBM MQ classes for JMS. Você pode modificar o não-JMS aplicativo para interpretar as mensagens; ver Mapeando mensagens JMS paraIBMMQ mensagens .

Uma vantagem de usar um desses tipos de mensagens é a programação do cliente JMS não depende do tipo de aplicativo com o qual ele está trocando mensagens. Uma desvantagem é que ela pode requerer uma modificação para outro programa e você pode não ser capaz de mudar o outro programa.

Uma abordagem alternativa é escrever um aplicativo cliente JMS que possa lidar com formatos de mensagens existentes. Geralmente as mensagens existentes são formatos fixos e contêm uma mistura de dados não formatados, textos e números. Use as etapas desta tarefa e o exemplo de cliente JMS em Classes de escrita para encapsular um layout de registro em uma JMSBytesMessage como ponto de partida para criar um cliente JMS que possa trocar registros formatados com aplicativos que não JMS *.

Procedimento

  1. Defina o layout de registro, ou use uma das classes de cabeçalho IBM MQ predefinidas.

    Para lidar com cabeçalhos IBM MQ predefinidos, consulte Manipulação de IBM MQ cabeçalhos de mensagens.

    Figura 1 é um exemplo de um layout de registro de comprimento fixo do usuário definido pelo usuário, que pode ser processado pelo utilitário de conversão de dados.

  2. Crie a saída de conversão de dados.

    Siga as instruções em Escrever um programa de saída de conversão de dados para escrever uma saída de conversão de dados.

    Para experimentar o exemplo em Writing classes para encapsular um layout de registro em uma JMSBytesMessage, nomeie a saída de conversão de dados como MYRECORD.

  3. Escreva Java aulas para encapsular o layout de registro, e enviar e receber registro. Duas abordagens que você pode executar são:
  4. Decida qual conjunto de caracteres codificados ao qual trocar mensagens.
  5. Configure o destino para trocar as mensagens do tipo MQ, sem um cabeçalho JMS MQRFH2 .

    O destino de envio e de recebimento devem estar configurados para trocar mensagens do MQ-type. É possível usar o mesmo destino para o envio e o recebimento.

    O aplicativo pode substituir a propriedade do corpo da mensagem de destino:
    ((MQDestination)destination).setMessageBodyStyle(WMQConstants.WMQ_MESSAGE_BODY_MQ);
    
    O exemplo em Writing classes para encapsular um layout de registro em uma JMSBytesMessage substitui a propriedade do corpo da mensagem de destino, garantindo o envio de uma mensagem MQ.
  6. Teste a solução com os aplicativos JMS e nãoJMS
    As ferramentas úteis para testar uma saída de conversão de dados são:
    • O programa de amostra amqsgetc0.c é útil para testar o recebimento de uma mensagem enviada por um cliente JMS . Veja as modificações sugeridas para usar o cabeçalho de exemplo, RECORD.h, na Figura 2. Com as modificações, amqsgetc0.c recebe uma mensagem enviada pelo cliente JMS de exemplo, TryMyRecord.java; consulte Escrever classes para encapsular um layout de registro em um JMSBytesMessage.
    • O programa de navegação de amostra IBM MQ , amqsbcg0.c, é útil para inspecionar o conteúdo do cabeçalho da mensagem, o cabeçalho JMS , MQRFH2e o conteúdo da mensagem.
    • O programa rfhutil, anteriormente disponível no SupportPac IH03, permite que as mensagens de teste sejam capturadas e armazenadas em arquivos e, em seguida, usadas para conduzir fluxos de mensagens. As mensagens de saída também podem ser lidas e exibidas em uma variedade de formatos. Os formatos incluem dois tipos de XML, bem como correspondências com relação a um copybook COBOL. Os dados podem estar em EBCDIC ou ASCII. Um cabeçalho RFH2 pode ser incluído na mensagem antes de a mensagem ser enviada.

    Se você tentar receber mensagens usando o programa de amostra amqsgetc0.c modificado e obter um erro com o código de razão 2080, verifique se a mensagem possui um MQRFH2. As modificações presumem que a mensagem foi enviada para um destino que não especifica nenhum MQRFH2.

Exemplos

Figura 1. RECORD.h
struct RECORD { MQCHAR StrucID[4];
                MQLONG Version;
                                MQLONG StructLength;
                                MQLONG Encoding;
                                MQLONG CodeCharSetId;
                                MQCHAR Format[8];
                                MQLONG Flags;
                                MQCHAR RecordData[32];
        };
Figura 2 Modifique amqsget0.c
  • Declare a estrutura de dados RECORD.h
    struct tagRECORD {
       MQCHAR4    StrucId;            
       MQLONG     Version;            
       MQLONG     StrucLength;
       MQLONG     Encoding; 
       MQLONG     CCSID;  
       MQCHAR8    Format;
       MQLONG     Flags;
       MQCHAR32   RecordData;
     };   
    typedef struct tagRECORD RECORD;
       typedef RECORD MQPOINTER PRECORD;
       RECORD record;
       PRECORD pRecord = &(record);   
    
  • Modifique a chamada MQGET para usar o RECORD,
    1. Antes da modificação:
          MQGET(Hcon,            /* connection handle     */
                Hobj,            /* object handle         */
                &md,             /* message descriptor    */
                &gmo,            /* get message options   */
                buflen,          /* buffer length         */
                buffer,          /* message buffer        */
                &messlen,        /* message length        */
                &CompCode,       /* completion code       */
                &Reason);        /* reason code           */
      
    2. Após a modificação:
          MQGET(Hcon,            /* connection handle     */
                Hobj,            /* object handle         */
                &md,             /* message descriptor    */
                &gmo,            /* get message options   */
                sizeof(RECORD),  /* buffer length         */
                pRecord,         /* message buffer        */
                &messlen,        /* message length        */
                &CompCode,       /* completion code       */
                &Reason);        /* reason code           */
      
  • Mude a instrução de impressão,
    1. De:
      buffer[messlen] = '\0';            /* add terminator          */
      printf("message <%s>\n", buffer);
      
    2. Para:
      /* buffer[messlen] = '\0';            add terminator          */
      printf("ccsid <%d>, flags <%d>, message <%32.32s>\n \0",
              md.CodedCharSetId, record.Flags, record.RecordData);