<?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>CØdeZØne! &#187; transação</title>
	<atom:link href="http://leandrosilva.com.br/category/transacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://leandrosilva.com.br</link>
	<description>Coisas sobre desenvolvimento de software</description>
	<lastBuildDate>Sun, 22 Jan 2012 22:38:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Message-Driven Beans e Transações</title>
		<link>http://leandrosilva.com.br/2009/02/22/message-driven-beans-e-transacoes/</link>
		<comments>http://leandrosilva.com.br/2009/02/22/message-driven-beans-e-transacoes/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 05:50:45 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[ejb3]]></category>
		<category><![CDATA[exceções]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jms]]></category>
		<category><![CDATA[mom]]></category>
		<category><![CDATA[transação]]></category>

		<guid isPermaLink="false">http://leandrosilva.com.br/?p=184</guid>
		<description><![CDATA[Sexta-feira passada, postei  em meu twitter que estou tocando um projeto que envolve MOM. Hammm&#8230; JMS, para ser mais específico&#8230; rsrsrs&#8230;. Bem, o fato é que este projeto acabou me motivando a escrever este post sobre o assunto transação e EJB3 Message-Driven Beans (MDB),  apenas para fazer alguns lembretes e dar algumas dicas, já que [...]]]></description>
			<content:encoded><![CDATA[<p>Sexta-feira passada, <a href="http://twitter.com/codezone/status/1231363269" target="_blank">postei  em meu twitter</a> que estou tocando um projeto que envolve <a href="http://pt.wikipedia.org/wiki/MOM" target="_blank">MOM</a>. Hammm&#8230; <a href="http://pt.wikipedia.org/wiki/JMS" target="_blank">JMS</a>, para ser mais específico&#8230; rsrsrs&#8230;. Bem, o fato é que este projeto acabou me motivando a escrever este post sobre o assunto <a href="http://pt.wikipedia.org/wiki/Transação_atômica" target="_blank">transação</a> e <a href="http://java.sun.com/products/ejb/" target="_blank">EJB3</a> <a href="http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/EJBConcepts5.html" target="_blank">Message-Driven Beans</a> (MDB),  apenas para fazer alguns lembretes e dar algumas dicas, já que este é um assunto fundamentalmente importante. Vamu que vamu então&#8230;</p>
<p>A <strong>primeira coisa</strong> importante a saber é que <strong>transações não são propagadas do produtor de mensagens JMS para o MDB que as consome</strong>, independentemente destes trabalharem com <a href="http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Transaction3.html" target="_blank">CMT</a> ou <a href="http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Transaction4.html" target="_blank">BMT</a>. Isso se dá pela própria natureza assíncrona de um sistema baseado em MOM, uma vez que uma mensagem pode levar horas para ser consumida, se assim fizer sentido ao sistema. Assim sendo, uma transação de um MDB está limitada ao escopo do método <a href="http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/MDB4.html#70210" target="_blank"><strong>onMessage</strong></a>, que recebe e trata as mensagens.</p>
<p>A <strong>segunda coisa</strong> importante a saber é que <strong>quando o MDB faz o seu próprio gerenciamento de sua transação, a mensagem consumida não é parte transação.</strong> Ao passo que, se a transação do MDB for gerenciada pelo contêiner EJB, sim, a mensagem é parte da transação.</p>
<p>Sabendo essas duas coisas, somos levados a uma questão: <strong>O que acontece entãos se a transação falhar?</strong> Bem, está é a <strong>terceira coisa</strong> importante que precisamos saber. Sempre que o método <strong>onMessage</strong> completa sua execução sem erros, o contêiner EJB notifica ao provedor JMS <em>reconhecendo o recebimento da mensagem.</em> No entanto, se o correr uma <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/RuntimeException.html" target="_blank">RuntimeException</a> durante a sua execução, o provedor JMS não receberá esta notificação de reconhecimento e, muito provavelmente, disponibilizará a mensagem para ser novamente consumida pelo MDB. Isso poderia causar um problema sério de <em>loop</em> infinito, em caso de <em>poison messages</em>, mas felizmente há antidoto para isso: Configurar o número máximo de tentativas de entrega de mensagens. Uff!!!</p>
<p><strong>Como lidar então com exceções, rollback e reentrega de mensagens?</strong></p>
<p>Há momentos em que a reentrega de mensagens é fundamental; e há momentos que não. Se ocorrer uma exceção de negócio, por exemplo, você não vai querer que a mensagem seja entregue novamente. Mas, se ocorrer um exceção por indisponibilidade de uma recurso (banco de dados, web service, etc), seria fundamental que a mensagem fosse entregue novamente, depois de algum tempo. Com isso em mente, vamos discutir um pouquinho o assunto.</p>
<p><strong>Primeiro de tudo</strong>, não se esqueça que <strong>MDB&#8217;s não retornam exceções ao cliente que produziu a mensagem.</strong> Se a sua lógica de negócio em cima da mensagem produzida pelo cliente prevê uma exceção, pare e pense um pouco a respeito. Se você puder responder a ele com uma outra mensagem que ele (ou outro MDB responsável por notificar clientes) poderá consumir no provedor JMS, ótimo; caso contrario, esqueça, mensagens assíncronas não é uma opção para você.</p>
<p>Seguindo adiante com a solução, você precisa saber como MDB&#8217;s CMT ou BMT se comportam quando o assunto é transação. As diferenças básicas entre esses dois modelos de gerenciamento de transações são as seguintes:</p>
<p>Se seu <strong>MDB está baseado em CMT,</strong> significa que as mensagens que ele consume são parte da transação. Portanto, se a transação sofrer <em>rollback</em>, automaticamente, o consumo da mensagem também será revertido e o provedor JMS deverá tentar entregar a mensagem novamente.</p>
<p>Já, se seu <strong>MDB está baseado em BMT,</strong> significa que se a transação sofrer <em>rollback</em> o consumo da mensagem não será revertido, como acontece automaticamente no caso de CMT, e você poderá manter isso em segredo do provedor JMS, evitando que ele entregue a mensagem novamente. Ou, se fizer sentido ao seu requisito, você poderá notificá-lo do <em>rollback</em> de maneira bem simple e segura, basta lançar uma <a href="http://java.sun.com/javaee/5/docs/api/javax/ejb/EJBException.html" target="_blank">EJBException</a> que é <em>pá/pum.</em></p>
<blockquote><p><strong><em>Um pouco mais sobre Reconhecimento de Mensagem</em></strong></p>
<p>A <a href="http://java.sun.com/javaee/5/docs/api/javax/ejb/ActivationConfigProperty.html" target="_blank">propriedade</a> <strong>acknowlodgeMode</strong>, que determina o modo de reconhecimento da mensagem, pode ser definida como <em>Auto-acknowledge</em> ou <em>Dups-ok-acknowledge</em>. A primeria opção, instrui o contêiner EJB a notificar o reconhecimento da mensagem dentro do contexto da transação, seguindo as regras já citadas; e a segunda, o instrui a fazer isso num outro momento qualquer.</p>
<p>Essa propriedade pode ser ignorada, a menos que você esteja implementando um BMT ou um CMT com <a href="http://java.sun.com/javaee/5/docs/api/javax/ejb/TransactionAttribute.html" target="_blank">atributo de transação</a> definido como <a href="http://java.sun.com/javaee/5/docs/api/javax/ejb/TransactionAttributeType.html#NOT_SUPPORTED" target="_blank"><em>NotSupported</em></a>. Do contrario, o reconhecimento sempre ocontecerá no contexto da transação.</p>
<p>Se quiser saber mais, indico que você <a href="http://www.onjava.com/pub/a/onjava/excerpt/ejb3_ch13/index.html?page=6#28" target="_blank">leia esse material</a>.</p></blockquote>
<p><strong>Resumindo:</strong> Tome cuidado com suas exceções e não deixe que elas explodam sem mais nem menos, sem um tratamento adequado, nem nada, porque elas podem detonar suas transações e ainda causar problemas de negócio, com a reentrega de mensagens. Um bom <em>log</em> também vai muito bem, meu caro! <img src='http://leandrosilva.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bom, é isso ai&#8230; Espero que te ajude!</p>
<p>E se você ainda não leu esses dois posts: <a href="http://leandrosilva.com.br/2008/08/12/cuidado-com-suas-excecoes/" target="_self">Cuidado com suas exceções</a> e <a href="http://leandrosilva.com.br/2008/08/12/transacionando-ejb3-session-beans/" target="_self">Transacionando EJB3 Session Beans</a>, quando tiver um tempinho, leia. Talvez lhe sejam úteis também.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2009/02/22/message-driven-beans-e-transacoes/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Transacionando EJB3 Session Beans</title>
		<link>http://leandrosilva.com.br/2008/08/12/transacionando-ejb3-session-beans/</link>
		<comments>http://leandrosilva.com.br/2008/08/12/transacionando-ejb3-session-beans/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 05:37:38 +0000</pubDate>
		<dc:creator>Leandro Silva</dc:creator>
				<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[ejb3]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[transação]]></category>

		<guid isPermaLink="false">http://codezone.wordpress.com/?p=114</guid>
		<description><![CDATA[Um dos requisitos mais importantes em aplicações de software que lidam com modificações de dados persistentes é o controle transacional. O que significa que não podemos simplismente ignorá-lo. Por isso, resolvi escrever este post. Antes de mais nada, que raios é uma transação? Uma transação, em linhas gerais, do ponto de vista de negócio, denota [...]]]></description>
			<content:encoded><![CDATA[<p>Um dos requisitos mais importantes em aplicações de software que lidam com modificações de dados persistentes é o controle transacional. O que significa que não podemos simplismente ignorá-lo. Por isso, resolvi escrever este post.</p>
<p><strong>Antes de mais nada, que raios é uma transação?</strong></p>
<p>Uma transação, em linhas gerais, do ponto de vista de negócio, denota uma troca entre duas partes. Por exemplo, numa compra online de livro, você troca uma certa quantia em dinheiro debitada de seu cartão de crédito, por um livro de sua escolha. Ao participar de uma transação de negócio como esta, você procura se certificar de que o valor debitado em seu cartão de crédito é de fato o valor da compra. Caso contrario, há a possibilidade de você estar sendo enganado sem nem mesmo tomar conhecimento &#8211; o que não é nada divertido.</p>
<p><strong>Ótimo. Mas onde isso impacta nossos softwares?</strong></p>
<p>Em termos de software, um bom design de seus objetos de negócio não garante que tudo estará bem ao final de um transação. Uma pena. Mas o problema não está no objeto de negócio por si só, ou mesmo no seu processo de negócio. O buraco ainda é um pouquinho mais embaixo.</p>
<p>Em uma aplicação de software, uma transação é bem semelhante ao conceito <em>&#8220;toma lá, dá cá&#8221;</em> que acabei de apresentar acima, recheado de atividades inter-relacionadas que devem ser completadas em conjunto. A este conjunto de atividades dá-se o nome de <strong>unidade de trabalho</strong>. (Martin Fowler inclusive catalogou em seu livro <a href="http://martinfowler.com/books.html#eaa" target="_blank">Patterns of Enterprise Application Architecture</a> um design pattern que reside nesse campo de transação de negócio chamado <a href="http://martinfowler.com/eaaCatalog/unitOfWork.html" target="_blank">Unit Of Work</a>.) Assim, o objetivo final de um transação é executar uma unidade de trabalho, de ponta a ponta, resultando em uma troca 100% confiável. Afinal, ninguém quer comprar gato por lebre, não é mesmo?</p>
<p>Sabendo disso, como podemos garantir esta confiabilidade?</p>
<p><strong>Aqui entra o tal ACID</strong></p>
<p>Quatro características são fundamentais em transações para estas sejam seguras.</p>
<p>1- <strong>Atômica</strong>, porque uma transação deve executar completamente ou definitivamente não executar. Isso significa que cada trarefa em uma unidade de trabalho deve executar sem qualquer erro, pois se algum erro ocorrer, a transação deve ser abortada e todas alterações revertidas para o estado anterior ao início da transação.</p>
<p>2- <strong>Consitente</strong>, já que ninguém gostaria de pagar R$ 50,00 no cartão de crédito e, por fim, ao receber a fatura de cobrança, ver que está sendo cobrado R$ 500,00 &#8211; e não R$ 50,00. Essa é uma responsabilidade que cabe ao desenvolvedor, que deve consistir cada dado antes de persisti-lo, e ainda, garantir que as tabelas (em caso de banco de dados) estejam preparadas para receber os tais dados.</p>
<p>3- <strong>Isolada</strong>, porque não é conveniente que os dados estão sendo manipulados por uma transação sejam ao mesmo tempo modificados por outra unidade de trabalho. Imagine que desagradável seria acontecer isso no momento de finalizar uma compra on-line, por exemplo.</p>
<p>4- <strong>Durável</strong>, uma vez que os dados precisam ser armazenados fisicamente em algum local enquanto a transação está acontecendo, para que não se percam caso o sistema trave.</p>
<p>Daí o acrônimo <strong>ACID</strong>.</p>
<p><strong>Finalmente, como EJB3 nos permite controlar transações?</strong></p>
<p><a href="http://java.sun.com/products/ejb/" target="_blank">EJB3</a> dá-nos uma maneira muito simples de controlar transações em Session Beans através de uma simples anotação: <strong>@javax.ejb.TransactionAttribute</strong>.</p>
<p>Você pode aplicar essa anotação tanto em métodos individualmente, quanto na própria classe do bean &#8211; o que torna abrangente a todos os métodos. Ou mesmo, se for o caso, você pode aplicar na classe do bean e em seus métodos individualmente, ao mesmo tempo &#8211; neste caso, a anotação do método sobrepõem-se à da classe do bean.</p>
<p><strong>@javax.ejb.TransactionAttribute</strong> recebe como atributo uma enum <strong>TransactionalAttributeType</strong>, que tem as seguintes opções:</p>
<p>- <strong>MANDATORY</strong>, define que o método do bean deve ser parte do escopo de transação do cliente, pois o bean pode não iniciar sua própria transação. Caso o cliente não tenha uma transação iniciada, uma falha ocorrerá e será lançada uma exceção <strong>javax.ejb.EJBTransactionRequiredException</strong>.</p>
<p>- <strong>REQUIRED</strong>, significando que o método do bean deve ser invocado no escopo de uma transação. Caso o cliente não houver chamado este método como parte de uma transação, uma nova transação será iniciada. Mas será encerrada ao final da executação deste método.</p>
<p>- <strong>REQUIRES_NEW</strong>, significa que sempre uma nova transação é iniciada, independente do cliente ter feito a invocação do método do bean em um escopo de transação ou não. O que acontece é que a transação do cliente é suspensa até que o método do bean retorne; e a nova transação, obviamente, só é válida durante a execução do método do bean.</p>
<p>- <strong>SUPPORTS</strong>, indica que o método do bean pode ser invocado dentro de um escopo de transação ou não. Ele pode, inclusive, interagir com outros beans que não estão inseridos em um escopo de transação.</p>
<p>- <strong>NOT_SUPPORTED</strong>, suspende a transação até que o método do bean termine a sua execução. Isso faz com que a transação não seja propagada a qualquer outro método de bean que este invoque.</p>
<p>- <strong>NEVER</strong>, define que um método do bean não pode jamais ser invocado em um escopo de transação. Caso isso aconteça, uma exceção <strong>javax.ejb.EJBException</strong> será lançada.</p>
<p><strong>Conclusão</strong></p>
<p>Esse modelo de controle transacional é bastante simples de se aplicar, mas ao mesmo tempo poderoso. Como ele fica muito fácil definir as <strong>unidades de trabalho</strong> &#8211; ou, escopos de transação &#8211; e garantir as características <strong>ACID</strong> em sua aplicação de software.</p>
<p>Mas se você não usa EJB3, tudo bem também, não há problema, fico te devendo um post sobre controle transacional com <a href="http://www.springframework.org/" target="_blank">Spring Framework</a>.  =)</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://leandrosilva.com.br/2008/08/12/transacionando-ejb3-session-beans/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

