Governança SOA com Mule Galaxy parte 2: Maven e Spring

No post anterior contei sobre a importantancia da governança em uma adoção de SOA. Também comentei um pouco sobre o Mule Galaxy, uma solução open source para governança SOA em tempo de runtme. Neste post vou mostrar como registrar ativos no Mule Galaxy usando o plugin do maven que o Galaxy prove, além disso vou mostrar como recuperar as configurações do Spring Framework.

O que vamos fazer?

Criar um projeto no maven que consegue fazer deploy de ativos no Mule Galaxy usando o plugin de publicação do Galaxy para o Maven. Vamos criar um bean no spring e um arquivo de configuração deste bean para o Spring e também vamos registrar este bean como ativo no Galaxy bem como um WSDL de um webservice.



Instalando e Rodando o Mule Galaxy

Basta baixar o war do Galaxy e colocar no seu servidor de web, eu vou utilizar no Jetty, mas poderia se outro se você quizer por exemplo, você deve rodar a solução com JDK 6 update 10 ou superior para não ter problemas com XML.

Estou usando a versão 1.5.3 por que a versão 2.0 ainda não é release e esta no M6. Você pode usar esta versão se quizer, ele tem algumas funcionalidades novas, mas contém mais bugs e de certa forma a interface muda bastante, eu prefiro a versão 1.5.3;

Uma vez que você tenha baixado o mule e subido o seu servidor de aplicação você pode logar no solução, o usuário e senha padrão é admin admin. Quando você efetuar login vai ver uma tela parecida com a da figura a baixo:

Mule Galaxy

Vamos efetuar o deploy dos ativos usando maven, mas pelo console de administração você pode fazer deploy de ativos, ou até mesmo evoluir as versões dos ativos já existentes. Então vamos ao projeto do maven.

Estrutura do Pojeto


Este é um projeto padrão maven 2 no eclipse. Perceba que na pasta src/main/resources contem os seguintes arquivos:
  • 123.pom.properties
  • metadata-spring-beans.xml
  • UKBorderService.wsdl
Durante o deploy todos estes artefatos seram publicdos no mule, vamos ver as dependências e o script para deploy usando maven então:

<br /> <plugin><br />     <groupId>org.mule.galaxy</groupId><br />     <artifactId>galaxy-maven-publish-plugin</artifactId><br />     <version>1.0</version><br />     <configuration><br />      <url>http://localhost:8070/galaxy/api/registry/Default%20Workspace</url><br />      <username>admin</username><br />      <password>admin</password><br />      <!-- Publish shared artifacts --><br />      <includes><br />       <include>src/main/resources/*.xsd</include><br />       <include>src/main/resources/*.wsdl</include><br />       <include>src/main/resources/*.xml</include><br />       <include>src/main/resources/*.properties</include>      <br />      </includes><br />     </configuration><br />     <executions><br />      <execution><br />       <id>publish-artifacts</id><br />       <phase>package</phase><br />       <goals><br />        <goal>execute</goal><br />       </goals><br />      </execution><br />     </executions><br />    </plugin><br /> 

Como você pode ver estou passando o url do galaxy com a API de atom e usuário e senha, se você não quer deixar a senha fixa, você pode parametrizar usando o arquivo de settings.xml ou passar por parametros na hora de executar o mojo.

Outra coisa importante aqui são os includes, com eles você especifica quais artefatos devem ser publicados no Galaxy, estou consigurado para que o deploy aconteça automatico para os artefatos:
  • XSD
  • WSDL
  • XML
  • Properties
Você pode criar seu formato personalizado, isso é muito interessante. Na versão 1.5.3 do console você não pode fazer esta tarefa, na versão 2.0-M6 é possivel criar estes novos tipos pela interface web.

Ainda é possivel excluir artefatos, por que por padrão o galaxy vai publicar todos os jars da sua aplicação seja os gerados pelo maven ou das dependencias. Então caso esse comportamento não seja interessante para você é necessário colocar uma exclusão.

Para rodar o script e publicar os seus ativos no Mule Galaxy basta rodar no maven: $ mvn install
Você pode verificar se a publicação ocorreu com sucesso no proprio console do Galaxy, confira nas figuras a baixa o registro efetuado com sucesso.

Registro de ativos do Spring Framework

Perceba que o Mule já infoma para você quais os beans que estão no arquivo de configurações do spring, além disso você pode adicionar metadados ao ativo, estes metadados podem ser utilizados em futuras pesquisas no Galaxy.

Carregando a Configuração de Beans do Spring

O Galaxy tem um plugin de integração com o Spring, agora vamos ver isso em pratica, para mim esta é uma das melhores funcionalidades da solução. Por que assim você pode externalizar totalmente a configuração do spring e isso é bom por diversos motivos, mas o que é melhor é que você pode deinir um projeto com classes, interfaces e diversos padrões para metadados e reutilzar estas funcionalidades em diversos projetos através do mule galaxy.

Vamos ver um classe simples que criei, a idéia é que vou recuperar o arquivo do spring com as definições dessa classe que estaram registras no galaxy. Confira a classe a baixo:

<br>package com.blogspot.diegopacheco.mule.galaxy.metadata;<br><br>import java.util.Map;<br><br>/**<br> * POJO metadata for mule configuration loader.<br> * @author Diego Pacheco<br> * @version 1.0<br> * @since 14/03/2010<br> *<br> */<br>public class MetadataInfo {<br>    <br>    private String applicationID;<br>    private Map<String, Object> policies;<br>    <br>    public MetadataInfo() {}<br><br>    public String getApplicationID() {<br>        return applicationID;<br>    }<br><br>    public void setApplicationID(String applicationID) {<br>        this.applicationID = applicationID;<br>    }<br><br>    public Map<String, Object> getPolicies() {<br>        return policies;<br>    }<br><br>    public void setPolicies(Map<String, Object> policies) {<br>        this.policies = policies;<br>    }<br>    <br>    @Override<br>    public String toString() {<br>        return "ApplicationID: " + applicationID + ", Policies: " + policies;<br>    }<br>    <br>}    <br>

Perceba que é uma classe java normal, sem nada de mais, repare que o Galaxy gerencia os arquivos de configuração do spring, então na prática é apénas um arquivo xml, logo você pode fazer o que quizer, mas na horas de rodas sua aplicação, caso as injeções estiverem erradas ou você não tiver todas as classes vai ver um belo erro, entõ tenha certeza que esta com todas as dependencias setadas.

Vamos ver o arquivo de configuração do Spring que foi publicado no Galaxy.

<br><?xml version="1.0" encoding="UTF-8"?><br><beans xmlns="http://www.springframework.org/schema/beans"<br>    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br>    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><br><br>    <description>Spring Application Context</description><br><br>    <bean id="RootMeta"<br>        class="com.blogspot.diegopacheco.mule.galaxy.metadata.MetadataInfo"><br>        <property name="applicationID" value="app01" /><br>        <property name="policies"><br>            <map><br>                <entry><br>                    <key><value>pl01</value></key><br>                    <value>teste</value><br>                </entry><br>            </map><br>        </property><br>    </bean><br>    <bean id="RootMeta2"<br>        class="com.blogspot.diegopacheco.mule.galaxy.metadata.MetadataInfo"><br>        <property name="applicationID" value="app02" /><br>        <property name="policies"><br>            <map><br>                <entry><br>                    <key><value>pl02</value></key><br>                    <value>teste2</value><br>                </entry><br>            </map><br>        </property><br>    </bean><br></beans><br>

Agora podemos ver o código que carrega as informaçõe do spring que estão no Galaxy, vamos usar o plugin do spring para isso você precisa da seguinte dependencia do maven no seu pom.xml:

<br>        <dependency><br>            <groupId>org.mule.galaxy</groupId><br>            <artifactId>galaxy-integration-spring</artifactId><br>            <version>2.0-M6</version><br>        </dependency><br>

Confira também o código que acessa os dados do spring, na classe a baixo:

<br>package com.blogspot.diegopacheco.mule.galaxy.spring;<br><br>import java.net.URL;<br><br>import org.mule.galaxy.spring.GalaxyApplicationContext;<br>import org.springframework.context.ApplicationContext;<br><br>import com.blogspot.diegopacheco.mule.galaxy.metadata.MetadataInfo;<br><br>public class SpringRetriveMetadata {<br>    public static void main(String[] args) {<br>        try{<br>            String configURL = "http://admin:admin@localhost:8070/galaxy/api/registry?q=select artifact where spring.bean = 'RootMeta'";<br>            ApplicationContext ctx = new GalaxyApplicationContext(new URL(configURL));<br>            <br>            MetadataInfo to = (MetadataInfo)ctx.getBean("RootMeta");            <br>            System.out.println("Sprint CXT: " + ctx);<br>            System.out.println("Bean: " + to);<br>            <br>        }catch(Exception e){<br>            e.printStackTrace();<br>        }<br>    }<br>}<br>

Perceba que estou usando a GalaxyApplicationContext que é uma implementação do Mule Galaxy da interface ApplicationContext do Spring Framework. Também estou informando onde esta o galaxy através de uma URL e mais, estou fazendo um query no estilo SQL para pegar o bean do spring que me interessa.

Se você quizer os fontes complestos, pode baixar no meu repositório do Subversion aqui. No próximo post vou mostrar como criar uma policy personalizada e fazer o deploy desta policy no Mule Galaxy.

Abraços e Até a próxima.

Popular posts from this blog

Kafka Streams with Java 15

Rust and Java Interoperability

HMAC in Java