<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bruno Pereira &#187; web services</title>
	<atom:link href="http://brunopereira.org/tag/web-services/feed/" rel="self" type="application/rss+xml" />
	<link>http://brunopereira.org</link>
	<description>Open source, Java, web, python, client-side e outros hobbies :)</description>
	<lastBuildDate>Thu, 20 Oct 2011 00:47:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>I&#8217;m a SlideShare RockStar!</title>
		<link>http://brunopereira.org/2009/04/01/im-a-slideshare-rockstar/</link>
		<comments>http://brunopereira.org/2009/04/01/im-a-slideshare-rockstar/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 12:57:13 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[posts em português]]></category>
		<category><![CDATA[#bestofslideshare]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[slideshare]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[web services rest]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=304</guid>
		<description><![CDATA[Recebi hoje de manhã um e-mail do SlideShare me falando que eu sou um RockStar!  
&#8220;Hi blpsilva,
We&#8217;ve noticed that your slideshow on SlideShare has been getting a LOT of views in the last 24 hours. Great job &#8230; you must be doing something right.  
Why don&#8217;t you tweet or blog this? Use the [...]]]></description>
			<content:encoded><![CDATA[<p>Recebi hoje de manhã um e-mail do SlideShare me falando que eu sou um RockStar! <img src='http://brunopereira.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>&#8220;Hi blpsilva,</p>
<p>We&#8217;ve noticed that your slideshow on SlideShare has been getting a LOT of views in the last 24 hours. Great job &#8230; you must be doing something right. <img src='http://brunopereira.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Why don&#8217;t you tweet or blog this? Use the hashtag #bestofslideshare so we can track the conversation.&#8221;</em></p>
<p>A única apresentação que coloquei até hoje foi a de <a href="http://www.slideshare.net/blpsilva/web-services-rest-presentation" target="_blank">Web Service REST</a>, logo após <a href="http://brunopereira.org/2008/09/20/aniversario-do-cejug-retrospectiva/" target="_blank">o aniversário do CEJUG ano passado</a>. Acessei minha conta lá e vi que a apresentação lá passou de 30 mil visualizações, em 6 meses. Eu não imaginava que isso pudesse ter um alcance tão grande, fiquei bem contente. Seems like I&#8217;m doing something right <img src='http://brunopereira.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Preciso em algum momento preparar mesmo um <a href="http://brunopereira.org/2008/05/30/curso-de-web-services-rest/" target="_blank">curso de Web Services</a>, incluindo REST e WS-*, já que o interesse nisso parece grande, e eu venho acumulando muita experiência nessa área.</p>
<p>Uma idéia que tive um tempo atrás seria de discutir aqui no blog algumas dúvidas sobre como utilizar REST e Web Services de forma efetiva em situações reais. Eu já conversei com muitas pessoas sobre isso, e algumas dúvidas são freqüentes, e outras são mais sofisticadas e diferentes. Eu terei um enorme prazer em discutir isso aqui, pois me trará situações novas para analisar e é um exercício interessante que pode contribuir para mim e para outras pessoas que estejam trabalhando na área.</p>
<p>Vou saborear meu momento de RockStar do SlideShare então, e incentivo a todos que queiram propôr discussões sobre REST (e web services em geral) que entre em contato para vermos o que surge de interessante <img src='http://brunopereira.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2009/04/01/im-a-slideshare-rockstar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Migrando para REST: exposição de Recursos x exposição do domínio</title>
		<link>http://brunopereira.org/2009/03/22/migrando-para-rest-exposicao-de-recursos-x-exposicao-do-dominio/</link>
		<comments>http://brunopereira.org/2009/03/22/migrando-para-rest-exposicao-de-recursos-x-exposicao-do-dominio/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 23:30:15 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[posts em português]]></category>
		<category><![CDATA[acoplamento]]></category>
		<category><![CDATA[business service]]></category>
		<category><![CDATA[orchestration]]></category>
		<category><![CDATA[orquestração]]></category>
		<category><![CDATA[proxy service]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=299</guid>
		<description><![CDATA[Meus camaradas do ISP da Globo estão estudando a migração da arquitetura imperativa com EJBs para uma arquitetura RESTFul.
Esta migração tem muitos aspectos semelhantes à que fizemos no time de cadastro/autenticação no ano passado, e eu já conversei algumas vezes com o pessoal do ISP sobre isso, pois conheço bem o domínio deles. Entretanto, o [...]]]></description>
			<content:encoded><![CDATA[<p>Meus camaradas do <a href="http://atendimento.globo.com/Portal/ISP/assineja/panfletos/panfleto_home_globo" target="_blank">ISP</a> da <a href="http://www.globo.com" target="_blank">Globo</a> estão estudando a migração da <a href="http://brunopereira.org/webservicesrest-arquitetura/" target="_blank">arquitetura imperativa</a> com EJBs para uma <a href="http://brunopereira.org/webservicesrest-arquitetura/" target="_blank">arquitetura RESTFul</a>.</p>
<p>Esta migração tem muitos aspectos semelhantes à que fizemos no time de <a href="http://cadastro.globo.com/cadastro/1727" target="_blank">cadastro</a>/<a href="http://login.globo.com/login/1" target="_blank">autenticação</a> no ano passado, e eu já conversei algumas vezes com o pessoal do ISP sobre isso, pois conheço bem o domínio deles. Entretanto, o domínio do ISP é um pouco mais complexo que o do cadastro, e isso torna a modelagem de recursos um pouco mais sofisticada e interessante.</p>
<p>O exemplo que vou descrever aqui é o do <strong><a href="http://en.wikipedia.org/wiki/Command_pattern" target="_blank">Comando</a></strong> CmdFinalizaCompra. Este <strong>Comando</strong> é invocado no final de qualquer operação do ISP que modifique a cesta de produtos/serviços do assinante. Pelo próprio nome, fica óbvio que ele foi constituído de maneira imperativa (&#8220;FazerEstaOperacao&#8221;), e o pessoal estava em dúvida sobre como redesenhar este modelo e colocá-lo num desenho declarativo, à maneira RESTFul.</p>
<p>Vou mencionar resumidamente a estrutura de comunicação dos comandos do ISP para que o resto da discussão fique claro. Cada <strong>Comando</strong> é constituído de 2 classes Java. <em><strong>CmdNomeComando</strong></em> e <em><strong>CmdNomeComandoSrv</strong></em>. A primeira classe corresponde ao Comando do lado do cliente, e a segunda corresponde ao Comando do lado do servidor.</p>
<p>Na execução do comando, o cliente invoca um EJB 2.1 stateless no servidor, e envia a classe <em><strong>CmdNomeComando</strong></em> serializada, via RMI. O servidor recebe a classe, deserializa-a, executa a operação em questão e retorna a classe novamente para o cliente, com ou sem modificações, dependendo do caso.</p>
<p>Este modelo é semelhante à chamada de serviços SOAP, em que é invocada uma operação SOAP com um documento XML de entrada e alguma coisa na saída.</p>
<p>Podemos ver a classe <em><strong>CmdNomeComando</strong></em> como o &#8220;parâmetro de entrada&#8221; da operação, e a classe <em><strong>CmdNomeComandoSrv</strong></em> como a implementação da operação em questão. Este exemplo do CmdFinalizaCompra envolve vários componentes do modelo do ISP. Não sei dos detalhes de cabeça, mas este processo envolve Assinante, Usuario, Produto, Promocao, Desconto e possivelmente mais alguns elementos do domínio.</p>
<p>Assim, um objeto CmdFinalizaCompra é composto de vários objetos deste domínio. A dúvida deles é sobre a definição dos recursos neste contexto. É uma dúvida pertinente, pois isto foge bastante a um CRUD óbvio. Uma <em><strong>possibilidade</strong></em> de desenho definiria como recursos: <strong>Assinante</strong>, <strong>Usuario</strong>, <strong>Produto</strong>, <strong>Promocao</strong> e <strong>Desconto</strong>. Isto seria mapeável diretamente na implementação do domínio deles. O que vocês acham disso?</p>
<p>Bom, não vejo nada errado em expor um recurso Assinante, outro Usuario, etc. Isto pode fazer sentido para outras &#8220;operações&#8221;, maravilha. Entretanto, para este caso isso levantou a seguinte dúvida para eles: &#8220;<em><strong>Eu vou ter que fazer vários POSTs para realizar a operação do CmdFinalizaCompra</strong></em>&#8221; ?</p>
<p>Imagine a complexidade de garantir o sucesso transacional dos vários POSTs independentes que compõem esta operação! No universo WS-* existe o conceito chamado <a href="http://en.wikipedia.org/wiki/Orchestration_(computers)" target="_blank">Orquestração</a>, no qual um determinado componente agrega e invoca várias operações pequenas em uma única operação/transação. Utilizando nomes pomposos, isto seria um <em><strong>Proxy Service</strong></em> invocando alguns <em><strong>Business Services</strong></em>. Algum de vocês se sente tentado a usar esta abordagem? Eu não!</p>
<p>O que eu sugiro neste exemplo é a criação de um recurso chamado <strong>Compra</strong>, que pode ser representado por um grafo sofisticado de objetos do domínio do ISP. Para substituir o CmdFinalizaCompra, eu vejo a criação de uma instância do recurso Compra, com todas as informações pertinentes à compra em questão. A criação deste recurso estaria associada a uma única transação, seja lá o que tenha que ser feito por baixo dos panos no servidor.</p>
<p>Na implementação do servidor, eu vejo somente este POST sendo realizado. <span style="color: #ff0000;"><strong>O cliente não precisa saber (e é melhor que não saiba) como é implementado o domínio no servidor</strong></span>. Ele precisa conhecer os <strong>recursos expostos</strong>, e como interagir com eles.</p>
<p>Pense numa compra na Amazon, por exemplo. Eles poderiam expôr este mesmo recurso Compra que eu falei, que seria composto pelos produtos, pelo cliente e talvez a opção de pagamento.</p>
<p>Isso seria exposto pelo recurso, mas dentro da Amazon uma compra poderia envolver N operações: reserva de estoque, criação de ordem de entrega, lançamento da cobrança, criação de comissão para o distribuidor, etc. O cliente do Recurso só conhece os detalhes do que foi exposto, e isso não implica em detalhes de implementação no servidor.</p>
<p>Lembrem que um dos principais objetivos para uma arquitetura RESTFul é ter baixo acoplamento, então tenham a liberdade de modelar seu domínio e seus recursos como fizer mais sentido.</p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2009/03/22/migrando-para-rest-exposicao-de-recursos-x-exposicao-do-dominio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>À procura de uma maneira produtiva de trabalhar com web services SOAP</title>
		<link>http://brunopereira.org/2008/12/08/a-procura-de-uma-maneira-produtiva-de-trabalhar-com-web-services-soap/</link>
		<comments>http://brunopereira.org/2008/12/08/a-procura-de-uma-maneira-produtiva-de-trabalhar-com-web-services-soap/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 00:28:03 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[posts em português]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[apache cxf]]></category>
		<category><![CDATA[aqualogic]]></category>
		<category><![CDATA[axis]]></category>
		<category><![CDATA[axis 2]]></category>
		<category><![CDATA[bea]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[metro]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[Sun]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[wsdl]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=262</guid>
		<description><![CDATA[Com a minha mudança de alocação da Globo.com para a Globosat, continuo trabalhando bastante com integração de aplicações, mas agora com um ferramental e paradigmas diferentes.
Na Globo.com eu trabalhei muito com open source, e estava acostumado a montar as aplicações a partir de componentes &#8220;crus&#8221;, em vez de usar ferramentas sofisticadas. Open source faz parte [...]]]></description>
			<content:encoded><![CDATA[<p>Com a minha <a href="http://brunopereira.org/2008/11/28/adeus-globocom-foi-um-grande-prazer/" target="_blank">mudança de alocação</a> da <a href="http://www.globo.com" target="_blank">Globo.com</a> para a <a href="http://globosat.globo.com/" target="_blank">Globosat</a>, continuo trabalhando bastante com integração de aplicações, mas agora com um ferramental e paradigmas diferentes.</p>
<p>Na Globo.com eu trabalhei muito com open source, e estava acostumado a montar as aplicações a partir de componentes &#8220;crus&#8221;, em vez de usar ferramentas sofisticadas. Open source faz parte da cultura da empresa, e tínhamos uma boa liberdade de escolha de tecnologias e arquiteturas.</p>
<p>Como falei algumas vezes no passado, nós migramos boa parte da arquitetura legada com EJBs para serviços <a href="http://brunopereira.org/tag/rest/" target="_blank">REST</a> usando por baixo o <a href="https://jersey.dev.java.net/" target="_blank">Jersey</a>, <a href="http://www.springframework.org/" target="_blank">Spring</a> e <a href="http://ibatis.apache.org/" target="_blank">Ibatis</a>. A produtividade no desenvolvimento de serviços REST me agrada muito, e mesmo alguém que não conheça muito de serviços REST consegue desenvolver um serviço sem tanto esforço.</p>
<p>Agora vou trabalhar mais com serviços SOAP, mas usando ferramentas muito produtivas, como o <a href="http://www.bea.com/framework.jsp?CNT=index.htm&amp;FP=/content/products/aqualogic/service_bus/" target="_blank">Aqualogic ESB</a> e o <a href="http://www.bea.com/framework.jsp?CNT=index.htm&amp;FP=/content/products/weblogic/workshop/" target="_blank">Workshop</a>, entre outros. Essas ferramentas facilitam muito o trabalho oferecendo <a href="http://brunopereira.org/2008/12/04/abstracoes-transparentes-e-abstracoes-opacas/" target="_blank">Abstrações Opacas</a>. Como ainda estou muito ligado ao trabalho com Open Source, eu venho tentando no meu tempo vago encontrar ferramentas open source com a mesma proposta.</p>
<p>Neste momento estou tentando encontrar a maneira mais produtiva de se trabalhar com web services SOAP usando open source. No passado eu desenvolvi serviços com o <a href="http://xfire.codehaus.org/" target="_blank">XFire</a>, com o <a href="http://ws.apache.org/axis2/" target="_blank">Axis 2</a> e com o <a href="https://jax-ws.dev.java.net/" target="_blank">JAX-WS</a>, mas achei interessante reavaliar as opções existentes atualmente.</p>
<p>Nos últimos dias eu fiz testes com o Axis 2, com o <a href="http://cxf.apache.org/" target="_blank">Apache CXF</a> e com o JAX-WS.</p>
<p>Eu não gosto muito do Axis 2. Você até consegue desenvolver serviços rapidamente com ele, mas ele gera um código tão sujo que é muito triste colocar qualquer coisa em produção com ele, sabendo que você vai ter que manter depois aquele código. Além disso, para utilizá-lo você precisa levar nada menos que 51 jars para sua aplicação, o que transforma qualquer aplicação em um mastodonte. Um outro problema dessa lista massiva de dependências é que a chance de uma aplicação pré-existente ter conflitos de dependências com o Axis é grande.</p>
<p>Na prática, eu só utilizaria o Axis 2 (e mesmo assim com má vontade) para desenvolver serviços se fosse numa estrutura como o <a href="http://wso2.org/projects/wsas/java" target="_blank">WSO2 Web Services Application Server</a>, que é um servidor de aplicações &#8220;dedicado&#8221; a serviços Axis.</p>
<p>O Apache CXF oferece um &#8220;front-end&#8221; com JAX-WS (que é o mais recomendado) e um &#8220;front-end&#8221; alternativo, que usa o Aegis Databinding. Por enquanto olhei apenas o front-end com JAX-WS, mas não vi nenhuma vantagem em utilizar o CXF em vez da implementação de referência presente no <a href="https://glassfish.dev.java.net/" target="_blank">Glassfish</a>. Se pintar disposição eu darei uma olhada no front-end com Aegis Databinding, mas por enquanto não tenho grandes expectativas em relação a ele não.</p>
<p>Para finalizar, fiz muitos experimentos com a implementação de referência do JAX-WS, embutido no Glassfish V2. A forma de trabalho que achei mais produtiva nestes meus testes foi desenvolvendo com JAX-WS no <a href="http://www.netbeans.org" target="_blank">Netbeans</a> (utilizei a versão 6.5).</p>
<p>Tentei desenvolver a partir de classes Java, e a partir do <a href="http://www.w3.org/TR/wsdl" target="_blank">WSDL</a>, e esta última me trouxe melhores resultados.A melhor forma que achei foi começar desenhando os schemas XML com o editor do Netbeans:</p>
<p><a href="http://brunopereira.org/wp-content/uploads/2008/12/xml_schema_editor.jpg"><img class="alignnone size-full wp-image-263" title="xml_schema_editor" src="http://brunopereira.org/wp-content/uploads/2008/12/xml_schema_editor.jpg" alt="" width="471" height="586" /></a></p>
<p>Criei um Complex Type para cada classe de domínio, e 1 Complex Type para o Request de cada operação e 1 Complex Type para o Response de cada operação. Tendo feito isso, criei depois 1 Element para o Request de cada operação e 1 Element para o Response de cada operação. Com o schema XML criado dessa forma, criei em seguida o WSDL, com o editor do Netbeans também:</p>
<p><a href="http://brunopereira.org/wp-content/uploads/2008/12/wsdl_editor.jpg"><img class="alignnone size-full wp-image-264" title="wsdl_editor" src="http://brunopereira.org/wp-content/uploads/2008/12/wsdl_editor.jpg" alt="" width="418" height="702" /></a></p>
<p>Na criação do WSDL, coloquei nas mensagens de Request/Response das operações os <strong><em>Elementos</em></strong> declarados no schema XML anterior. É importante prestar atenção nisso. Usando Elementos nas mensagens, você está criando serviços no modelo <em><strong>Document/Literal</strong></em>. Se você colocar nas mensagens um <em><strong>Complex Type</strong></em> diretamente, em vez de colocar um <em><strong>Elemento</strong></em>, você estará criando um serviço no modelo <strong><em>RPC/Literal</em></strong>. Eu particularmente prefiro Document/Literal, e o código gerado pelo JAX-WS neste modelo me agrada mais.</p>
<p>A implementação do serviço com JAX-WS ficou parecida com isso aqui:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">org.brunopereira.cadastro</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.jws.WebService</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.brunopereira.schema.cadastroclientes.CadastroClienteRequestType</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.brunopereira.schema.cadastroclientes.CadastroClienteResponseType</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.brunopereira.schema.cadastroclientes.Cliente</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.brunopereira.wsdl.cadastrocliente.CadastroClientePortType</span><span style="color: #339933;">;</span>
&nbsp;
@WebService<span style="color: #009900;">&#40;</span>serviceName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;CadastroClienteService&quot;</span>, portName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;CadastroClientePort&quot;</span>,
endpointInterface <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;org.brunopereira.wsdl.cadastrocliente.CadastroClientePortType&quot;</span>,
targetNamespace <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://brunopereira.org/wsdl/CadastroCliente&quot;</span>,
wsdlLocation <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;WEB-INF/wsdl/CadastroCliente/CadastroCliente.wsdl&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CadastroCliente <span style="color: #000000; font-weight: bold;">implements</span> CadastroClientePortType <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">public</span> CadastroClienteResponseType cadastrarCliente<span style="color: #009900;">&#40;</span>CadastroClienteRequestType request<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Cadastro de cliente foi invocado!! Será feito o roteamento para o serviço adequado!!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Cliente cliente <span style="color: #339933;">=</span> request.<span style="color: #006633;">getCliente</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
CadastroClienteResponseType response <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CadastroClienteResponseType<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
response.<span style="color: #006633;">setCliente</span><span style="color: #009900;">&#40;</span>cliente<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">return</span> response<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O código do cliente foi gerado bem facilmente a partir do WSDL também, e ficou bem limpo. O que achei bem fraco foi a parte de teste dos serviços tanto no Netbeans como no Eclipse. No Eclipse você só consegue usar os plugins de teste se você tiver desenvolvido os serviços dentro do Eclipse, o que inviabilizou o meu uso. E o Netbeans tem um suporte que só serve pra HelloWorld, pra aqueles serviços de Calculadora, que você passa uns parâmetros primitivos e recebe um resultado simples. A interface do testador do meu serviço ficou dessa forma:<br />
<a href="http://brunopereira.org/wp-content/uploads/2008/12/web_services_tester.jpg"><img class="alignnone size-full wp-image-265" title="web_services_tester" src="http://brunopereira.org/wp-content/uploads/2008/12/web_services_tester.jpg" alt="" width="800" height="500" /></a></p>
<p>Dá pra ver que não serve para nada além de um HelloWorld basicão.</p>
<p>Bom, de uma maneira geral, o suporte a Web Services no Netbeans é muito melhor do que no Eclipse, que pra piorar só suporta a criação de serviços com o Axis. Até agora a maneira mais produtiva que encontrei de trabalhar com serviços SOAP foi essa que descrevi. Nos próximos dias olharei o que tem de interessante no projeto Metro e no JBoss ESB. Se encontrar coisas interessantes falarei mais por aqui. Ah, e se alguém tiver dicas para melhorar esta forma de trabalho que descrevi, por favor me avisem, pois estou avaliando muita coisa e não dá tempo de dedicar tanto tempo a cada opção dessas.</p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2008/12/08/a-procura-de-uma-maneira-produtiva-de-trabalhar-com-web-services-soap/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WSO2 Registry now working in JBoss 4.0.5</title>
		<link>http://brunopereira.org/2008/09/24/wso2-registry-now-working-in-jboss-405/</link>
		<comments>http://brunopereira.org/2008/09/24/wso2-registry-now-working-in-jboss-405/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 01:26:56 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[log4j]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[wso2]]></category>
		<category><![CDATA[wso2 registry]]></category>

		<guid isPermaLink="false">http://brunopereira.org/?p=213</guid>
		<description><![CDATA[After some extra effort today, I did manage to get WSO2 Registry working in JBoss 4.0.5
The huge amount of jdbc error messages in the server logs were not actually errors. JBoss datasources have a configuration element called &#60;track-statements&#62;. When this option is turned on, JBoss logs massively when there are Statements or ResultSets that are [...]]]></description>
			<content:encoded><![CDATA[<p>After some extra effort today, I did manage to get <a href="http://wso2.org/projects/registry" target="_blank">WSO2 Registry</a> working in <a href="http://www.jboss.org/jbossas/" target="_blank">JBoss 4.0.5</a></p>
<p>The huge amount of jdbc error messages in the server logs were not actually errors. <a href="http://wiki.jboss.org/wiki/ConfigDataSources" target="_blank">JBoss datasources</a> have a configuration element called <span>&lt;track-statements</span>&gt;. When this option is turned on, JBoss logs massively when there are Statements or ResultSets that are left open. The application server closes the Statements and the ResultSets, and shows many many logs indicating this. The log messages I was seeing were not errors in the Registry, they were only JBoss warnings.</p>
<p>All our datasources in my team have this option turned on, and we always take care to close the ResultSets and Statements in all our applications. But since the server closes the ResultSets and Statements, I can live with the way the Registry does <img src='http://brunopereira.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I had to do some things to get the Registry working in JBoss. First, I had to remove the log4j the Registry had packed inside its war file. Our JBoss servers use the <a href="http://wiki.jboss.org/wiki/ClassLoadingConfiguration" target="_blank">Unified Classloader</a>, for several years already. This setup was there before I even joined the company, and it&#8217;d complicated to change this now, because it&#8217;d make us modify several applications. Not being able to change the Classloader, the log4j packed inside the Registry (1.2.13) would conflict with the one present in JBoss itself (1.2.8), so I had to remove it from the Registry&#8217;s war. The application worked just fine using log4j 1.2.8, so it&#8217;s ok to do this.</p>
<p>After fixing this, I had to enable Java 1.5 code in the jsps. JBoss by default does not allow Java 1.5 code in the jsps, and to modify this, I had to uncomment the code below inside JBOSS_HOME/server/default/deploy/jbossweb-tomcat55.sar/conf/web.xml:</p>
<p><code>&lt;init-param&gt;<br />
&lt;param-name&gt;compilerSourceVM&lt;/param-name&gt;<br />
&lt;param-value&gt;1.5&lt;/param-value&gt;<br />
&lt;/init-param&gt;</code></p>
<p>This init-param belongs to &lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;, and solves the jsp compilation problem.</p>
<p>Well, that&#8217;s what I had to do to make WSO2 Registry work in JBoss. Most of the problems I faced were not Registry&#8217;s fault, so I&#8217;m sorry for having a wrong impression after some setup problems this week.</p>
<p>I&#8217;m currently integrating WSO2 Registry in our architecture and once I finish, I&#8217;ll document our architecture here, so that other people can see what uses we&#8217;re making of the product.</p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2008/09/24/wso2-registry-now-working-in-jboss-405/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Precisamos de um descritor de serviços REST?</title>
		<link>http://brunopereira.org/2008/05/14/precisamos-de-um-descritor-de-servicos-rest/</link>
		<comments>http://brunopereira.org/2008/05/14/precisamos-de-um-descritor-de-servicos-rest/#comments</comments>
		<pubDate>Thu, 15 May 2008 01:33:40 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[posts em português]]></category>
		<category><![CDATA[cejug]]></category>
		<category><![CDATA[domain driven design]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restful web services]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[uddi]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[WS-*]]></category>
		<category><![CDATA[wsdl]]></category>

		<guid isPermaLink="false">http://blpsilva.wordpress.com/?p=180</guid>
		<description><![CDATA[Me perguntaram sobre isso na minha apresentação de REST na Globo.com e isso foi assunto de uma discussão interessante hoje no CEJUG. Como é um assunto que pode interessar a bastante gente e eu me interesso muito por web services, resolvi falar mais sobre isso aqui no blog.
Os web services WS-* possuem o WSDL (Web [...]]]></description>
			<content:encoded><![CDATA[<p>Me perguntaram sobre isso na <a href="http://brunopereira.org/2008/04/24/apresentacao-sobre-web-services-rest/" target="_self">minha apresentação de REST</a> na <a href="http://www.globo.com" target="_blank">Globo.com</a> e isso foi assunto de uma discussão interessante hoje no <a href="http://www.cejug.org" target="_blank">CEJUG</a>. Como é um assunto que pode interessar a bastante gente e eu me interesso muito por web services, resolvi falar mais sobre isso aqui no blog.</p>
<p>Os web services WS-* possuem o WSDL (Web Services Description Language), um artefato amplamente aceito que descreve de forma padrão os serviços da aplicação. Ao especificar no WSDL quais são os schemas XML dos documentos que serão trocados e a cardinalidade precisa de cada elemento, conseguimos garantir que qualquer cliente que entenda o padrão estabelecido será capaz de interpretar os documentos e comunicar-se corretamente com os serviços. Além disto, a maturidade deste padrão traz a vantagem de que já existem geradores de clientes em várias linguagens a partir de um documento WSDL.</p>
<p>Entretanto, WSDL (bem como muita coisa em WS-*) é complexo. Um ser humano que tenha que analisar um WSDL grande perderá um bom tempo para entender o que está descrito no documento. Já REST não tem uma forma padrão de especificar os contratos dos serviços.</p>
<p>Embora a versão 2.0 da especificação WSDL permita descrever web services REST, os principais projetos open source da área como o Apache Abdera, Google Data API, Jersey e o Mule não utilizam esta forma de publicação. Não tenho conhecimento de nenhum projeto publicamente divulgado que faça uso do WSDL 2.0 para descrever serviços REST, e a adoção desta capacidade é baixíssima (se é que existe).</p>
<p>O projeto Jersey oferece opcionalmente o WADL, que é uma forma de descrever serviços REST. Confesso que ainda não olhei o WADL para ver se seria interessante usá-lo. Pelo que sei, entretanto, a adoção dele também é muito baixa.</p>
<p>Existe também o documento de serviços do AtomPub, que é bem interessante. Ele é um documento simples que lista quais são as coleções disponíveis e a localização das mesmas. O documento informa também quais são os MIME types aceitos em cada coleção.</p>
<p>Eu considero interessante que a aplicação ofereça uma interface simples de consulta dos serviços disponíveis. Não é obrigatório, mas quando a aplicação tem uma certa quantidade de clientes é bem legal ter isso para facilitar.</p>
<p>Em dois projetos que eu trabalhei, eu implementei um Servlet simples que listava todas as URIs disponíveis na aplicação, quais métodos HTTP são aceitos em cada uma das URIs e além disso um exemplo de XML manipulado em cada uma das URIs. Isso foi algo que eu achei bom o suficiente, e não tão custoso. Normalmente a documentação de verdade dos serviços fica em algum lugar como uma Wiki, ou uma página qualquer com a descrição detalhada de como interagir com os serviços.</p>
<p>A questão principal é que quando você segue as boas práticas de desenvolvimento REST, os seus serviços ficam muito mais claros para quem precisa se integrar. Por exemplo, eu trabalhei em um projeto crítico de integração com o Google esse ano. Tive que usar várias funcionalidades da Google Data API. A API deles é REST, e encapsula os dados com o formato Atom. Eles não oferecem nenhuma interface semelhante ao WSDL, eles simplesmente têm uma <a href="http://code.google.com/apis/apps/overview.html" target="_blank">página com a documentação dos serviços</a>.</p>
<p>Como eles seguiram as boas práticas de implementação REST, eu rapidamente aprendi a utilizar a API deles. Os protocolos de comunicação REST são bem semelhantes, e mais simples de entender do que qualquer coisa com WS-*. Pouco mais de 1 hora depois de olhar a documentação deles, eu já estava conseguindo me integrar com eles, com os primeiros exemplos.</p>
<p>O <a href="http://gc.blog.br" target="_blank">Guilherme</a> fez uma observação interessante durante a discussão disso na minha apresentação no Tech Talk. Quando você segue as boas práticas e implementa um protocolo conciso e claro, de certa forma podemos dizer que a implementação se &#8220;auto-documenta&#8221;. É algo que podemos traçar um paralelo ao que acontece ao utilizarmos Domain Driven Design. Aproximando a linguagem do código do domínio de negócio, facilitamos a compreensão da aplicação por pessoas que nunca a tinham visto antes. Uma boa arquitetura de web services declarativos (REST) fica muito mais clara do que uma arquitetura de web services imperativos (WS-*). Isto acontece porque com REST o que fica em destaque são os <strong>Recursos</strong> (que representam conceitos claros do domínio), em vez de <strong>Operações</strong>.</p>
<p>É claro que as pessoas ainda terão que ler um pouco da documentação, mas como os conceitos em sua maioria já estarão &#8220;no sangue&#8221;, as dificuldades iniciais são menores do que com WS-*.</p>
<p>O <a href="http://weblogs.java.net/blog/felipegaucho/" target="_blank">Felipe Gaúcho</a> comentou no CEJUG sobre a capacidade de gerar clientes automatizados com WSDL. Embora isso seja verdade, no meu ponto de vista isso é meio que um mito. Não conheço ninguém que faça integrações automatizadas sem depender de seres humanos. A motivação disso é clara. Integrações envolvem regras de negócio, e ninguém que eu conheço faz negócios automáticos, sem definir as regras <img src='http://brunopereira.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Existia o mito de que as aplicações &#8220;descobririam&#8221; serviços automaticamente com UDDI e se virariam para fazer as integrações, gerando os clientes automaticamente. Embora isso seja tecnicamente possível, na prática isso pra mim é uma viagem que serviria mais para desenvolvimento de inteligência artificial do que para web services propriamente <img src='http://brunopereira.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Embora esta precisão do WSDL seja um ponto positivo, eu tenho a convicção de que a clareza que temos ao usar REST supera e muito as vantagens de termos geradores de clientes automatizados. Quanto a WS-* x REST de uma maneira mais geral, tem uma frase que eu gosto de utilizar. <strong>WS-* é apenas overhead a não ser que você tenha informações relevantes nos seus cabeçalhos SOAP</strong>. Se você nunca se preocupou MUITO (veja bem, MUITO) com o que está indo nos seu cabeçalhos SOAP, <strong>provavelmente</strong> um protocolo REST seria mais interessante.</p>
<p>Tem uma opinião a respeito disso? Estou ansioso para conhecê-la! <img src='http://brunopereira.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2008/05/14/precisamos-de-um-descritor-de-servicos-rest/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Java Magazine 55</title>
		<link>http://brunopereira.org/2008/03/08/java-magazine-55/</link>
		<comments>http://brunopereira.org/2008/03/08/java-magazine-55/#comments</comments>
		<pubDate>Sat, 08 Mar 2008 14:41:35 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[posts em português]]></category>
		<category><![CDATA[apache axis 2]]></category>
		<category><![CDATA[artigo java]]></category>
		<category><![CDATA[axis 2]]></category>
		<category><![CDATA[java magazine]]></category>
		<category><![CDATA[java magazine 55]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[WS-*]]></category>

		<guid isPermaLink="false">http://blpsilva.wordpress.com/?p=105</guid>
		<description><![CDATA[
Caros amigos, nos próximos dias chega às bancas a edição 55 da Java Magazine. Nesta edição sai um artigo meu entitulado &#8220;Web services WS-*&#8220;.
Este artigo é uma continuação do artigo da edição 54, na qual fiz uma análise dos web services REST e web services WS-*. Na edição 54, o foco era mais teórico, discutindo [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Java Magazine 55" href="http://www.devmedia.com.br/resumo/default.asp?ed=55&amp;site=6" target="_blank"><img src="http://brunopereira.org/wp-content/uploads/2008/02/capajava55_g.jpg" alt="Java Magazine 55 - Março de 2008" /></a></p>
<p>Caros amigos, nos próximos dias chega às bancas a <a title="Java Magazine 55" href="http://www.devmedia.com.br/resumo/default.asp?ed=55&amp;site=6" target="_blank">edição 55 da Java Magazine</a>. Nesta edição sai um artigo meu entitulado &#8220;<strong>Web services WS-*</strong>&#8220;.</p>
<p>Este artigo é uma continuação do <a href="http://brunopereira.org/2008/02/14/java-magazine-54-meu-primeiro-artigo/" target="_blank">artigo da edição 54</a>, na qual fiz uma análise dos web services REST e web services WS-*. Na edição 54, o foco era mais teórico, discutindo várias questões relevantes da implementação de web services nas 2 linhas de desenvolvimento.</p>
<p>Neste artigo, o objetivo é partir de um problema real de arquitetura orientada a serviços, e então realizar a modelagem e implementação utilizando a pilha WS-*. O exemplo adotado para contextualizar o problema é o processo de leilão do Mercado Livre, mas num contexto de leilão com apenas 1 usuário adquirindo um determinado item. O desenvolvimento foi feito utilizando o <a href="http://ws.apache.org/axis2/" target="_blank">Apache Axis 2</a>, uma das opções mais populares para o desenvolvimento deste nicho em Java.</p>
<p>Na edição 56, esta série será complementada com outro artigo prático, que utiliza a abordagem REST para resolver o mesmo problema proposto para esta edição. O objetivo com estes 2 artigos práticos é utilizar um mesmo exemplo que seja de fácil visualização por parte dos leitores e então descrever os detalhes principais do desenvolvimento de web services utilizando a abordagem WS-* e a abordagem REST.</p>
<p>Espero que os leitores gostem destes artigos e torço para que eles possam contribuir com o entendimento do desenvolvimento de web services, e mais especificamente, a implementação em Java. Ao longo do ano escreverei mais artigos nesta área, então se você tiver interesse no assunto, certamente recomendo acompanhar as edições futuras da revista <img src='http://brunopereira.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2008/03/08/java-magazine-55/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Java Magazine 54 &#8211; Meu primeiro artigo</title>
		<link>http://brunopereira.org/2008/02/14/java-magazine-54-meu-primeiro-artigo/</link>
		<comments>http://brunopereira.org/2008/02/14/java-magazine-54-meu-primeiro-artigo/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 02:24:22 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[posts em português]]></category>
		<category><![CDATA[artigo]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java magazine]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[WS-*]]></category>

		<guid isPermaLink="false">http://blpsilva.wordpress.com/?p=86</guid>
		<description><![CDATA[
Caros amigos, é com enorme satisfação que anuncio que esta semana chega às bancas a edição 54 da Java Magazine, na qual estou publicando o meu primeiro artigo.
No artigo desta edição, faço uma análise imparcial dos web services REST e web services WS-*, dando uma visão pragmática do nosso momento atual de implementação de web [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devmedia.com.br/resumo/default.asp?ed=54&amp;site=6" title="Java Magazine 54 - Fevereiro de 2008" target="_blank"><img src="http://brunopereira.org/wp-content/uploads/2008/02/capajava54_g.jpg" alt="Java Magazine - Edição 54 - Fevereiro de 2008" /></a></p>
<p>Caros amigos, é com enorme satisfação que anuncio que esta semana chega às bancas a <a href="http://www.devmedia.com.br/resumo/default.asp?ed=54&amp;site=6" title="Java Magazine 54 - Fevereiro de 2008" target="_blank">edição 54 da Java Magazine</a>, na qual estou publicando o meu primeiro artigo.</p>
<p>No artigo desta edição, faço uma análise imparcial dos web services REST e web services WS-*, dando uma visão pragmática do nosso momento atual de implementação de web services.</p>
<p>Este é o primeiro do que eu espero que sejam muitos artigos meus publicados na revista, e pelo menos inicialmente a maioria deles será na área de web services. Espero que bastante gente leia o artigo e possivelmente dê opiniões sobre o mesmo. Torço para que vocês gostem das minhas publicações, vamos ver se eu levo jeito para a coisa <img src='http://brunopereira.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2008/02/14/java-magazine-54-meu-primeiro-artigo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JSR-311: Java API for RESTful Web Services</title>
		<link>http://brunopereira.org/2008/01/31/jsr-311-java-api-for-restful-web-services/</link>
		<comments>http://brunopereira.org/2008/01/31/jsr-311-java-api-for-restful-web-services/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 01:00:44 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[posts em português]]></category>
		<category><![CDATA[jax-rs]]></category>
		<category><![CDATA[jersey]]></category>
		<category><![CDATA[jsr]]></category>
		<category><![CDATA[jsr-311]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://blpsilva.wordpress.com/?p=76</guid>
		<description><![CDATA[Eu estou atualmente implementando alguns web services Restful, e estou avaliando opções para alguns pedaços do desenvolvimento. Eu já sabia que existia uma JSR para web services REST, mas ainda não tinha lido a mesma.Agora há pouco li a JSR-311, que definirá padrões de implementação Java para uma API Rest, do lado do servidor. A [...]]]></description>
			<content:encoded><![CDATA[<p>Eu estou atualmente implementando alguns web services Restful, e estou avaliando opções para alguns pedaços do desenvolvimento. Eu já sabia que existia uma JSR para web services REST, mas ainda não tinha lido a mesma.Agora há pouco li a <a href="http://jcp.org/en/jsr/detail?id=311" target="_blank">JSR-311</a>, que definirá padrões de implementação Java para uma API Rest, do lado do servidor. A parte de implementação de clientes será tratada em outra(s) JSR(s) .</p>
<p>Esta JSR é bastante interessante, e já pude ver nela o tratamento de coisas muito úteis. De principal destaque para mim está a abordagem de mapeamento de URIs em recursos e métodos e a questão do mapeamento de classes Java para dados com diversos content-types.</p>
<p>Em relação às URIs, há a definição de regras para mapear URIs em classes e métodos, instanciando as classes necessárias e invocando os métodos adequados. Suponha por exemplo uma requisicao HTTP PUT na URI /usuario/16728/produto/228/configuracao/. Em um protocolo definido por mim, isto representaria uma atualização nas configurações do Produto 228 para o Usuário 16728. Um ser humano consegue entender isso sem tantos problemas, mas uma implementação manual destes mapeamentos e o parsing dos parâmetros podem ser coisas bem trabalhosas. A JSR 311 utiliza várias annotations para conseguir definir o encadeamento de classes e métodos a partir da URI utilizada, e isto faz com que você consiga desenvolver em Java normalmente e ter as suas classes instanciadas e invocadas com URIs tão flexíveis quanto você queira. Muito bom ter isso como recurso, pois implementar na mão é bem trabalhoso.</p>
<p>Outra coisa muito interessante é a maneira de mapear classes Java para diversos content-types. Isso é algo fundamental para uma implementação Restful com bastante flexibilidade E possivelmente alta performance. A idéia por trás disso é que o servidor recebe uma requisição de um cliente e verifica quais são os content-types que o cliente aceita. Com base nestas informações, o servidor escolhe a forma que irá utilizar para transmitir os dados.</p>
<p>Suponha por exemplo que uma aplicação PHP está se comunicando com seu servidor, e ele lhe informa que aceita os content-types text/plain, text/xml e application/json. O servidor pode escolher qual formato utilizar para o envio e possivelmente o envio com formato json facilita bastante a aplicação PHP. Este mesmo servidor pode receber requisições de uma outra aplicação Java, que preferencialmente receberá do seu servidor um stream binário, que terá a melhor performance de todas as opções.</p>
<p>O uso desta abordagem dos mapeamentos em content-types permite que sua aplicação tenha ao mesmo tempo alta interoperabilidade e alta performance. Você conseguirá se comunicar com várias plataformas e aplicações diferentes, e continuará tendo a opção de alta performance, caso seja uma aplicação da mesma plataforma. Você não consegue isso com web services WS-*. Eles não têm tamanha flexibilidade.</p>
<p>O meu próximo passo agora será analisar com detalhes o <a href="https://jersey.dev.java.net/" target="_blank">Jersey</a>, a implementação de referência desta JSR. A especificação em si ainda está um tanto crua, pois ainda é um early draft. Já pude ver vários pontos interessantes, mas a definição ainda está sujeita a muitas modificações. Vou avaliar agora o que o Jersey já oferece e torcer para que ele já tenha componentes fáceis de usar e flexíveis. A proposta dele é excelente, vamos ver se a implementação consegue oferecer estes recursos sem amarrar muito as decisões de projeto.</p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2008/01/31/jsr-311-java-api-for-restful-web-services/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Atom feeds for enterprise application messaging</title>
		<link>http://brunopereira.org/2008/01/27/atom-feeds-for-enterprise-application-messaging/</link>
		<comments>http://brunopereira.org/2008/01/27/atom-feeds-for-enterprise-application-messaging/#comments</comments>
		<pubDate>Sun, 27 Jan 2008 16:12:59 +0000</pubDate>
		<dc:creator>blpsilva</dc:creator>
				<category><![CDATA[open source]]></category>
		<category><![CDATA[atom]]></category>
		<category><![CDATA[atom publishing protocol]]></category>
		<category><![CDATA[atompub]]></category>
		<category><![CDATA[bugzilla]]></category>
		<category><![CDATA[enterprise messaging]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[messaging]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[restful web services]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://blpsilva.wordpress.com/?p=75</guid>
		<description><![CDATA[In the last months I have studied and worked a lot with web services in general, and more specifically the RESTful ones. I believe we are going through a fast maturation process in this area, and RESTful web services are becoming the preferred choice for many new implementations. Right in the thick of things in [...]]]></description>
			<content:encoded><![CDATA[<p>In the last months I have studied and worked a lot with web services in general, and more specifically the RESTful ones. I believe we are going through a fast maturation process in this area, and RESTful web services are becoming the preferred choice for many new implementations. Right in the thick of things in this field is the Atom Publishing Protocol. This is the blueprint solution for RESTful web services, and its adoption is growing fast, reaching much broader scope than just blog applications using the <a href="http://en.wikipedia.org/wiki/Atom_(standard)" target="_blank">Atom Format</a>.The Atom format and AtomPub protocol can both be used for many interesting purposes. This year I&#8217;m working on a big refactoring (actually a new implementation) of a widely used <a href="http://www.globo.com" target="_blank">Globo.com</a> application. This application (let&#8217;s call it Register) is responsible for the creation of new users and provisioning new services to them, among other features.</p>
<p>A nice concept present in the original development is the use of Application Connectors. Through these connectors, other applications get notified of events that happened in the Register application. An example is: when a new subscriber (a paying user) is created, a connector sends the notification to another application in order to create the subscriber&#8217;s mailbox in the company&#8217;s external mail provider. Another example is: when a user gets provisioned in the blogging service, another connector sends a notification to the blogger application, that does what it needs in order to create the user&#8217;s directory and quota on the file server.</p>
<p>Although i like this concept, it currently has some problems. This connector&#8217;s invocation is done explicitly by the Register application. The Register application knows that a new subscriber must receive a new mailbox, and it needs to call a given connector to do this. This is my biggest concern with the current implementation. I strongly believe that an application that creates users must not know anything about mailboxes. In the current structure, when a new application ABC must be notified of events in application XYZ, application XYZ must be modified to invoke a new connector. This doesn&#8217;t please me at all. Let me explain a solution that pleases me more <img src='http://brunopereira.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>To explain my idea, I&#8217;ll propose some examples involving Google and its services. As we all know, Google offers several different services, all of which can be accessed using the same Google account. When you register at Google, you receive a mail account. Let&#8217;s suppose that Google Register application sends a new entry to an Atom feed every time a new user is created. This way, every user creation is present on the Atom Feed. If an application (for example Google Mail) needs to be notified of the creation of new users, it just needs to subscribe to the Register&#8217;s Atom feed.</p>
<p>Let me propose a richer example now. Let&#8217;s say Google starts to offer some super cool software development services. If you&#8217;re a developer, you can ask them to give you a &#8220;development account&#8221;. This development account would give you access to a Subversion repository, a Bugzilla project and a MySql database. Each of these would be an independent service offered by them, subject to change at any given time. The activation of &#8220;development accounts&#8221; could also populate an Atom feed.</p>
<p>This way the Subversion, Bugzilla and MySql services could be subscribers of the feed, doing everything they need when a new development account is activated, in asynchronous manner. The application that activates the development account has no knowledge of any other services. If Google wants to offer new services such as a Maven repository or a Continuous Integration environment, no problem. The new services would just subscribe to the Atom feed and do whatever they need when a new account is activated.</p>
<p>If Google wants to offer a free development account and a non-free account with better features, there could be another Atom feed for the activation of the paying accounts or maybe updates to the same existing feed. The Register application would know only about registrations, and other components could be easily plugged and unplugged from this process, without modifications on the Register application. Ah, and worth mentioning&#8230; totally decoupled from any specific platform. I don&#8217;t know how to implement any kind of messaging more decoupled than that.</p>
<p>This is much much better than the way our Register application sends notifications currently. And I&#8217;ll be pretty happy once we manage to do this, it&#8217;ll be so cool!</p>
<p>By the way, these Google&#8217;s software development services would be awesome. My friend <a href="http://neobject.wordpress.com" target="_blank">Bairos</a> kindly provides me Subversion and Trac services, but he doesn&#8217;t have Google&#8217;s bandwidth <img src='http://brunopereira.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Let&#8217;s hope Google gets to know about this and starts offering these services. It&#8217;d be amazing!</p>
]]></content:encoded>
			<wfw:commentRss>http://brunopereira.org/2008/01/27/atom-feeds-for-enterprise-application-messaging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

