Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

A primeira vez que acessar o developerWorks, um perfil será criado para você. Informações do seu perfil (tais como: nome, país / região, e empresa) estarão disponíveis ao público, que poderá acompanhar qualquer conteúdo que você publicar. Seu perfil no developerWorks pode ser atualizado a qualquer momento.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Cliente MIF (Maximo Integration Framework) baseado em componentes Opensource

Invocando serviços do Maximo através de XML sobre protocolo HTTP, utilizando a facilidade de componentes Opensource

Leucir Marin Jr., Engenheiro de software, IBM
author's photo
Leucir é Engenheiro de software do Laboratório de desenvolvimento Brasil e vem desempenhando papel de liderança em integrações do Maximo com diversas plataformas no mercado. Possue 13 anos de experiência no mercado de TI, todos eles voltados para a indústria de software. Ver Perfil no My developerWorks

Resumo:  Neste artigo você verá como a combinação de componentes Opensource pode ajudar na criação de um cliente para o MIF. Esta integração pode ser utilizada como referência para diversos cenários e sugere uma abordagem simples para o processamento de mensagens XML que trafegam entre aplicações sobre o protocolo HTTP.

Data:  27/Dez/2010
Nível:  Avançado
Atividade:  2647 visualizações
Comentários:  


Introdução

Combinado com o avanço do Maximo em diversas indústrias e por sua participação cada vez mais presente em soluções Smart, a necessidade de integração com essa plataforma vem aumentando significativamente, principalmente no contexto de processos de monitoramento e manutenção. E por esta razão iremos fornecer um breve artigo de como utilizar componentes opensource para agilizar a criação de um cliente MIF, que posteriormente pode ser utilizado como referência para integrações mais complexas e reutilizáveis.

Ao final deste artigo é esperado que o leitor compreenda o papel dos componentes opensource na integração com o Maximo como também obtenha uma visão introdutória ao MIF e suas interfaces.

Introdução ao MIF

É a camada de integração do Maximo e possibilita que sistemas externos troquem informações através de interfaces já criadas. Essas interfaces são compostas por objetos de negócio do Maximo, e internamente representadas através da aplicação chamada Object Structure.

Atualmente é possível se conectar ao Maximo através de diversas maneiras, entre elas, WebServices, EJB, HTTP, entre outros.

Neste artigo será considerado o uso do Object Structure MXINCIDENT e XML sobre o protocolo HTTP.
Para isso o cliente MIF necessita submter a mensagem XML para uma URL especifica do Maximo e receber sincronamente a mensagem XML de retorno.

O XML utilizado para a troca de mensagens através do MIF é geralmente chamada de Maximo XML, e sua estrutura é similar ao exemplo abaixo:

            
            
            <?xml version='1.0' encoding='UTF-8'?>
            <DeleteMXPROBLEM (1)
                xmlns="http://www.ibm.com/maximo"
                creationDateTime="2010-12-02T22:54:45-0200"
                transLanguage="EN" (2) 
                messageID="3800271411595100160"
                maximoVersion="7 1 20091208-1415 V7116-173">
                <MXPROBLEMSet> (3)
                   <PROBLEM> (4)
                     <CLASS>PROBLEM</CLASS> (5)
                        <TICKETID>89892</TICKETID>
                    </PROBLEM>
                </MXPROBLEMSet>
            </DeleteMXPROBLEM>
            
        

Onde:
(1) Operação (Delete) e nome do Object Structure (MXPROBLEM);
(2) Idioma da mensagem (EN);
(3) Nome do Object Structure e literal Set / Query;
(4) Nome do objeto (MBO) principal do Object Structure;
(5) Lista de atributos

As operações suportadas pela aplicação exemplo são Delete, Update, Query e Create. Outras operações, como Sync, não são consideradas neste artigo, porém podem ser aplicadas em outros cenários de integracão.

Dependendo da operação realizada a lista de atributos pode ter diferentes funções:
- Update: alguns atributos devem compor a chave única do registro, enquanto outros serão os novos valores do registro;
- Delete: os atributos devem compor a chave única do registro a ser apagado;
- Query: cada atributo é utilizado como parâmetro de pesquisa, similar a uma clausula Where;
- Create: os atributos informados serão gravados na criação do registro.

Especificamente sobre a operação de Query, um novo elemento deve ser considerado: o operador de pesquisa. Para este artigo os operadores “=”, “<” e “>” são considerados válidos.

Para mais detalhes sobre as operações suportadas pelo Maximo XML, assim como as particularidades de cada operação, utilize o guideline de integração do Maximo (verificar link na seção Recursos deste artigo)

Configuração Maximo

Para qualquer integração com o Maximo através do MIF é necessário definir, se necessário, alguns parâmetros de configuração do Maximo. As seguintes propriedades devem ser verificadas:
- mxe.int.webappurl: representa a URL padrão onde os serviços HTTP do MIF serão disponibilizados.
- mxe.int.globaldir: indica o diretório no servidor onde os esquemas (XSD) do MIF são armazenados.

Utilize a aplicação System properties para realizar as configurações acima e utilize o guia de integração do Maximo para maiores detalhes.

Funcionamento do cliente MIF

Para um bom entendimento deste artigo, é necessário conhecer os principais elementos utilizados na aplicação exemplo, como também os relacionamentos entre eles. Nesta seção serão apresentados detalhes da aplicação exemplo e os componentes opensource utilizados.

Relacionado a aplicação exemplo, os elementos mais importantes são:

  • TemplateLoader: responsável por carregar os templates XML e substituir os valores recebidos como parâmetro nos placeholders adequados.
  • Attribute: representa cada parâmetro recebido no formato (campo,operador,valor) nas operações internas do cliente.
  • HTTPDispatcher: responsável por enviar a mensagem XML para o Maximo.
  • Invoker: classe principal do cliente que gerencia o fluxo de entrada, processamento e saída de uma invocação.

Figura 1 - Diagrama de classes entre elementos da aplicação exemplo


Figura 1 - Diagrama de sequência que descreve a interação entre os elementos da aplicação exemplo

O diagrama de sequência acima apresenta as principais trocas de mensagem entre as classes do exemplo.
Ressaltando que se trata de um processamento síncrono e que o Maximo irá retornar uma mensagem de resposta confirmando que a mensagem original foi recebida e processada com sucesso. Caso contrário, uma exceção é gerada pelo objeto HTTPDispatcher.

Os componentes utilizados são todos da familia Apache e são descritos a seguir:

  • Velocity: utilizado na substituição dinâmica de templates XML do MIF
  • HttpClient: responsável pelo envio de mensagens ao Maximo sobre o protocolo Http
  • Log4J: utilizado para a saída de logs (registro de operações, debug, erros, etc.)
  • Commons: compartilhado pelos componentes acima e para o tratamento de String, Properties, Collections entre outros.

Figura 2 - Diagrama com os componentes Apache utilizados no artigo

O relacionamento entre os componentes e o código fonte da aplicação exemplo é explicado na seção seguinte – Decifrando o código-fonte.

Decifrando o código-fonte

Nesta seção iremos explorar os principais elementos disponibilizados no exemplo deste artigo. Os pontos mais importantes são:

  • Templates XML
  • Substituição dinâmica
  • Cliente HTTP
  • Parâmetros de linha de comando

O uso do Velocity nesta solucão é para transformar os templates XML em mensagens que possam ser enviadas para o Maximo. A seguir discutiremos um exemplo da mensagem de Create e como ela foi gerada.


template/create.xml
            <?xml version='1.0' encoding='UTF-8'?>
            <Create${mos_name}
            xmlns="http://www.ibm.com/maximo"
            creationDateTime="$creation_date_time"
            transLanguage="${trans_language}"
            messageID="${message_id}"
            maximoVersion="${maximo_version}">
                <${mos_name}Set>
                    <${mbo_name}>
                        ${mbo}
                    </${mbo_name}>
                </${mos_name}Set>
            </Create${mos_name}>
        
        

No template acima, é possível observar o esqueleto da mensagem e também as variáveis de substituição (placeholder) que serão posteriormente trocadas por valores reais.
O padrão ${variável} é reconhecido pelo engine do Velocity e então substituído conforme demonstra o exemplo a seguir.


Listagem 1: TemplateLoader.java
    ...	
    Velocity.init();
    
    VelocityContext context = new VelocityContext();
    
    //Map XML template with parameters
    ...
    context.put("mos_name", StringUtils.upperCase(this.objectStrucName));
    context.put("mbo_name", StringUtils.upperCase(objectname));
    ...			
    
    Template template = Velocity.getTemplate(LoaderUtils.getTemplateName(operation));
    
    //Invoking Velocity to merge xml with context
    template.merge(context, writer);
    
    //Retrieving template already modified with real values
    this.strResult = writer.toString();
    ...
        

        

O código acima detalha os passos para a utilização do Velocity para a montagem da mensagem final a ser enviada ao Maximo. Seguem:

  1. Criação e montagem do contexto do Velocity;
  2. Recuperação do template a ser utilizado;
  3. Merge do template com o contexto;
  4. E posteriormente a recuperação da mensagem final.

Após o processamento do template, o resultado final obtido é similar com o apresentado abaixo.

            
            
            <?xml version='1.0' encoding='UTF-8'?>
            <CreateMXINCIDENT
            xmlns="http://www.ibm.com/maximo"
            creationDateTime="2010-11-30T19:49:54-0200"
                transLanguage="EN"
                    messageID="4138638688644603904"
                        maximoVersion="7 1 20091208-1415 V7116-173">
                <MXINCIDENTSet>
                    <INCIDENT>
                        <CLASS>INCIDENT</CLASS><DESCRIPTION>test2</DESCRIPTION>
                    </INCIDENT>
                </MXINCIDENTSet>
            </CreateMXINCIDENT>
            
        

O uso do Velocity para esta aplicação é relativamene pequeno, porém de extrema importância, pois além de otimizar a montagem do XML, facilita futuras manutenções e aumenta significativamente a performance se comparada a criação de XML através de um parse.

O mesmo procedimento é utilizado para as outras operações (update, delete e query) que possuem os respectivos arquivos de template XML.

Quando chega o momento de enviar a mensagem pela classe TemplateLoader.java ao Maximo, entra em cena o componente HttpClient e relacionados (StringEntity, HttpPost, Entity e HttpResponse).


Listagem 2: HTTPDispatcher.java
        
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(httpConnInfo[0]);
        HttpResponse response;
        
        ...
        
        try {
        
             //Set message on StringEntity object
             StringEntity strEntity = new StringEntity(message);
             
             //Set header fields values
             strEntity.setContentType("text/html");
             strEntity.setChunked(false);
             strEntity.setContentEncoding("UTF-8");
             
             //Associate entity with HttpPost object
             post.setEntity(strEntity);
             
             //Submit message and retrieves Entity response
             response = client.execute(post);
             HttpEntity entity = response.getEntity();
             
             //Get response from HttpEntity object
             retValue = EntityUtils.toString(entity);	
             
         } catch (ClientProtocolException e) {
         ...
         } catch (IOException e) {
         ...
         } finally {
         //Close Http connection
         client.getConnectionManager().shutdown(); 
         }
        
        

Os passos para o envio da mensagem podem ser resumidos em:

  1. Configurar o objeto StringEntity, definindo a mensagem a ser enviada e os parâmetros do header;
  2. Associar o objeto StringEntity ao objeto HttpPost;
  3. Executar o post e recuperar a mensagem de resposta ;
  4. Fechar a conexão Http com o Maximo.

Se processado com sucesso pelo Maximo, a seguinte mensagem é retornada ao cliente, indicando a chave primária do recem-criado registro.

            <?xml version='1.0' encoding='utf-8'?>
            <CreateMXINCIDENTResponse xmlns="http://www.ibm.com/maximo" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            creationDateTime="2010-12-03T10:13:54-02:00" 
            transLanguage="EN" 
            baseLanguage="EN" 
            messageID="1291378434359707296">
                <INCIDENTMboKeySet>
                    <INCIDENT>
                    <CLASS maxvalue="INCIDENT">INCIDENT</CLASS>
                        <TICKETID>1158</TICKETID>
                    </INCIDENT>
                </INCIDENTMboKeySet>
            </CreateMXINCIDENTResponse>
            
            
            
        

Dependendo da operação a mensagem de retorno será diferente.

Para simplificar a forma de invocação deste cliente, optamos pelo métode de linha de comando, cuja responsabilidade de processamento é designada a class Invoker.

Os parâmetros esperados por essa classe estão de acordo com o seguinte padrão:

{create|update|delete|query} “Nome do Object Structure” “Nome do MBO”
“(atributo,operador,valor)” ... “(atributoN,operador,valorN)”

Exemplos:
Create MXINCIDENT INCIDENT “(description,=,server has failed)” (owner,=,maxadmin)
Update MXINCIDENT INCIDENT (ticketid,=,1137) (priority,=,1)
Query MXWO WO (WONUM,=,4351)

Sobre os demais componentes opensource utilizados (Log4J e Commons), os mesmos podem ser encontrados em quase todas as classes da aplicação.

Especificamente em Invoker.class é possível observar a instanciação do configurador do Log4J através da linha BasicConfigurator.configure();

Lembre-se que para utilizar o Log4J na configuração mais simples, os seguintes passos são necessários:

  1. utilizar o arquivo de configurações log4j.properties no classpath da aplicação;
  2. em cada classe, iniciar o logger com a seguinte instrução: static Logger logger = Logger.getLogger(<className>.class.getName()); ; onde <className> deve ser o nome da classe corrente;
  3. iniciar o configurador através da linha BasicConfigurator.configure(); na classe principal da aplicação (main);
  4. invocar o logger através de comandos como logger.info(), logger.debug(), entre outros.

Não se esqueça que o uso excessivo de log pode influenciar na performance da sua aplicação, portanto registre passagens importantes do seu código e use tipos de log apropriados (debug, info, warning, error) para cada necessidade.

Outro ponto importante do código que precisa ser considerado é o arquivo de propriedades de configuração da aplicação exemplo.


Listagem 3: mifclientconfig.properties
#set the maximo integration framework URL
            mxe.int.webappurl=http://localhost:7001/meaweb/os/

Os detalhes para a configuração da URL são descritos abaixo:

http://<host>:<port>/meaweb/os/<objectstructure_name>

onde:

  • host: nome da máquina onde o Maximo está instalado;
  • port: porta onde o serviço HTTP está respondendo;
  • objectstructure_name: Nome do object structure a ser acessado

Executando a aplicação exemplo

Para executar o exemplo fornecido neste artigo, é necessário importar o arquivo Zip anexado como um projeto Java do Eclipse. Seguem os passos para essa importação:


Figura 3 - Criar um novo projeto Java.


Figura 4 - Observar o JRE utilizado (1.6) e finalizar a criação do novo projeto.


Figura 5 - Selecionar o projeto recém-criado e iniciar importação.


Figura 6 - Selecionar o tipo Archive (Zip) como origem da importação.


Figura 7 - Localizar o arquivo zip do projeto java (devworks-mifcliente.zip) e finalizar.


Figura 8 - Confirmar a sobrescrita para todos os arquivos.


Figura 9 - Visão final do projeto após importação e resolução das dependências.

Para resolver os problemas de dependências, usar a seguinte tabela, que apresenta os componentes utilizados e as respectivas bibliotecas necessárias para a execução da aplicação exemplo. Estas bibliotecas estão disponíveis no site do Apache para download e uso, de acordo com as suas respectivas licenças.

Tabela de componentes e bibliotecas opensource

ComponenteBiblioteca
HttpClienthttpclient-4.0.3.jar
httpcore-4.0.1.jar
Log4Jlog4j-1.2.16.jar
Velocityvelocity-1.6.4.jar
Commonscommons-collections-3.2.1.jar
commons-configuration-1.6.jar
commons-lang-2.4.jar
commons-logging-1.1.jar

Finalizada a importação e a configuração das dependências (ver tabela de dependências), é possível executar o exemplo. Os passos para a execução estão descritos abaixo.


Figura 10 - Selecionar a classe Invoker e usar a opção “Run Configurations” do menu Run.


Figura 11 - Definindo os parâmetros do programa antes da execução

Selecionar a opção Java Application no menu lateral esquerdo da caixa de dialogo e então selecionar a tab “(x) = Arguments” na seção lateral direita. Incluir os argumentos do programa na caixa de texto “Program arguments” de acordo com as regras de linha de comando já comentadas neste artigo. Clicar no botão “Run”.


Figura 12 - Console apresentando envio e recebimento de mensagens.

Durante a execução a mensagem enviada e recebida serão apresentadas na tab Console. Assim como qualquer exceção ou informação complementar ao processamento.

Ao variar as operações suportadas e os objetos, será possível visualizar as diferenças entre parâmetros de envio como também o conteúdo retornado pelo Maximo. O ambiente do Maximo utilizado na criação da aplicação exemplo foi o MBS 7.1.1.7, porém é esperado compatibilidade com as plataformas superiores ao MBS 7.1.1.4.

Conclusão

Neste ponto do artigo é esperado que o leitor tenha adquirido um conhecimento básico da plataforma de integração Maximo e principalmente da facilidade de usar bibliotecas opensource para a construção de um cliente integrado com o MIF.

São sugeridos leituras e testes específicos para aprofundamento nas bibliotecas aqui apresentadas, como também na arquitetura de integração Maximo. Mais informações podem ser conseguidas nos sites disponibilizados na seção Links.

Alguns tópicos como segurança (autenticação e SSL), multi-tarefa, mensagens assíncronas e outros pontos da integração com o Maximo, não foram discutidos neste artigo para não aumentar a complexidade do mesmo e permitir um início coeso e aplicável.

Novos artigos virão para aumentar o conhecimento do leitor, como também explorar novos aspectos da integração do Maximo com sistema externos.

Recursos

- Maximo home page: http://www-947.ibm.com/support/entry/portal/Overview/Software/Tivoli/Maximo_Asset_Management
- Maximo Integration Guideline (pdf): http://www-947.ibm.com/support/entry/portal/Overview/Software/Tivoli/Maximo_Asset_Management
- Apache home page: http://www.apache.org/

Glossário

  • MIF: Maximo Integration Framework – Camada de integração da plataforma Maximo.
  • OS : Object Structure – aplicação que consolida objetos de negócios e relacionamentos a fim de expô-los como interfaces para sistemas externos.
  • MBO : Maximo Business Object – representa os componentes utilizados internamente pelo Maximo para operações de negócio.
  • MBS : Maximo Base Services – nome dado à plataforma genérica do Maximo onde customizações e soluções para indústria são desenvolvidos.


Download

DescriçãoNomeTamanhoMétodo de download
Maximo Integration Framework - Clientedevworks-mifcliente.zip20KBHTTP

Informações sobre métodos de download


Sobre o autor

author's photo

Leucir é Engenheiro de software do Laboratório de desenvolvimento Brasil e vem desempenhando papel de liderança em integrações do Maximo com diversas plataformas no mercado. Possue 13 anos de experiência no mercado de TI, todos eles voltados para a indústria de software. Ver Perfil no My developerWorks

Ajuda para Relatar Abuso

Relatar abuso

Obrigado. Esta entrada foi sinalizada para atenção do moderador.


Ajuda para Relatar Abuso

Relatar abuso

Falha no envio do Relatório de abuso. Tente novamente mais tarde.


developerWorks: Registre-se


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Selecione seu nome de exibição

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

(Deve possuir de 3 a 31 caracteres.)


Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Classificar este artigo

Comentários

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Tivoli
ArticleID=605286
ArticleTitle=Cliente MIF (Maximo Integration Framework) baseado em componentes Opensource
publish-date=12272010
author1-email=lmarin@br.ibm.com
author1-email-cc=