JBoss Fuse - Guia Rápido
Neste capítulo, começaremos com os fundamentos do Enterprise Service Bus. A seguir, é fornecida uma explicação detalhada sobre o ESB, juntamente com suas vantagens, desvantagens e alguns diagramas para facilitar o entendimento.
O que é ESB?
ESB significa Enterprise Service Bus. O ESB em sua forma mais simples é um middleware que atua como uma rodovia de informações, auxiliando a comunicação de vários aplicativos.
No mundo empresarial, desenvolvemos soluções para muitas coisas. Essas soluções podem usar diferentes tecnologias e diferentes formatos de dados. É complicado usar essas soluções juntas devido à variação de compatibilidade de comunicação ou formato de dados nessas tecnologias. Portanto, precisamos de uma tecnologia que permitaloosely coupled integration entre essas diferentes soluções.
O ESB visa simplificar esse problema de integração, tornando-se um 'HUB' que fica no meio de todos os seus aplicativos e facilita o roteamento de mensagens entre eles. O ESB atua como um mediador, atuando como uma auto-estrada de informações, cuidando do roteamento da transformação dos dados, deixando o Coder ou o Desenvolvedor se concentrar na lógica de sua própria aplicação.
Entender o ESB se torna muito simples quando entendemos o problema para o qual ele foi especialmente projetado e a solução se torna fácil. Deve-se ter uma compreensão clara de como habilitar muitos sistemas distintos, escritos em diferentes linguagens e rodando em diferentes máquinas usando diferentes formatos de dados para compartilhar informações e formar uma plataforma de negócios integrada.
O problema de integração
Na plataforma corporativa, é comum que vários aplicativos colaborem e forneçam funcionalidade de negócios como um todo, mas a integração desses aplicativos é o problema mais recorrente. Isso se torna ainda mais difícil com o tempo, conforme os aplicativos aumentam.
Cada aplicativo pode inserir e produzir dados em seu próprio formato. Essa abordagem funciona bem se o número de aplicativos for menor, mas conforme o número de aplicativos aumenta, as rodas de integração também precisam ser agitadas com uma abordagem melhor. Por exemplo, se um determinado aplicativo para um negócio precisa ser alterado, sua saída ou formato de dados de entrada para todos os aplicativos que dependem desse aplicativo Mestre são afetados.
Tal abordagem serve como o maior obstáculo para a integração, que espera uma arquitetura fortemente acoplada. É aqui que o ESB entra em cena. Cada aplicativo não precisa se comunicar diretamente com outro aplicativo; em vez disso, todos os aplicativos se comunicam com o ESB e o ESB lida com o roteamento de informações e a conversão do formato de dados interno.
Por que ESB?
A seguir estão alguns pontos que explicam por que o Enterprise Service Bus é essencial.
O ESB visa simplificar o problema de integração com aplicativos compatíveis com variantes.
Ele atua como um Middleware, que atua como mediador de todos os seus aplicativos e facilita o roteamento de mensagens entre eles.
Em vez de cada aplicativo interagir diretamente com todos os outros aplicativos, cada aplicativo agora tem apenas uma interface para o ESB.
O ESB é responsável por traduzir mensagens de / para um formato comum e encaminhá-las para seus destinos.
A principal economia nessa abordagem é uma bênção se você precisar substituir qualquer um dos aplicativos existentes. Em vez de escrever um monte de novas interfaces, agora você só tem uma interface com a qual se preocupar (entre seu aplicativo e o ESB).
SOA e ESB?
SOA e ESB são comumente usados de forma intercambiável, mas são completamente diferentes.
SOA é um padrão de design que permite que o aplicativo exponha suas funcionalidades como um serviço na rede por meio de protocolos de comunicação, enquanto o ESB é um modelo que facilita a comunicação entre sistemas distintos, mas o ESB pode ser usado como um backbone durante a implementação de SOA.
JBoss Fuse é uma solução ESB de código aberto da Redhat. É uma solução empresarial baseada no projeto da comunidade, Apache Servicemix.
Integração para Fusível
O JBoss Fuse é uma plataforma de integração leve e flexível que permite a integração rápida de aplicativos corporativos.
O Fuse foi inicialmente desenvolvido pela Progressive software Inc., que foi adquirida pela Redhat em 2012. JBoss Fuse 6.1.0.redhat-379 GA é uma versão estável do Fuse que pode ser baixada de seu site oficial.
Arquitetura
A Fuse combina várias tecnologias em um único produto.
Componentes
Apache CXF
Apache CXF é uma estrutura de desenvolvimento de serviços da web de código aberto que também oferece suporte ao desenvolvimento de serviços da web SOAP e Rest.
Apache Camel
Apache Camel é uma estrutura de integração baseada em EIP. Os padrões EIP ou Enterprise Integration são soluções identificadas para problemas recorrentes na Enterprise Integration. Uma solução de integração completa pode ser alcançada meteoricamente com combinações desses padrões predefinidos prontos para uso.
Ele permite escrever a lógica de roteamento em várias linguagens específicas de domínio como Java, Spring DSL e Scala etc.
Apache AMQ
Apache AMQ é um JMS que fornece um sistema de mensagens confiável de acordo com os padrões JMS. Ele não apenas suporta a especificação JMS, mas também fornece alguns recursos interessantes e úteis que não estão incluídos nas especificações JMS.
Apache Karaf
Apache Karaf é um contêiner OSGi leve que atua como tempo de execução para os artefatos. O Apache Karaf é de natureza mais dinâmica em comparação com o JVM. Ele permite instalar ou desinstalar módulos em tempo de execução. Todos os artefatos no Fuse são implantados no Karaf.
Tecido
O Fabric fornece uma maneira fácil de gerenciar implementações de artefatos em um ambiente grande e distribuído. Ele fornece gerenciamento centralizado para todas as instâncias de fusíveis múltiplas.
Instalando Fusível
Instalar o Fuse é bastante simples. Como outros produtos JBoss, o Fuse vem como um arquivo zip que pode ser extraído e, após algumas pequenas alterações na configuração, pode ser iniciado diretamente.
A instalação do fusível é um processo de quatro etapas -
Baixar
Baixe o Fuse 6.1.0 GA no link a seguir. http://www.jboss.org/
Descompactar
Como todos os outros produtos JBoss, o Fuse também é um zip independente de plataforma.
Descompacte o arquivo baixado no diretório de destino que você deseja que seja o diretório de instalação do Fuse. Escolha este diretório com sabedoria, pois ele deve permanecer o mesmo durante a vida útil da instância do Fuse.
Note - Embora o Fuse descompacte e inicie como outros produtos JBoss, não é recomendado mover a instalação do Fuse de um local para outro após a conclusão da instalação.
Configurar
Depois de descompactar o Fuse, você encontrará os seguintes diretórios dentro do diretório extraído -
- bin
- etc
- deploy
- lib
- licenses
- extras
- quickstarts
Dos quais usaremos apenas dois diretórios bin E etc.
Praticamente após extrair o Fuse, devemos ser capazes de iniciar o Fuse diretamente, mas isso iniciará o Fuse com todas as configurações padrão, o que não é aconselhável para ambiente de produção. É altamente recomendável fazer as seguintes alterações antes de iniciar o Fuse.
Definir variáveis de ambiente
Defina as seguintes variáveis de ambiente - JAVA_HOME
A variável deve apontar para o diretório de instalação java - M2_HOME
A variável deve apontar para o diretório de instalação do Maven - PATH
Defina a variável de caminho para incluir executáveis Java e Maven.
janelas
No Windows, as configurações podem ser feitas seguindo as instruções fornecidas abaixo -
Iniciar → Meu computador → Clique com o botão direito → Propriedades → Configurações avançadas do sistema → Variáveis de ambiente.
UNIX e clones
Para cada usuário, há um perfil bash no *nixsistemas operacionais. Podemos adicionar ou editar a variável de sistema existente, alterando este arquivo.
$ vi ~/.bash_proflle
Note- Quaisquer alterações neste arquivo são permanentes. É altamente recomendável fazer um backup do arquivo existente antes de alterar o original.
Configuração básica
Vamos discutir sobre a configuração básica do JBoss Fuse e para isso temos que começar com o seguinte comando Edit $FUSE_INSTALLATION_DIR/etc/
Dentro user.properties
#admin=admin,admin
Isso precisa ser alterado de acordo com o primeiro administrador com nome de usuário que desejamos, segundo administrador com senha, o terceiro pode ser mantido como está porque indica uma função e não se esqueça de remover #
Por exemplo - FuseAdmin = FusePAss, admin
Dentro System.properties
karafName = root
Isso indica o nome que você deseja dar à instância Karaf.
Podemos nomeá-lo como quisermos, como Cont1.
Certifique-se de que o nome fornecido seja um nome exclusivo e não esteja sendo usado por outra instância do Fuse.
Dentro org.ops4j.pax.web.cfg
Org.osgi.service.http.port = 8181
Esta propriedade indica a porta que deve ser usada para acessar a interface HAWTIO baseada em navegador fornecida pela Fuse
HAWTIO é uma interface de navegador embutida para Fuse que está disponível a partir de 6.0
Dentro org.ops4j.pax.url.mvn.cfg
org.ops4j.pax.url.mvn.localRepository = D: / repositório
Esta propriedade indica o caminho para localRepository de nosso Maven de onde o Fuse instalará seus artefatos.
org.ops4j.pax.url.mvn.settings = D: /Maven/conf/settings.xml
Esta propriedade indica settings.xml que o Fuse deve usar para obter artefatos do Maven.
Configurando o Maven
Maven é um pré-requisito para instalar o Fuse. Se você não sabe o que é maven, consulte
Maven é uma ferramenta construída usada para construir artefatos Fuse. O Fuse primeiro procura no repositório local Maven por artefatos quando emitimos o comando para instalar o artefato. Portanto, devemos informar ao Fuse onde o Maven está instalado e o caminho do repositório local do Maven.
Editar $ FUSE_INSTALLATION_DIR / etc /org.ops4j.paxurl.mvn.cfg
Atualize as duas propriedades a seguir -
- org.ops4j.pax.url.mvn.settings = $ M2_HOME / conf /settings.xml
- org.ops4j.pax.url.mvn.localRepository = $ local_repo
Note - Por favor mude $local_repo com o caminho real do seu repositório local mencionado em Mavens settings.xml.
Corre
Depois de fazer alterações básicas na configuração, podemos iniciar o Fuse. Todos os arquivos binários para trabalhar com o Fuse estão localizados em$FUSE_INSTALLATION_DIR.
Existem duas maneiras de iniciar o Fuse -
Usando ./fuse
Isso permitirá que você veja todo o progresso e os registros na mesma janela em que iniciou o Fuse.
Ele lhe dará o console Karaf no mesmo terminal mostrado abaixo.
Note- Isso iniciará o fusível no modo de console, o que significa que o processo do fusível também será interrompido quando o usuário fizer logout da sessão ou fechar o terminal, o que não é desejável no cenário de produção ou desenvolvimento. Este script deve ser usado apenas para depurar o Fuse.
Usando ./start
Isso não mostrará nenhum log na tela, nem mesmo o progresso, mas iniciará o Fuse em segundo plano e o serviço Fuse não será interrompido quando o usuário sair da sessão ou fechar o terminal.
No aplicativo do mundo real, esse tipo de comportamento é desejado. O fusível deve estar funcionando em segundo plano, mesmo se fecharmos o terminal.
Se você deseja se conectar ao Fuse rodando em segundo plano, você pode usar client script que está localizado na mesma pasta.
Você deve obter a exibição conforme mostrado na imagem a seguir.
Sair do script do cliente não interromperá o serviço Fuse. Isso simplesmente fechará o console do Fuse.
HAWTIO
O Fuse também fornece acesso GUI completo a ele usando FMC (console de gerenciamento do Fuse). Você pode encontrar a GUI no URL abaixohttp://localhost:8181.
Tudo o que fizemos executando comandos também pode ser feito acessando esta GUI baseada em navegador. É extremamente útil quando temos mais de um contêiner e estamos executando em um ambiente Fabric.
Neste capítulo, discutiremos sobre o Apache Karaf e por que ele é chamado de contêiner OSGi leve, juntamente com seus benefícios e outros recursos importantes.
O problema JVM
JVM ou Java virtual Machine não atua como uma máquina virtual real. Uma máquina que permitirá que você pare, inicie ou reinicie componentes em execução dentro dela instantaneamente. Às vezes, pode permitir implantações dinâmicas em nível de classe, mas não há como implantar ou cancelar a implantação de um componente de seu aplicativo em sua máquina virtual sem reiniciá-lo.
Para resolver esse problema e permitir a modularidade no aplicativo Java, o Fuse usa um runtime baseado em OSGi conhecido como Apache Karaf.
OSGi
A tecnologia OSGi é um conjunto de especificações que definem um sistema de componentes dinâmicos para java. Essas especificações permitem um modelo de desenvolvimento em que os aplicativos são (dinamicamente) compostos de muitos componentes diferentes (reutilizáveis).
Benefícios do OSGi
Reduced Complexity - O aplicativo é construído como componentes de colaboração que escondem seus detalhes de implementação uns dos outros, resultando em complexidade reduzida.
Reusability - Muitos componentes podem aproveitar o mesmo componente implantado em um contêiner.
Deployment - OSGi fornece suporte para iniciar, parar e atualizar os componentes em tempo real com suas APIs de gerenciamento de ciclo de vida sem reinicialização do contêiner.
Recursos do Bundles Vs
A seguir está a comparação entre bundles e recursos.
Pacotes
Os pacotes são equivalentes ao OSGi o que os jars são para a JVM. Pacotes configuráveis são artefatos que podem ser implementados em um contêiner OSGi. Os pacotes são componentes que funcionam juntos ou independentemente para formar um aplicativo.
Esses pacotes podem ser instalados, desinstalados, atualizados, iniciados ou interrompidos no tempo de execução sem reiniciar o contêiner.
Características
Os recursos são uma forma de implantar vários pacotes juntos. Às vezes, faz mais sentido implantar bundles em grupo. Os recursos nos permitem implantar um grupo de pacotes com apenas um comando.
Por que outro container?
Apache Karaf é um runtime baseado em OSGi, é onde nossos pacotes de aplicativos são executados. O Fuse usa o Apache Karaf como seu tempo de execução no qual os pacotes são executados e colaboram para fornecer funcionalidade de negócios.
Karaf é construído em Felix e equinox, que são Frameworks OSGi.
Arquitetura Karaf
O Apache Karaf adiciona as seguintes funcionalidades adicionais ao tempo de execução OSGi básico.
Hot Deployment
O Karaf oferece suporte à implantação dinâmica. Ele contém um diretório hot deploy. Tudo o que é colocado neste diretório é automaticamente implantado e instalado no Karaf como um pacote.
Exploração madeireira
O Karaf fornece registro centralizado, gerando registros para todos os pacotes em $Fuse_home/data/log. Podemos editar a configuração do logger emorg.ops4j.pax.logging.cfg dentro $Fuse_home/etc directory.
Admin console
Karaf fornece um console de administração sofisticado e lúcido para interagir com a instância em execução do fusível. Ele também fornece um conjunto pré-instalado de comandos que podem ser usados para gerenciar e monitorar componentes (Bundle) em tempo de execução. Este console é extensível, então nos permite adicionar novos comandos ao console, adicionando novos bundles ao console.
Acesso SSH
Karaf permite acesso remoto a este console de administração com SSH. Qualquer pessoa com credenciais válidas pode se conectar ao console de administração do karaf pelo terminal SSH.
Neste capítulo, discutiremos o que é o Apache Camel e como ele efetivamente roteia os dados entre os terminais, junto com alguns exemplos.
O que é Apache Camel?
Apache Camel é uma estrutura de integração de código aberto que foi iniciada no início de 2007.
É uma abordagem baseada em EIP (Enterprise Integration Pattern) que fornece várias implementações de padrões prontos para uso que podem ser usados para resolver problemas de integração corporativa. EIP nada mais são do que soluções comprovadas para problemas bem documentados e recorrentes na integração empresarial.
O Camel também é conhecido como mecanismo de roteamento e mediação, pois roteia efetivamente os dados entre os endpoints, ao mesmo tempo em que assume uma carga pesada como transformação de formatos de dados, conectividade de endpoint e muito mais.
Exemplo Básico
Os pré-requisitos para usar o Apache Camel são -
- Java
- Maven
- Redhat JBoss Fuse 6.1-GA-379
Crie o esqueleto básico do aplicativo
mvn:archetype generate –DgroupId = com.tutorialpoint.app –DartifactId = camel-first-app –DarchetypeGroupId = org.apache.camel.archetypes –DarchetypeArtifactId = camel-archetype-spring –DinteractiveMode = false -X
Isso deve gerar a seguinte estrutura de diretório.
Este é um esqueleto básico de nosso aplicativo Camel sendo gerado.
Editar camel-context.xml
Editar camel-first-app → src → main → resources → META-INF\spring\camel-context.xml para corresponder conforme abaixo
<?xml version = "1.0" encoding = "UTF-8"?> <!-- Configures the Camel Context--> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelContext xmlns = "http://camel.apache.org/schema/spring"> <!-- here is a sample which processes the input file (leaving them in place - see the 'noop' flag) then performs content based routing on the message using XPath --> <route> <from uri = "file:///d:/src/data?noop=false"/> <choice> <when> <xpath>/person/city = 'London'</xpath> <log message = "UK message"/> <to uri = "file:///d:/target/messages/uk"/> </when> <otherwise> <log message = "Other message"/> <to uri = "file:///d:/target/messages/others"/> </otherwise> </choice> </route> </camelContext> </beans>
Editar pom.xml
Adicione o seguinte código dentro de <plugins> </plugins>
<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.3.4</version> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName> ${project.artifactId} </Bundle-SymbolicName> <Import-Package>*</Import-Package> </instructions> </configuration> </plugin>
Alterar o tipo de embalagem de jar → bundle.
<packaging>bundle</packaging>
Construa o projeto usando o seguinte comando -
mvn clean install
Instale o projeto no fusível
Comece o fusível usando Fuse.bat/start.bat. Se você iniciar o Fuse usandostart.bat, usar client.batpara conectar ao Fuse. Você deve obter a IU conforme mostrado na captura de tela a seguir.
Esta é a CLI para acessar os comandos Karaf e Fuse.
install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT
Teste se o seu projeto está em execução
Agora seu aplicativo deve ser instalado no Fuse. Copie o diretório de dados para dentrocamel-first-app e coloque-o em D:/src/ e deve copiar a mensagem com city = London para D:/target/merssages/uk.
Coloque o arquivo de entrada em D:/src/data
Input
Message1.xml
<?xml version = "1.0" encoding = "UTF-8"?> <person user = "james"> <firstName>James</firstName> <lastName>Strachan</lastName> <city>London</city> </person>
Message2.xml
<?xml version = "1.0" encoding = "UTF-8"?> <person user = "hiram"> <firstName>Hiram</firstName> <lastName>Chirino</lastName> <city>Tampa</city> </person>
Output
Em D: / target / messages / uk
<?xml version = "1.0" encoding = "UTF-8"?> <person user = "james"> <firstName>James</firstName> <lastName>Strachan</lastName> <city>London</city> </person>
Em D: / target / messages / others
<?xml version = "1.0" encoding = "UTF-8"?> <person user = "hiram"> <firstName>Hiram</firstName> <lastName>Chirino</lastName> <city>Tampa</city> </person>
Neste capítulo, vamos entender os diferentes conceitos de camelo. Vamos começar dando um exemplo básico para entender os conceitos centrais para começar.
CamelContext
Cada aplicativo camelo terá pelo menos um CamelContext. Este é o lugar onde adicionamos rotas de camelos. É similar àApplicationContext da Primavera.
O contexto do camelo pode ser pensado como um contêiner que mantém todas as coisas juntas. Um contexto de camelo pode ter várias rotas dentro dele.
Rotas
CamelContext pode conter uma ou mais rotas. As rotas são a lógica de integração que define como os dados fluirão no contexto do camelo de um ponto final para outro.
Endpoint
Endpoint é o fim do canal através do qual o sistema pode enviar ou receber mensagens. É o que chamamos de destino ou fonte na linguagem da comunicação.
Componentes
Os componentes são pontos de extensão no Camel. Os componentes podem ser uma interface para tecnologia, formato de dados, transformadores, etc. Eles também podem atuar como uma fábrica para terminais.
EIP
EIP significa Enterprise Integration Pattern. Estas são soluções identificadas e bem conhecidas para um problema recorrente. Camel suporta a maioria dos padrões de integração empresarial.
Roteador baseado em conteúdo
Os padrões CBR nos permitem rotear os dados de acordo com o conteúdo do arquivo de entrada.
Este padrão é usado quando temos que rotear valores dependendo do conteúdo do corpo de entrada.
O exemplo a seguir irá ler dados de D:/data/inputdiretório. Após a leitura, ele verificará a tag de valor dentro da tag de dados. Se a tag de valor contémvalue1, será enviado para D:/value1, Se contiver value2, será enviado para D:/value2 e se nenhum desses dois, então será enviado a outros.
<CamelContext xmlns = "http://camel.apache.org/schema/spring"> <route> <from uri = "file:///D:/data/input"/> <choice> <when> <xpath>/data/value = 'value1'</xpath> <to uri = "file:///D:/value1"/> </when> <when> <xpath>/data/value = 'value2'</xpath> <to uri = "file:///D:/value2"/> </when> <otherwise> <to uri = "file:///D:/others "/> </otherwise> </choice> </route> </camelContext>
Input
D: /data/input/message1.xml
<data> <value>value1</value> </data>
D: /data/input/message2.xml
<data> <value>value2</value> </data>
Output
D: / valor1 /
<data> <value>value1</value> </data>
D: / valor2 /
<data> <value>value2</value> </data>
Divisor
Um padrão de divisão é usado para dividir os dados de entrada em partes menores.
Esse padrão é usado na maioria das vezes com grandes entradas de dados que precisam ser divididas em blocos, para que possam ser processados. Ele divide a entrada em fragmentos menores com base na string de token de entrada.
<CamelContext xmlns = "http://camel.apache.org/schema/spring"> <route> <from uri = "file:///D:/inbox"/> <split streaming = "true"> <tokenize token = "order" xml = "true"/> <to uri = "activemq:queue:order"/> </split> </route> </CamelContext>
Input
D: /inbox/message.xml
<order> <data> <value>value1</value> </data> </order> <order> <data> <value>value2</value> </data> </order> <order> <data> <value>value3</value> </data> </order>
Output
Se você verificar o AMQ, encontrará 3 mensagens postadas.
<order> <data> <value>value4</value> </data> </order>
Lista de destinatários
Um padrão de lista de destinatários é usado quando uma lista de destinatários precisa ser recuperada do próprio corpo da mensagem.
No exemplo a seguir, uma mensagem será enviada a todos os destinatários listados na tag do cliente como uma lista de strings separada por vírgulas.
<CamelContext xmlns = "http://camel.apache.org/schema/spring"> <route> <from uri = "jms:xmlOrders" /> <recipientList> <xpath>/order/customer</xpath> </recipientList> </route> </camelContext>
Outros EIPs
O Camel oferece suporte a quase todos os EIPs identificados. Alguns dos EIP comumente usados são mencionados abaixo.
Log - Para registrar a mensagem completa ou parte dela
Message Filter - Filtragem de conteúdo de mensagens
Re-Sequencer - Para obter todos os tokens em sequência
Wiretap - Para inspecionar mensagens de viagem
A lista completa de EIP e seu uso pode ser encontrada na documentação oficial da Camel http://camel.apache.org/eip.html
Tratamento de exceções em camelo
Using Error Handler - Esta é a maneira mais fácil de lidar com exceções no camelo.
Para usar isso, temos que configurar o bean de classe do manipulador de erro e fornecê-lo como referência para CamelContext errorHandlerRef atributo.
<bean id = "loggingErrorHandler" class = "org.apache.camel.builder.LoggingErrorHandler"> <property name = "logName" value = "mylogger.name"/> <property name = "level" value = "DEBUG"/> </bean> <camelContext errorHandlerRef = ” loggingErrorHandler” > … </camelContext>
Usando Try Catch Finalmente
Camel também suporta o estilo Java Try Catch Finally block para tratamento de erros.
Assim como o Java, ele tem os três blocos a seguir -
doTry bloco contém código que pode gerar exceção.
doCatch bloco contém código que precisa ser executado em caso de exceção.
doFinallybloco tem código que deve ser executado independentemente da exceção. Ele sempre será executado, não importa se a exceção foi levantada ou não.
Note- Mock é um componente de teste e não é recomendado para outros fins. É o componente no camel usado para teste, assim como o componente jMOck no desenvolvimento dirigido por teste.
<route> <from uri = "direct:start"/> <doTry> <process ref = "someProcesorThatmayFail"/> <to uri = "mock:result"/> <doCatch> <exception>java.io.IOException</exception> <exception>java.lang.IllegalStateException</exception> <to uri = "mock:catch"/> </doCatch> <doFinally> <to uri = "mock:finally"/> </doFinally> </doTry> </route>
No exemplo acima, podemos fornecer uma lista de exceções que precisam ser tratadas pelo bloco catch.
Implantando pacote no fusível
Comece o fusível usando Fuse.bat/start.bat.
Se você iniciar o Fuse usando start.bat, use client.bat para se conectar ao Fuse. Você deve obter a IU conforme mostrado na captura de tela a seguir.
Esta é a CLI para acessar os comandos Karaf e Fuse.
install –s mvn:group.id /artifact.id/version e.g. install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT
Neste capítulo, vamos discutir sobre o que é Apache CXF e como ele pode ser útil no desenvolvimento de SOAP e Rest Web Services.
O que é Apache CXF?
Apache CXF é uma estrutura de desenvolvimento de serviço da web que pode ser utilizada para desenvolver serviços da web SOAP e Rest. CXF é totalmente compatível comJAX-RS and JAX-Ws padrão.
É a estrutura de desenvolvimento de serviço da Web mais amplamente usada atualmente. O CXF aprendeu e aprimorou o Axis2, que agora está sendo gradualmente substituído pelo CXF.
CXF vs Axis2
CXF Axis2 Melhorias CXF é a estrutura mais usada a partir de agora.
Tem muitas melhorias em relação ao Axis2
O Axis2 está sendo gradualmente substituído pelo CXf.
Requer mais código em comparação com CXF
Código requerido CXF requer menos código em comparação com Axis2
Axis2 requer mais código comparativamente
Conformidade Padrão CSF é totalmente compatível com JAX-RS e JAX-WS
Axis2 não é totalmente compatível com JAX-RS e JAX-WS
Compatível com Spring sim
Não
Separação de front-ends Limpar a separação do front-end do código JAX-WS
Nenhuma separação limpa é fornecida
SABONETE
SOAP significa Simple Object Access Protocol. É um protocolo para troca de informações estruturadas em serviços da web entre dois sistemas. Ele se baseia principalmente em XML para estruturar dados e usa HTTP ou SMTP para negociação e transmissão de mensagens.
Existem duas abordagens para desenvolver serviços da web SOAP -
Code first - Nesta abordagem, WSDL é gerado a partir do código.
Contract first - Primeiro no contrato, o código é gerado a partir de WSDL.
Desenvolvimento SOAP usando CXF
Configurar Maven
Adicione o seguinte perfil ao seu settings.xml do Maven.
<profiles> <profile> <id>Jboss-Fuse</id> <activation> <activeByDefault>true</activeByDefault> </activation> <repositories> <repository> <id>fusesource</id> <url>http://repo.fusesource.com/nexus/content/groups/public/</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> </repositories> </profile> </profiles>
Criar esqueleto
mvn archetype:generate -DarchetypeGroupId = org.apache.servicemix.tooling -DarchetypeArtifactId = servicemix-cxf-code-first-osgi-bundle -DarchetypeVersion=2012.01.0.redhat-60024 -DgroupId = org.fusesource.example -DartifactId = cxf-basic -Dversion = 1.0-SNAPSHOT
Build Web Service Project.
mvn clean install
Install web-service into Fuse using the following command.
JBossFuse:[email protected]>install -s mvn:org.fusesource.example/cxf-basic/1.0-SNAPSH
Check if bundle has registered SOQP web-service
Abrir URL http://localhost:8181/cxf
O serviço da web deve ser listado da seguinte maneira.
Testing Web-Service
mvn -Pclient
INFO - Criação de serviço {http://ws.totorials.com/} PersonService da classe com.to
torials.ws.Person Invoking getPerson... getPerson._getPerson_personId = Guillaume getPerson._getPerson_ssn = 000-000-0000 getPerson._getPerson_name = Guillaume [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 30.668 s [INFO] Finished at: 2016-02-15T21:01:20+05:30 [INFO] Final Memory: 10M/37M [INFO] ------------------------------------------------------------------------
Para começar, REST significa Transferência de Estado Representacional. É uma forma de desenvolver serviços da Web com base em protocolo cliente-servidor sem estado, armazenável em cache, que é HTTP na maioria dos casos.
Os serviços da Web REST usam solicitações HTTP para postar, obter e excluir dados da rede.
Desenvolvimento REST usando CXF
Crie um projeto simples de início rápido Maven
mvn archetype:generate -DgroupId = com.tuts.abhinav -DartifactId = rest-service -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
Adicionar dependências
<dependency> <groupId>org.apache.servicemix.specs</groupId> <artifactId>org.apache.servicemix.specs.jsr311-api-1.1.1</artifactId> <version>1.9.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.servicemix</groupId> <artifactId>servicemix-http</artifactId> <version>2013.01</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency>
Adicionar instrução de construção
<build> <defaultGoal>install</defaultGoal> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifalctId>maven-bundle-plugin</artifactId> <version>2.3.4</version> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>rest-example-database-post-method </Bundle-SymbolicName> <Import-Package>* </Import-Package> </instructions> </configuration> </plugin> </plugins> </build>
Adicionar repositórios de plug-ins de fusíveis
<pluginRepositories> <pluginRepository> <id>fusesource.m2</id> <name>FuseSource Community Release Repository</name> <url>http://repo.fusesource.com/nexus/content/repositories/releases</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </pluginRepository> <pluginRepositories>
Adicionar Repositórios
<repositories> <repository> <id>fusesource.m2</id> <name>FuseSource Community Release Repository</name> <url>http://repo.fusesource.com/nexus/content/repositories/releases</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> <repository> <id>fusesource.ea</id> <name>FuseSource Community Early Access Release Repository</name> <url>http://repo.fusesource.com/nexus/content/groups/ea</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> </repositories>
Criar classe de serviço
Crie a classe UserService.java em com / tuts /
package com.tuts; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/UserService_1") public class UserService { @GET @Path("/get_data") @Produces(MediaType.APPLICATION_JSON) public String getUser() { String reponse = "This is standard response from REST"; return reponse; } }
Criar Blueprint.xml
Crie blueprint.xml em / src / main / resources / OSGI-INF / blueprint blueprint.xml
<?xml version = "1.0" encoding = "UTF-8"?> <blueprint xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs = "http://cxf.apache.org/blueprint/jaxrs" xsi:schemaLocation = "http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd"> <jaxrs:server id = "service" address = "/users"> <jaxrs:serviceBeans> <ref component-id = "userService" /> </jaxrs:serviceBeans> </jaxrs:server> <bean id = "userService" class = "com.tuts.UserService" /> </blueprint>
Instale o serviço Rest no Fuse
install -s mvn:com.tuts.abhinav/rest-service/1.0-SNAPSHOT
Verifique se o pacote tem um serviço da web registrado
Abrir URL http://localhost:8181/cxf
Serviço da Web de teste
Abrir URL http://localhost:8181/cxf/users12/UserService_1/get_data
Neste capítulo, conheceremos o ActiveMQ e como ele atua como um intermediário de mensagens para permitir que os aplicativos se comuniquem entre si.
O que é AMQ?
ActiveMQ é um agente de mensagens de código aberto escrito em Java. É totalmente compatível com os padrões JMS 1.1.
JMS é uma especificação que permite o desenvolvimento de sistema baseado em mensagem. O ActiveMQ atua como um intermediário de mensagens que fica entre os aplicativos e permite que eles se comuniquem de maneira assíncrona e confiável.
Tipos de mensagens
Existem dois tipos de opções de mensagens explicadas abaixo para uma melhor compreensão.
Ponto a ponto
Nesse tipo de comunicação, o broker envia mensagens para apenas um consumidor, enquanto os demais consumidores aguardam até receberem as mensagens do broker. Nenhum consumidor receberá a mesma mensagem.
Se não houver consumidores, o Broker reterá as mensagens até chegar a um consumidor. Este tipo de comunicação também é chamado deQueue based communicationonde o produtor envia mensagens para uma fila e apenas um consumidor recebe uma mensagem da fila. Se houver mais de um consumidor, eles podem receber a próxima mensagem, mas não receberão a mesma mensagem do outro consumidor.
Publicar / Assinar
Nesse tipo de comunicação, o Broker envia a mesma cópia das mensagens para todos os consumidores ativos. Este tipo de comunicação também é conhecido comoTopic based communicationonde o corretor envia a mesma mensagem para todos os consumidores ativos que se inscreveram em um determinado Tópico. Este modelo suporta comunicação unilateral onde nenhuma verificação de mensagens transmitidas é esperada.
Criação de fila e tópicos
Fuse vem junto com ActiveMQ. Podemos acessar o ActiveMQ usando o console FMC (a interface baseada em navegador para trabalhar com AMQ).
Faça login no FMC usando localhost:8181 e selecione ActiveMQ aba.
- Clique em + Criar
- Insira o nome da fila / tópico
- Selecione Fila / Tópico no botão de opção
- Clique em Criar fila / Criar tópico
Agora você deve ser capaz de ver o TestQ criado na raiz → Fila →
Para verificar o tópico criado, siga root → Tópico.
Navegação / exclusão de conteúdo da fila
Faça login no FMC usando localhost:8181
Selecione a guia ActiveMQ
Raiz → Fila → TestQ <selecione a fila que deseja navegar> → Navegar
- Para verificar o conteúdo desta mensagem, clique na mensagem em particular.
Você pode excluir uma mensagem em particular clicando no botão Excluir mostrado no canto superior direito
Neste capítulo, aprenderemos o básico de como o ActiveMQ funciona com o Camel.
Configurando para o componente ActiveMQ
Antes de podermos usar a fila ou tópico ActiveMQ em nosso código, temos que configurar ActiveMQComponent. A configuração mínima de ActiveMQComponent pode ser feita conforme mostrado no programa a seguir -
<bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent"> <property name = "brokerURL" value = "tcp://localhost:61616"/> <property name = "userName" value = "admin"/> <property name = "password" value = "admin"/> </bean>
brokerURL - Especifica o host e a porta para AMQ Broker.
username - Especifica o nome de usuário a ser usado para se conectar ao AMQ Broker.
password - especifica a senha para se conectar ao AMQ Broker.
Conectando à fila
Agora que configuramos ActiveMQComponent, podemos usá-lo em nosso CamelContext como terminal.
Usaremos o endpoint AMQ no seguinte formato -
Activemq:[queue|topic]:[queueName|topicName]
Escrevendo mensagens para AMQ
<?xml version = "1.0" encoding="UTF-8"?> <!-- Configures the Camel Context--> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
Depois de implantar este pacote no contêiner Fuse, você deve ser capaz de ver as mensagens postadas no AMQ que foram colocadas como arquivos no D:/src/data.
Input
D: /src/data/input.txt
Test me
Output
Lendo do AMQ
<?xml version = "1.0" encoding = "UTF-8"?> <!-- Configures the Camel Context--> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelContext xmlns = "http://camel.apache.org/schema/spring"> <!-- here is a sample which processes the input files (leaving them in place - see the 'noop' flag) then performs content based routing on the message using XPath --> <route> <from uri = "activemq:queue:TestQ"/> <to uri = "file:///d:/src"/> </route> </camelContext> <bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent"> <property name = "brokerURL" value = "tcp://localhost:61616"/> <property name = "userName" value = "admin"/> <property name = "password" value = "admin"/> </bean> </beans>
Input
Depois de implantar este pacote, você deve ver um arquivo sendo gerado em D: / src e as mensagens são consumidas. Consumidor também deve ser mostrado para essa fila.
Output
D: / src
Test me
Escrevendo para o Tópico
<?xml version = "1.0" encoding = "UTF-8"?> <!-- Configures the Camel Context--> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelContext xmlns = "http://camel.apache.org/schema/spring"> <!-- here is a sample which processes the input files (leaving them in place - see the 'noop' flag) then performs content based routing on the message using XPath --> <route> <from uri = "file:///d:/src"/> <to uri = "activemq:topic:TestTopic” /> </route> </camelContext> <bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent"> <property name = "brokerURL" value = "tcp://localhost:61616"/> <property name = "userName" value = "admin"/> <property name = "password" value = "admin"/> </bean> </beans>
Lendo do Tópico
<?xml version = "1.0" encoding = "UTF-8"?>
<!-- Configures the Camel Context-->
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext xmlns = "http://camel.apache.org/schema/spring">
<!-- here is a sample which processes the input files
(leaving them in place - see the 'noop' flag)
then performs content based routing on the message using XPath -->
<route>
<from uri = "activemq:topic:TestTopic"/>
<to uri = "file:///d:/src2"/>
</route>
</camelContext>
<bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent">
<property name = "brokerURL" value="tcp://localhost:61616"/>
<property name = "userName" value = "admin"/>
<property name = "password" value = "admin"/>
</bean>
</beans>
Input
D: /src/file1.xml
<order>
<data>
<value>value1</value>
</data>
</order>
<order>
<data>
<value>value2</value>
</data>
</order>
<order>
<data>
<value>value3</value>
</data>
</order>
Output
D: / src /
<order>
<data>
<value>value1</value>
</data>
</order>
<order>
<data>
<value>value2</value>
</data>
</order>
<order>
<data>
<value>value3</value>
</data>
</order>
O que é tecido?
O Fabric fornece recursos de gerenciamento e orquestração para várias instâncias do Fuse. O Fabric nos permite controlar todas as instâncias do Fuse conectadas a ele a partir de um único ponto. Um recipiente de fusível normal pode ser convertido para atuar como um tecido. O Fabric tem registro de malha nele que serve como armazenamento de dados que contém todas as informações sobre contêineres, ele gerencia.
Por que fabricar?
O tecido possui as seguintes habilidades especiais, o que o torna um candidato ideal para uso em ambientes distribuídos.
- Monitorar o estado de todos os contêineres da malha.
- Iniciando e parando containers remotos.
- Provê um contêiner remoto para executar um aplicativo específico.
- Atualizando aplicativos e implementando patches no sistema ativo.
- Iniciar e provisionar com novos contêineres rapidamente, por exemplo, para lidar com o aumento da carga no sistema.
Configuração de tecido
Criando Tecido
O recipiente de fusível normal pode ser convertido em tecido usando o seguinte comando
fabric: create --clean --zookeeper-password myZooPass
Conectando outro contêiner ao Fabric -
fabric:join --zookeeper-password myZooPass <fabric_host>:2181 Cont1
Note - Substitua <fabric_host> pelo nome do host real no qual a malha está em execução.
Ao fazer login no Fuse Management Console a partir do seu navegador usando localhost:8181, você deve ser capaz de ver dois contêineres, conforme mostrado na captura de tela a seguir. O contêiner de tecido é indicado por um pequeno símbolo de nuvem na frente dele.
Perfis
Um perfil contém as seguintes informações -
- Pacotes a serem instalados
- Recursos a serem instalados
- Configurações a serem aplicadas
Um Perfil fornece uma maneira no ambiente de malha para instalar o mesmo conjunto de pacotes, recursos e configuração em vários servidores.
Se o mesmo perfil for aplicado a vários contêineres e fizermos alterações nesse perfil de qualquer contêiner, mudanças semelhantes serão implantadas automaticamente nos contêineres restantes aos quais ele é aplicado.
Criação de perfis
Faça login no FMC localhost:8181
Tempo de execução → Gerenciar
No lado esquerdo, no menu Perfil, clique em +
Digite o nome que deseja dar ao perfil e clique em criar.
Depois disso, o perfil deve ser criado.
Aplicando Perfil ao Contêiner
Tempo de execução → Containers → root (selecione o contêiner que você deseja)
Clique Addque levará a uma caixa pop-up. Procure o perfil que deseja e clique novamenteAdd.
O perfil deve ser mostrado na lista conforme mostrado na imagem a seguir.
Implantando um pacote
Para implantar um pacote, use o seguinte caminho -
Tempo de execução → Containers → root (selecione o contêiner que você deseja) → First_profile (selecione o perfil)
Clique na guia Bundles. Defina o caminho do pacote no seguinte formato e clique em+.
mvn:group.id/artifact.id/version
Por exemplo: mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT
Um pacote será adicionado ao perfil e implantado em todos os containers aos quais o perfil foi atribuído.
Desdobrando um pacote
Para desinstalar um pacote, use o seguinte caminho -
Tempo de execução → Containers → root (selecione o contêiner que você deseja) → First_profile (selecione o perfil)
Clique na guia Pacotes e pesquise o pacote que deseja excluir e clique em X. O pacote será excluído de todos os containers aos quais o perfil é aplicado.
Um contêiner filho fornece a maneira mais fácil de gerenciar a carga crescente. Quando o sistema está passando por uma carga repentina no tráfego e um único contêiner não é capaz de lidar com a carga, podemos criar facilmente um conjunto de contêineres filho e distribuir a carga entre eles, em vez de criar um novo contêiner completo.
Criação de um contêiner filho
Faça login no FMC usando localhost:8181
Agora, siga o caminho: Runtime → container → + Create (botão à direita)
Insira detalhes como nome do filho, número de contêiner pai de instâncias etc.
Clique Create And Start Container
Gerenciando um contêiner filho
Um contêiner filho atua apenas como um contêiner normal.
Parando um contêiner filho
Para interromper um contêiner filho, siga o caminho: Tempo de execução → Contêiner → Filho1
Clique em Parar para parar o recipiente filho.
Iniciando um contêiner filho
Para iniciar um container filho, siga o caminho: Runtime → Container → Child1
Clique em Iniciar para iniciar o contêiner filho.
Neste capítulo, discutiremos alguns problemas conhecidos que você pode encontrar ao trabalhar com o Fuse. Também discutiremos como você pode superar esses problemas.
Mudanças de código não são refletidas
Conecte-se à instância do Fuse usando um script de cliente. Pesquise o pacote para o qual você está enfrentando um problema, usando o seguinte comando.
JBossFuse:[email protected] > list|grep <Bundle Description>
For Example:
JBossFuse:[email protected] > list|grep Camel
[ 255] [Active ] [ ] [ ] [ 60] Fabric8 :: Camel Component (1.0.0.redhat-379)
[ 266] [Active ] [ ] [Started] [ 60] A Camel Spring Route (1.0.0.SNAPSHOT)
Note - ID do pacote para o pacote da saída do comando acima e use o comando abaixo.
JBossFuse:[email protected] > update <bundle id>
JBossFuse:[email protected] > update 266
O pacote não está sendo baixado
Isso pode acontecer pelos dois motivos a seguir -
- Repositório Maven não especificado
- Pacote não presente no repositório
Repositório Maven não especificado
Maven é uma ferramenta construída usada para construir artefatos Fuse. O Fuse primeiro procura no repositório local Maven por artefatos, quando emitimos o comando para instalar o artefato. Portanto, devemos informar ao Fuse onde o Maven está instalado e o caminho do repositório local do Mavens.
Editar $ FUSE_INSTALLATION_DIR / etc /org.ops4j.paxurl.mvn.cfg
Atualize as duas propriedades a seguir -
- org.ops4j.pax.url.mvn.settings = $ M2_HOME / conf /settings.xml
- org.ops4j.pax.url.mvn.localRepository = $ local_repo
Note - Altere $ local_repo com o caminho real do seu repositório local mencionado em Mavens settings.xml
Pacote não presente no repositório
Se as configurações do Maven estiverem em vigor, mas ainda se você enfrentar problemas ao baixar o pacote, certifique-se de que os pacotes JAR está presente no local correto no Repositório Maven.
Por exemplo, se o pacote a seguir está gerando erros durante o download -
mvn:com.tutorialpoint.app/camel-first-app/1.0-SNAPSHOT
Temos que verificar em $ M2_REPO / com / tutorialpoint / app / camel-first-app / 1.0-SNAPSHOT se o JAR real está presente.
Note - $ M2_REPO precisa ser substituído pelo caminho real do repositório Maven que configuramos o Fuse para usar.
Incapaz de fazer login no FMC (GUI baseada em navegador)
Users not Created - Se você está recebendo a seguinte IU, mas não consegue fazer o login com uma mensagem dizendo “Falha ao fazer login, proibido”.
Verifique se você adicionou usuários em $FUSE_INSTALLATION_HOME/etc/users.properties
O formato correto para adicionar usuários é -
Username = Password,Role
A porta HAWTIO é diferente
Se você nem mesmo conseguir obter a IU em localhost: 8181 no navegador, verifique se mencionou a porta correta no URL.
$FUSE_INSTALLATION_HOME/etc/org.ops4j.pax.web.cfg
Edite a seguinte propriedade no arquivo para usar a porta que você deseja acessar.
org.osgi.service.http.port=8181
AMQ Broker não está funcionando
Certifique-se de que a porta 61616 esteja aberta e não esteja sendo usada por outra porta. Se você deseja alterar a porta 61616 padrão para a mesma, você pode editá-la em$FUSE_INSTALLATION_HOME/etc/System.properties
activemq.port = 61616