<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Elemar DEV</title>
	<atom:link href="http://elemarjr.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://elemarjr.net</link>
	<description>Tecnologia e desenvolvimento .net</description>
	<lastBuildDate>Sun, 29 Jan 2012 19:11:18 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='elemarjr.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/5ea29b775e2b805f0f1e9fbebf132906?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Elemar DEV</title>
		<link>http://elemarjr.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://elemarjr.net/osd.xml" title="Elemar DEV" />
	<atom:link rel='hub' href='http://elemarjr.net/?pushpress=hub'/>
		<item>
		<title>&#201; hora de pensar em Enterprise Architecture</title>
		<link>http://elemarjr.net/2012/01/29/hora-de-pensar-em-enterprise-architecture/</link>
		<comments>http://elemarjr.net/2012/01/29/hora-de-pensar-em-enterprise-architecture/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 15:09:10 +0000</pubDate>
		<dc:creator>elemarjr</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[carreira]]></category>
		<category><![CDATA[Enterprise Architecture]]></category>

		<guid isPermaLink="false">https://elemarjr.wordpress.com/?p=2180</guid>
		<description><![CDATA[Olá pessoal. Tudo certo?! Algumas idéias, uma vez aceitas, influenciam radicalmente a forma como percebemos e reagimos ao mundo. Nesse exato momento, estou sendo previlegiado com uma dessas experiências. Na última semana tive a honra e a oportunidade de ouvir Markus Cristen (com blog e perfis no facebook e twitter) falar sobre Enterprise Architecture. Fiquei [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2180&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Tudo certo?!</p>
<p>Algumas idéias, uma vez aceitas, influenciam radicalmente a forma como percebemos e reagimos ao mundo. Nesse exato momento, estou sendo previlegiado com uma dessas experiências.</p>
<p>Na última semana tive a honra e a oportunidade de ouvir Markus Cristen (com <a href="http://blogs.technet.com/b/markuschristen/">blog</a> e perfis no <a href="http://www.facebook.com/mrkschrstn">facebook</a> e <a href="https://twitter.com/#!/MarkusChristen">twitter</a>) falar sobre Enterprise Architecture. Fiquei impressionado a princípio e, voltando para casa, decidi que era hora de estudar mais sobre o assunto. Assim, resolvi começar a leitura de <a href="http://www.amazon.com/Enterprise-Architecture-Strategy-Foundation-Execution/dp/1591398398">Enterprise Architecture as Strategy</a> recomendado pelo Waldemir Cambiucci (<a href="http://blogs.msdn.com/b/wcamb/">blog</a> e <a href="https://twitter.com/#!/wcamb">twitter</a>) há quase um ano (o que posso dizer?! Sou lento para algumas coisas).</p>
<h2>O que é Enterprise Architecture?</h2>
<p>Uma boa definição formal é:</p>
<blockquote><p>the organizing logic for core business process and IT infrastrucutre reflecting the standarization and integration of a company’s operating model.</p>
</blockquote>
<p>Ou seja, é uma iniciativa que explicita a organização dos processos e infraestrutura de forma a suportar o negócio.</p>
<p>Embora tal relação pareça óbvia, é impressionante como parece negligenciada atualmente.Como destacado por Einstein:</p>
<blockquote><p>The significant problems we face cannot be solved by the same level of thinking that created them.</p>
</blockquote>
<h2>Enterprise Architecture: TI ou Negócio?</h2>
<p>Por que ficar preso na limitância do “ou”, quando podemos nos libertar na supremacia do “e”. Enterprise Architecture é uma disciplina de TI <strong><em>e</em></strong> Negócio.</p>
<p>Veja, Enterprise Architecture trata da integração dos processos de negócio e da padronização dos processos de negócio. Logo, não é objeto apenas de TI. É algo mais amplo – é objeto de negócio.</p>
<h2>Qual é o papel do Enterprise Architect?</h2>
<p>Veja:</p>
<blockquote><p>In a business wrold that is changing faster than ever befor, the top-performing firms create a stable base – they digitize their core process and embed thos process into a foundation for execution. This stable foundation makes a company both more efficient and more agile than its competitors.</p>
</blockquote>
<p>Essa descrição está perfeitamente alinhada com o que já vimos sobre Enterprise Architeture. Logo, o papel do “Enterprise Architect” é orquestrar as iniciativas de organização dos processos de negócio e infraestrutura de TI de forma a refletir a padronização e integração do modelo de operações de uma companhia.</p>
<p>Enterprise Architect é uma posição estratégica, pois Enterprise Architecutre é, fundamentalmente, uma das expressões da estratégia (recomendo ler “<a href="http://elemarjr.net/2011/12/14/algumas-palavras-sobre-essa-tal-de-estratgia/">Algumas palavras sobre essa tal Estratégia</a>”). </p>
<h2>Relação entre “Enterprise Architecture” e vantagem competitiva</h2>
<p>Considere:</p>
<blockquote><p>Top-performing companies define how they will do business (an <strong>operating model</strong>) and design the processes and infrastrucutre critical to their <strong>current and future operations </strong>(enterprise architecture), which guide the evolution of their foundation for execution.</p>
</blockquote>
<p>Dessa forma:</p>
<blockquote><p>Top-performing companies can create a low-cost, high-quality core of stability and constancy in a turbulent world. With a strong digitized core, these companies slide smoothly into the next opportunity while their competitors stumble.</p>
</blockquote>
<p>Há uma relação clara e consistentemente repetida entre a formação de vantagens competitivas e a existência de uma “Enterprise Architecture” (mesmo quando não reconhecida dessa forma). Embora não tenha causalidade efetivamente demonstrada (recomendo ler “<a href="http://elemarjr.net/2012/01/22/essa-tal-causalidade/">Essa tal causalidade</a>”), há indícios para tal.</p>
<h2>Oportunidades</h2>
<p>O papel de “Enterprise Architect” ainda está vago na maioria das organizações. Isso fica evidente pela forma “não profissional” como a Enterprise Architecture ainda é conduzida (quando é).</p>
<p>Na maioria das organizações, ainda há um descolamento evidente entre a institucionalização de infraestrutura de TI e processos com os objetivos do negócio. Muitas empresas tem seu departamento de TI “feature-driven” ou, pior, “vendor-driven” e, como esse ainda é o padrão dominante, não há consequências notáveis.</p>
<p>Entretanto, cada vez mais, TI está sendo percebido como custo. TI não é auto-remunerado, depende do negócio e este está ficando (pelo cenário competitivo) cada vez mais exigente.</p>
<p>O alinhamento entre IT e business é inevitável. IT Architecture precisa ser cada vez mais “value-driven” ou “strategic-driven”. Para atingir isso, é necessário institucionalizar a realização da “Enterprise Architecture”.</p>
<p>O trabalho de Enterprise Architect, além de ter poder de causar impacto real nos negócios, se aproxima muito da estratégia. Logo, é sabidamente melhor remunerado.</p>
<p>Enfim, oportunidades!</p>
<p>Em posts futuros, volto ao tema descrevendo mais as atividades relacionadas a formulação da “Enterprise Architecture” e, consequentemente, o papel do “Enterprise Architect” (Na exata medida em que eu internalize mais tais conceitos)</p>
<p>Era isso.</p>
<br /> Tagged: <a href='http://elemarjr.net/tag/arquitetura/'>Arquitetura</a>, <a href='http://elemarjr.net/tag/carreira/'>carreira</a>, <a href='http://elemarjr.net/tag/enterprise-architecture/'>Enterprise Architecture</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elemarjr.wordpress.com/2180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elemarjr.wordpress.com/2180/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elemarjr.wordpress.com/2180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elemarjr.wordpress.com/2180/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elemarjr.wordpress.com/2180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elemarjr.wordpress.com/2180/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elemarjr.wordpress.com/2180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elemarjr.wordpress.com/2180/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elemarjr.wordpress.com/2180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elemarjr.wordpress.com/2180/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elemarjr.wordpress.com/2180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elemarjr.wordpress.com/2180/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elemarjr.wordpress.com/2180/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elemarjr.wordpress.com/2180/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2180&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elemarjr.net/2012/01/29/hora-de-pensar-em-enterprise-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/784c5d06fca162d5fc3fbe59e25e5180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elemarjr</media:title>
		</media:content>
	</item>
		<item>
		<title>Por um mundo com mais POESIA!</title>
		<link>http://elemarjr.net/2012/01/28/por-um-mundo-com-mais-poesia/</link>
		<comments>http://elemarjr.net/2012/01/28/por-um-mundo-com-mais-poesia/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 01:30:38 +0000</pubDate>
		<dc:creator>elemarjr</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[poesia]]></category>

		<guid isPermaLink="false">https://elemarjr.wordpress.com/?p=2177</guid>
		<description><![CDATA[Olá pessoal. Tudo certo?! Dentre todas as coisas que não sei, a que mais sinto falta é escrever poesia. Não estou falando de versos simples, ou de frases de efeito, ou de desabafos bêbados (Esses, eu até tento escrever). Estou falando de poesia de verdade. Peço licença aos amigos, mas vou tomar a liberdade de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2177&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Tudo certo?!</p>
<p>Dentre todas as coisas que não sei, a que mais sinto falta é escrever poesia. Não estou falando de versos simples, ou de frases de efeito, ou de desabafos bêbados (Esses, eu até tento escrever). Estou falando de poesia de verdade.</p>
<p>Peço licença aos amigos, mas vou tomar a liberdade de compartilhar algumas coisas que, honestamente, gostaria de ter escrito. Infelizmente, me falta competência para tal. Então, tomarei a liberdade de tomar posse de palavras que não são minhas.</p>
<p>Vez ou outra, quem sabe, farei posts como esse. Usarei essa tag! Caso não goste, ignore, por favor.</p>
<h2>Vinícius de Moraes</h2>
<p>Vinícius de Moraes explica magicamente o que é necessário ao poeta.</p>
<blockquote><p>Eu sei e você sabe     <br />Já que a vida quis assim      <br />Que nada nesse mundo levará você de mim      <br />Eu sei e você sabe      <br />Que a distância não existe      <br />Que todo grande amor      <br />Só é bem grande se for triste      <br />Por isso meu amor      <br />Não tenha medo de sofrer      <br />Que todos os caminhos      <br />Me encaminham a você.</p>
<p>Assim como o Oceano, só é belo com o luar      <br />Assim como a Canção, só tem razão se se cantar      <br />Assim como uma nuvem, só acontece se chover      <br />Assim como o poeta, só é bem grande se sofrer      <br />Assim como viver sem ter amor, não é viver      <br />Não há você sem mim      <br />E eu não existo sem você!</p>
</blockquote>
<p>E encontra magistralmente a descrição da fidelidade (Soneto da Fidelidade)</p>
<blockquote><p>De tudo ao meu amor serei atento      <br />Antes, e com tal zelo, e sempre, e tanto      <br />Que mesmo em face do maior encanto      <br />Dele se encante mais meu pensamento.</p>
<p>Quero vivê-lo em cada vão momento      <br />E em seu louvor hei de espalhar meu canto      <br />E rir meu riso e derramar meu pranto      <br />Ao seu pesar ou seu contentamento</p>
<p>E assim, quando mais tarde me procure      <br />Quem sabe a morte, angústia de quem vive      <br />Quem sabe a solidão, fim de quem ama</p>
<p>Eu possa me dizer do amor (que tive):      <br />Que não seja imortal, posto que é chama      <br />Mas que seja infinito enquanto dure.</p>
</blockquote>
<h2>Mário Quintana</h2>
<p>Quintana, fala de decepções com tanta leveza que parece ignorar a própria dor.</p>
<blockquote><p>Da vez primeira em que me assassinaram,     <br />Perdi um jeito de sorrir que eu tinha.      <br />Depois, a cada vez que me mataram,      <br />Foram levando qualquer coisa minha.</p>
<p>Hoje, dos meu cadáveres eu sou      <br />O mais desnudo, o que não tem mais nada.      <br />Arde um toco de Vela amarelada,      <br />Como único bem que me ficou.</p>
<p>Vinde! Corvos, chacais, ladrões de estrada!      <br />Pois dessa mão avaramente adunca      <br />Não haverão de arracar a luz sagrada!      <br />Aves da noite! Asas do horror! Voejai!      <br />Que a luz trêmula e triste como um ai,      <br />A luz de um morto não se apaga nunca!</p>
</blockquote>
<p>Quando fala sobre o tempo, (Ah! Os relógios)</p>
<blockquote><p>Amigos, não consultem os relógios     <br />quando um dia eu me for de vossas vidas      <br />em seus fúteis problemas tão perdidas      <br />que até parecem mais uns necrológicos&#8230;</p>
<p>Porque o tempo é uma invenção da morte:      <br />não o conhece a vida &#8211; a verdadeira &#8211;      <br />em que basta um momento de poesia      <br />para nos dar a eternidade inteira.</p>
<p>Inteira, sim, porque essa vida eterna      <br />somente por si mesma é dividida:      <br />não cabe, a cada qual, uma porção.</p>
<p>E os anjos entreolham-se espantados      <br />quando alguém &#8211; ao voltar a si da vida &#8211;      <br />acaso lhes indaga que horas são&#8230;</p>
</blockquote>
<h2>Chico Buarque</h2>
<p>E por falar de relações, que tal “Mil Perdões”</p>
<blockquote><p>Te perdôo     <br />Por fazeres mil perguntas      <br />Que em vidas que andam juntas      <br />Ninguém faz      <br />Te perdôo      <br />Por pedires perdão      <br />Por me amares demais</p>
<p>Te perdôo     <br />Te perdôo por ligares      <br />Pra todos os lugares      <br />De onde eu vim      <br />Te perdôo      <br />Por ergueres a mão      <br />Por bateres em mim</p>
<p>Te perdôo     <br />Quando anseio pelo instante de sair      <br />E rodar exuberante      <br />E me perder de ti      <br />Te perdôo      <br />Por quereres me ver      <br />Aprendendo a mentir (te mentir, te mentir)</p>
<p>Te perdôo     <br />Por contares minhas horas      <br />Nas minhas demoras por aí      <br />Te perdôo      <br />Te perdôo porque choras      <br />Quando eu choro de rir      <br />Te perdôo      <br />Por te trair</p>
</blockquote>
<h2>Fernando Pessoa</h2>
<p>Há como falar em texto bem escrito, sem mencionar Fernando Pessoa (Não sei quantas almas tenho)</p>
<blockquote><p>Não sei quantas almas tenho.     <br />Cada momento mudei.      <br />Continuamente me estranho.      <br />Nunca me vi nem acabei.      <br />De tanto ser, só tenho alma.      <br />Quem tem alma não atem calma.      <br />Quem vê é só o que vê,      <br />Quem sente não é quem é,      <br />Atento ao que sou e vejo,      <br />Torno-me eles e não eu.      <br />Cada meu sonho ou desejo      <br />É do que nasce e não meu.      <br />Sou minha própria paisagem;      <br />Assisto à minha passagem,      <br />Diverso, móbil e só,      <br />Não sei sentir-me onde estou.      <br />Por isso, alheio, vou lendo      <br />Como páginas, meu ser.      <br />O que sogue não prevendo,      <br />O que passou a esquecer.      <br />Noto à margem do que li      <br />O que julguei que senti.      <br />Releio e digo: “Fui eu?”      <br />Deus sabe, porque o escreveu.</p>
</blockquote>
<h2>Ponto-e-vírgula</h2>
<p>Haveria muito mais para citar, mas acho que é um bom começo. Afinal, como diria Carlos Drummond,</p>
<blockquote><p>A minha vontade é forte, mas a minha disposição de obedecer-lhe é fraca.</p>
</blockquote>
<p>Por agora, era isso!</p>
<p><img style="border-style:none;" class="wlEmoticon wlEmoticon-winkingsmile" alt="Smiley piscando" src="http://elemarjr.files.wordpress.com/2012/01/wlemoticon-winkingsmile4.png?w=594" /></p>
<br /> Tagged: <a href='http://elemarjr.net/tag/poesia/'>poesia</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elemarjr.wordpress.com/2177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elemarjr.wordpress.com/2177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elemarjr.wordpress.com/2177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elemarjr.wordpress.com/2177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elemarjr.wordpress.com/2177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elemarjr.wordpress.com/2177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elemarjr.wordpress.com/2177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elemarjr.wordpress.com/2177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elemarjr.wordpress.com/2177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elemarjr.wordpress.com/2177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elemarjr.wordpress.com/2177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elemarjr.wordpress.com/2177/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elemarjr.wordpress.com/2177/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elemarjr.wordpress.com/2177/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2177&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elemarjr.net/2012/01/28/por-um-mundo-com-mais-poesia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/784c5d06fca162d5fc3fbe59e25e5180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elemarjr</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/wlemoticon-winkingsmile4.png" medium="image">
			<media:title type="html">Smiley piscando</media:title>
		</media:content>
	</item>
		<item>
		<title>Garantindo desacoplamento com Message Endpoints</title>
		<link>http://elemarjr.net/2012/01/28/garantindo-desacoplamento-com-message-endpoints/</link>
		<comments>http://elemarjr.net/2012/01/28/garantindo-desacoplamento-com-message-endpoints/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 22:24:10 +0000</pubDate>
		<dc:creator>elemarjr</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[EIP]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[MSMQ]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">https://elemarjr.wordpress.com/?p=2174</guid>
		<description><![CDATA[Olá pessoal. Tudo certo!? Nesse post, concluo uma relação de “Enterprise Integration Patterns” fundamentais. Se você está chegando agora, deve considerar ver posts anteriores relacionados: Trocando mensagens (entre aplicações) usando MSMQ (com C#) Ganhando Flexibilidade e Escalabilidade com Mensageria e “Pipes and Filters” (usando C#) Encaminhamento condicional de mensagens com Message Router (usando C#) Promovendo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2174&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Tudo certo!?</p>
<p>Nesse post, concluo uma relação de “Enterprise Integration Patterns” fundamentais. Se você está chegando agora, deve considerar ver posts anteriores relacionados:</p>
<ol>
<li><a href="http://elemarjr.net/2012/01/25/trocando-mensagens-entre-aplicaes-usando-msmq-usando-c/">Trocando mensagens (entre aplicações) usando MSMQ (com C#)</a></li>
<li><a href="http://elemarjr.net/2012/01/26/ganhando-flexibilidade-e-escalabilidade-com-mensageria-e-pipes-and-filters-usando-c/">Ganhando Flexibilidade e Escalabilidade com Mensageria e “Pipes and Filters” (usando C#)</a></li>
<li><a href="http://elemarjr.net/2012/01/27/encaminhamento-condicional-de-mensagens-com-message-router-usando-c/">Encaminhamento condicional de mensagens com Message Router (usando C#)</a></li>
<li><a href="http://elemarjr.net/2012/01/28/promovendo-compatibilidade-com-message-translator-usando-c/">Promovendo compatibilidade com Message Translator (usando C#)</a></li>
</ol>
<p>Como pode notar, até aqui, mesclei alguma prática com teoria. Para a parte prática, usei fundamentalmente MSMQ. Entretanto, o contexto teórico é aplicável a outros serviços de mensageria, bem como o próprio Windows Azure.</p>
<p>Agora, vou deixar o código um pouco de lado. </p>
<h2>O que é um Message Endpoint?</h2>
<p>Pattern que garante baixo acoplamento entre aplicações e serviços/infraestrutura de mensageria. Observe:</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image41.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb41.png?w=418&#038;h=158" width="418" height="158" /></a></p>
<p>Nesse diagrama, podemos perceber algums elementos importantes:</p>
<ol>
<li>aplicações independentes enviando e recebendo mensagens;</li>
<li>sistema especialista de mensageria (nos exemplos, estou usando MSMQ);</li>
<li>Filtros executando algum tipo de processamento/direcionamento/conversão das mensagens.</li>
</ol>
<p>Repare que esses elementos são “independentes” (não fazem parte do mesmo pacote). </p>
<p>Um Message Endpoint nada mais é que um componente interfaceando a aplicação e a infraestrutura de mensageria.</p>
<h2>Entendendo melhor a relação infra de mensageria com nossos aplicativos</h2>
<p>Um sistema de mensageria opera de forma semelhante a um servidor/serviço. Ele recebe e responde requisições. </p>
<p>Como “servidor”, sistemas de mensageria tem clientes. Nesse contexto, as aplicações que os utilizam.</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image42.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb42.png?w=531&#038;h=233" width="531" height="233" /></a></p>
<p>Considere:</p>
<ul>
<li>O server provê uma API para que seus clientes possam interagir com ele;</li>
<li>Essa API não é “application-specific”, e sim “domain-specific”;</li>
</ul>
<h2>Por que um Messaging Endpoint é importante?</h2>
<p>O Messaging Endpoint é o “ponto-de-ligação” entre nossos aplicativos e a API do servidor de mensageria. </p>
<p>Adotando esse pattern, permitimos que o restante da aplicação saiba pouco sobre: formato de mensagens; canais; etc. </p>
<p>Message Endpoint encapsula o servidor de mensageria (e suas particularidades) do resto da aplicação. Assim se decidirmos&#160; escolher outro mecanismo, bastará substituir esse componente preservando todo o resto.</p>
<h2>Boas práticas na escrita de Message Endpoints</h2>
<p>Message Endpoints devem:</p>
<ul>
<li>enviar mensagens (para o “servidor” de mesageria) ou receber. Nunca fazer as duas coisas;</li>
<li>publicar mensagens em apenas uma Queue;</li>
</ul>
<p>Logo, devem existir tantos endpoints quanto canais de comunicação e/ou operações.</p>
<p>Era isso!</p>
<br /> Tagged: <a href='http://elemarjr.net/tag/arquitetura/'>Arquitetura</a>, <a href='http://elemarjr.net/tag/eip/'>EIP</a>, <a href='http://elemarjr.net/tag/messaging/'>Messaging</a>, <a href='http://elemarjr.net/tag/msmq/'>MSMQ</a>, <a href='http://elemarjr.net/tag/patterns/'>Patterns</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elemarjr.wordpress.com/2174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elemarjr.wordpress.com/2174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elemarjr.wordpress.com/2174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elemarjr.wordpress.com/2174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elemarjr.wordpress.com/2174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elemarjr.wordpress.com/2174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elemarjr.wordpress.com/2174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elemarjr.wordpress.com/2174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elemarjr.wordpress.com/2174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elemarjr.wordpress.com/2174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elemarjr.wordpress.com/2174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elemarjr.wordpress.com/2174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elemarjr.wordpress.com/2174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elemarjr.wordpress.com/2174/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2174&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elemarjr.net/2012/01/28/garantindo-desacoplamento-com-message-endpoints/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/784c5d06fca162d5fc3fbe59e25e5180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elemarjr</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb41.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb42.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Perseguindo a Inova&#231;&#227;o</title>
		<link>http://elemarjr.net/2012/01/28/perseguindo-a-inovao/</link>
		<comments>http://elemarjr.net/2012/01/28/perseguindo-a-inovao/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 20:12:33 +0000</pubDate>
		<dc:creator>elemarjr</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[carreira]]></category>
		<category><![CDATA[inovação]]></category>

		<guid isPermaLink="false">https://elemarjr.wordpress.com/?p=2167</guid>
		<description><![CDATA[Olá pessoal. Tudo certo?! Há quem defenda que a inovação é fundamental para a continuidade de qualquer organização. Concordo com isso! Mas, a pergunta que fica é: “Como inovar?!” Há métodos, processos e tudo mais. Entretanto, penso que a adoção destes atrapalhe o começo da jornada. Para mim, a busca pela inovação começa pela formação [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2167&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Tudo certo?!</p>
<p>Há quem defenda que a inovação é fundamental para a continuidade de qualquer organização. Concordo com isso! Mas, a pergunta que fica é: “Como inovar?!”</p>
<p>Há métodos, processos e tudo mais. Entretanto, penso que a adoção destes atrapalhe o começo da jornada. Para mim, a busca pela inovação começa pela formação do ambiente inovador. </p>
<p>Neste post, pretendo costurar uma série de crenças pessoais adquiridas com a experiência e com meus estudos. Não pretendo esgotar o assunto (isso seria impossível). </p>
<p>Este post é uma provocação. Meu objetivo é, com os feedbacks, entender o que outras pessoas pensam sobre o tema.</p>
<h2>Conceituando Inovação (ou, Inovação não é criatividade)</h2>
<p>Eis algo polêmico! Afinal, o que é inovação!? Existem diversas definições, muitas conflitantes, para esse termo tão importante. </p>
<p>Para mim:</p>
<blockquote><p>Inovação é tudo aquilo que produz “dinheiro novo”!</p>
</blockquote>
<p>Boas idéias que não conseguem gerar “dinheiro novo” são pouco mais que nada. Talvez, demonstrações de criatividade. Mas, com certeza, pouco inovadoras.</p>
<blockquote><p>Nós, brasileiros, somos extremamente criativos. Precisamos ser mais inovadores.</p>
</blockquote>
<p><em><font color="#ff0000">Não concorda com essa definição? Proponha outra nos comentários.</font></em></p>
<h2>O segredo está no ambiente</h2>
<p>Somente pessoas podem produzir Inovação. Ou seja, a inovação é produção fundamentalmente humana.</p>
<blockquote><p>Para inovar é preciso gente!</p>
</blockquote>
<p>Infelizmente (ou felizmente), máquinas não podem inovar! Em consquência disso, da mesma forma como acontece com a motivação, penso que processos ou métodos acabem não sendo muito eficientes. </p>
<blockquote><p>A gestão eficiente da inovação começa na criação de um ambiente favorável.</p>
</blockquote>
<p>Da mesma forma,</p>
<blockquote><p>O ambiente inovador depende de um esforço real para sua formação e continuidade.</p>
</blockquote>
<p>Ou seja, o segredo para a inovação está no ambiente.</p>
<h2>Como é um ambiente favorável a inovação?</h2>
<p>Muita gente acredita que um ambiente inovador é aquele que:</p>
<ul>
<li>incentiva TODAS as pessoas a colaborar com idéias;</li>
<li>premia o acerto, sem, necessariamente, condenar o erro;</li>
<li>facilitam a realização de projetos novos e propensamente inovadores;</li>
</ul>
<p>Concordo com tudo isso. Mas, acho que é insuficiente! Veja:</p>
<ul>
<li>Mesmo em empresas reconhecidamente inovadoras, as &quot;melhores idéias” não saem do “banco de idéias”. Geralmente são combinados das áreas de Marketing e P&amp;D;</li>
<li>Nem todas as empresas “inovadoras” são tão tolerantes ao erro. A Apple, por exemplo, é famosa pela busca ao perfeccionismo (e baixa tolerância com a mediocridade);</li>
<li>Projetos inovadores raramente conseguem conviver com a gestão da rotina. Na prática, quando “a coisa aperta”, todas as pessoas e recursos relacionados a projetos novos são realocados.</li>
</ul>
<p>Para mim, </p>
<blockquote><p>um ambiente favorável a inovação é aquele que permite a manutenção e combinação de insights. É aquele que depende da geração do “dinheiro novo”!</p>
</blockquote>
<h2>Boas idéias não surgem de uma hora para outra</h2>
<blockquote><p>Diferente do que costumamos reconhecer, a idéia genial, aquela que gera inovação, não surge de uma hora para outra.</p>
</blockquote>
<p>Inovadores reconhecem que boas idéias são decorrentes de processos com dois, três, quatro anos! Aliás,</p>
<blockquote><p>Boas idéias costumam ser resultado da combinação de insights mais antigos; maturados e especializados.</p>
</blockquote>
<p>Perceba,</p>
<blockquote><p>Geralmente, alguém tem “metade” de uma boa idéia. Apenas quando essa “metade” é combianda com outra é que surge o fundamento inovador.</p>
</blockquote>
<p>Quando começamos algo, não temos a visão completa do que iremos realizar. Boas idéias, incluindo as inovadoras, precisam de tempo de incubação.</p>
<h2>Voltando ao ambiente favorável a inovação…</h2>
<p>Como já havia dito, um ambiente inovador é aquele que permite a combinação de insights. Por insight, quero dizer a “meia idéia”. Aquela porção inovadora que, sozinha, não é suficiente. </p>
<blockquote><p>Um ambiente inovador é aquele que permite que as pessoas divulguem e compartilhem seus insights. Que tolera a maturação! </p>
</blockquote>
<p>Queremos ambientes inovadores, temos que incentivar a formação de comunidades de prática. Ampliar a criatividade implica na intensificação da conectividade.</p>
<blockquote><p>Ambientes inovadores aproximam gente boa! Pessoas realmente interessadas em <strong>conceber</strong> o melhor.</p>
</blockquote>
<p>Logo,</p>
<blockquote><p>Inovação não ocorre em função da quantidade, e sim da qualidade.</p>
</blockquote>
<p>Por isso,</p>
<blockquote><p>Grandes orçamentos destinados para a inovação não implicam em projetos inovadores. </p>
</blockquote>
<p>Pois,</p>
<blockquote><p>Por incrível que pareça, um time diferenciado custa menos que um time de medíocres.</p>
</blockquote>
<p>Há os realizadores, pessoas que conseguem transformar boas idéias em realidade. Infelizmente, essas pessoas, geralmente, tem dificuldades para compreender e participar do processo criativo. A relação entre criativos e executores costuma ser conflituosa.</p>
<blockquote><p>O conflito entre criativos e executores é alcançado pela comunhão de objetivos;</p>
</blockquote>
<h2>O que quero dizer por maturação?</h2>
<p>Como falei no início, para mim, inovação sempre gera dinheiro novo.</p>
<h2></h2>
<blockquote><p>Somos remunerados (ganhamos dinheiro) como pagamento relacionado a entrega de algum valor.</p>
</blockquote>
<p>Logo,</p>
<blockquote><p>Uma idéia inovadora implica na formação clara de uma “<strong>proposta de valor</strong>”.</p>
</blockquote>
<p>Também sabemos que a relação entre dinheiro e valor é tensa! A “conversão” de valor entregue em dinheiro é chamada “<strong>monetização</strong>”.</p>
<p>Entretanto, para que possamos “entregar o valor”, precisamos definir e trabalhar um composto de <strong>pessoas, processos e recursos.</strong></p>
<p>Assim, a inovação depende da definição e estabilização de:</p>
<ul>
<li> uma proposta de valor coerente;</li>
<li>um formato de monetização adequado para a remuneração efetiva do capital e do trabalho;</li>
<li>a determinação e constituição de uma estrutura com pessoas, processos e recursos adequados.</li>
</ul>
<p>O problema, é que isso não ocorre de uma hora para outra. A definição de todos esses elementos é algo interativo (não é possível acertar de primeira). </p>
<h2>Empresas grandes tem mais dificuldade em inovar</h2>
<p>É claro e notório que empresas maiores tem mais dificuldade para inovar. Por quê? Penso que a resposta seja que elas raramente dependem da formação do dinheiro novo para a continuidade (imediata!) de suas operações.</p>
<p>Empresas novas carecem de uma proposta de valor. Por isso, é vital aproximar pessoas com insights que possam ser úteis para formação dessa proposta, bem como meios de monetização.</p>
<p>Empresas novas (e, consequentemente, menores) são mais tolerantes ao erro (por falta de opção) que empresas maiores. Além disso, há poucos vícios a superar.</p>
<p>Para uma empresa grande inovar, precisa voltar a funcionar com a agilidade de uma empresa pequena. </p>
<h2>Concluindo..</h2>
<p>Um ambiente inovador é aquele que permite que pessoas compartilhem seus insights (metades de boas idéias). Além disso, é um ambiente disciplinado (não burocrático) voltado a definição de uma proposta de valor clara, que se preocupa com monetização e execução. Se for uma empresa grande, talvez precise pensar em “separar” o negócio novo.</p>
<p>Inovação depende de tudo isso. E é só o começo…</p>
<p>Por agora, era isso.</p>
<p>E você, o que acha?!</p>
<br /> Tagged: <a href='http://elemarjr.net/tag/carreira/'>carreira</a>, <a href='http://elemarjr.net/tag/inovacao/'>inovação</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elemarjr.wordpress.com/2167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elemarjr.wordpress.com/2167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elemarjr.wordpress.com/2167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elemarjr.wordpress.com/2167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elemarjr.wordpress.com/2167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elemarjr.wordpress.com/2167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elemarjr.wordpress.com/2167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elemarjr.wordpress.com/2167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elemarjr.wordpress.com/2167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elemarjr.wordpress.com/2167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elemarjr.wordpress.com/2167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elemarjr.wordpress.com/2167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elemarjr.wordpress.com/2167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elemarjr.wordpress.com/2167/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2167&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elemarjr.net/2012/01/28/perseguindo-a-inovao/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/784c5d06fca162d5fc3fbe59e25e5180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elemarjr</media:title>
		</media:content>
	</item>
		<item>
		<title>Promovendo compatibilidade com Message Translator (usando C#)</title>
		<link>http://elemarjr.net/2012/01/28/promovendo-compatibilidade-com-message-translator-usando-c/</link>
		<comments>http://elemarjr.net/2012/01/28/promovendo-compatibilidade-com-message-translator-usando-c/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 16:14:51 +0000</pubDate>
		<dc:creator>elemarjr</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[EIP]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[MSMQ]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">https://elemarjr.wordpress.com/?p=2165</guid>
		<description><![CDATA[Olá pessoal. Tudo certo?! Outro dia, falamos sobre como aumentar a flexibilidade de nossos sistemas usando “Pipes and Filters”. Também exploramos alternativas para aumentar integração e escalabilidade através de “Message Routers” Nesse post, continuo explorando alternativas arquiteturais de integração (e mensageria) para EIP, através de “Message Translators”. Este pattern também está descrito no excelente livro [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2165&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Tudo certo?!</p>
<p>Outro dia, falamos sobre como aumentar a flexibilidade de nossos sistemas usando “<a href="http://elemarjr.net/2012/01/26/ganhando-flexibilidade-e-escalabilidade-com-mensageria-e-pipes-and-filters-usando-c/">Pipes and Filters</a>”. Também exploramos alternativas para aumentar integração e escalabilidade através de “<a href="http://elemarjr.net/2012/01/27/encaminhamento-condicional-de-mensagens-com-message-router-usando-c/">Message Routers</a>”</p>
<p>Nesse post, continuo explorando alternativas arquiteturais de integração (e mensageria) para <a href="http://elemarjr.net/tag/EIP">EIP</a>, através de “Message Translators”. </p>
<p>Este pattern também está descrito no excelente livro <a href="http://www.eaipatterns.com/">Enterprise Integration Patterns</a>. </p>
<h2>O que é um Message Translator?!</h2>
<p>Um “Message Translator” é um tipo especial de filtro (veja <a href="http://elemarjr.net/2012/01/26/ganhando-flexibilidade-e-escalabilidade-com-mensageria-e-pipes-and-filters-usando-c/">Pipes and Filters</a>) que converte mensagens representadas em um determinado formato para outro. Assim, ampliamos as possibilidades de integração enre aplicações.</p>
<p>Com alguma abstração, podemos assumir que este padrão é equivalente ao <a href="http://www.dofactory.com/Patterns/PatternAdapter.aspx">Adapter</a> descrito pelo <a href="http://www.amazon.com/exec/obidos/ASIN/0201633612/enterpriseint-20">GoF</a>. Veja:</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image40.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb40.png?w=260&#038;h=176" width="260" height="176" /></a></p>
<p>Ou seja,</p>
<ul>
<li>temos uma Message Queue com dados em determinado formato;</li>
<li>temos um “Filtro” (unidade de processamento);</li>
<li>temos um “resultante”, a mensagem traduzida, sendo produzida pelo “translator” e encaminhada para uma Queue de destino.</li>
</ul>
<h2>Implementando</h2>
<p>Como já disse, um Message Translator, na prática, é apenas um tipo especial de filtro. Por isso, a classe abstrata que <a href="http://elemarjr.net/2012/01/26/ganhando-flexibilidade-e-escalabilidade-com-mensageria-e-pipes-and-filters-usando-c/">definimos outro dia</a> continua válida. Relembrando:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:082cd17d-2d2a-45ff-ba81-55faf4a1be9a" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp;">
using System;
using System.Messaging;

namespace MSMQ.PipersAndFilters
{
    public abstract class Filter
    {
        readonly MessageQueue inputQueue;
        readonly MessageQueue outputQueue;

        public Filter(MessageQueue input, MessageQueue output)
        {
            this.inputQueue = input;
            this.outputQueue = output;
        }

        public void Start()
        {
            this.inputQueue.ReceiveCompleted += OnReceiveCompleted;
            this.inputQueue.BeginReceive();
        }

        void OnReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            var source = (MessageQueue)sender;
            var message = source.EndReceive(e.AsyncResult);
            message.Formatter = new XmlMessageFormatter(new [] { typeof(T) });
            this.outputQueue.Send(Process(message));
            this.inputQueue.BeginReceive();
        }

        protected abstract Message Process(Message original);
    }
}
</pre>
</pre>
</div>
<p>Para implementar um translator, nesse cenário, basta implementar o método <strong><em>Process</em></strong> adequadamente. Perceba:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:38a7c325-e3e5-460e-8391-46a9c891028d" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp;">
using System;
using System.Messaging;

namespace MSMQ.PipersAndFilters
{
    public class ContertStringToRichDataFilter :
        Filter
    {
        public ContertStringToRichDataFilter(MessageQueue input, MessageQueue output) :
            base(input, output)
        {}

        protected override Message Process(Message original)
        {
            var s = (string)original.Body;
            return new Message(
                new RichData(s) 
                );
        }
    }

    public class RichData
    {
        private RichData()
        {}

        public RichData(string data)
        {
            this.Data = data;
            this.Length = data.Length;
        }

        public string Data { get; set; }
        public int Length { get; set; } 
    }
}
</pre>
</pre>
</div>
<p>Era isso!</p>
<br /> Tagged: <a href='http://elemarjr.net/tag/arquitetura/'>Arquitetura</a>, <a href='http://elemarjr.net/tag/eip/'>EIP</a>, <a href='http://elemarjr.net/tag/messaging/'>Messaging</a>, <a href='http://elemarjr.net/tag/msmq/'>MSMQ</a>, <a href='http://elemarjr.net/tag/patterns/'>Patterns</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elemarjr.wordpress.com/2165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elemarjr.wordpress.com/2165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elemarjr.wordpress.com/2165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elemarjr.wordpress.com/2165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elemarjr.wordpress.com/2165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elemarjr.wordpress.com/2165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elemarjr.wordpress.com/2165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elemarjr.wordpress.com/2165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elemarjr.wordpress.com/2165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elemarjr.wordpress.com/2165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elemarjr.wordpress.com/2165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elemarjr.wordpress.com/2165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elemarjr.wordpress.com/2165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elemarjr.wordpress.com/2165/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2165&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elemarjr.net/2012/01/28/promovendo-compatibilidade-com-message-translator-usando-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/784c5d06fca162d5fc3fbe59e25e5180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elemarjr</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb40.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>C++ 101 &#8211; Parte 11 &#8211; Structures</title>
		<link>http://elemarjr.net/2012/01/28/c-101-parte-11-structures/</link>
		<comments>http://elemarjr.net/2012/01/28/c-101-parte-11-structures/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 15:01:19 +0000</pubDate>
		<dc:creator>elemarjr</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[C++ 101]]></category>

		<guid isPermaLink="false">https://elemarjr.wordpress.com/?p=2158</guid>
		<description><![CDATA[Olá pessoal. Tudo certo!? Depois de muitos posts em C#, alguma coisa em Javascript, voltemos a falar um pouco sobre C++. Nesse post, mostro como definir structures. Se desejar, consulte os posts anteriores da série. Structures?! Um structure é um tipo que podemos definir usando a palavra-chave struct (por isso, muitas vezes, chamamos struct e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2158&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Tudo certo!?</p>
<p>Depois de muitos posts em C#, alguma coisa em <a href="http://elemarjr.net/tag/javascript/">Javascript</a>, voltemos a falar um pouco sobre C++.</p>
<p>Nesse post, mostro como definir structures. Se desejar, consulte os <a href="http://elemarjr.net/tag/c-101/">posts anteriores da série</a>.</p>
<h2>Structures?!</h2>
<p>Um structure é um tipo que podemos definir usando a palavra-chave <strong><em>struct </em></strong>(por isso, muitas vezes, chamamos struct e não structure). Surgiu na linguagem C e foi incorporada e ampliada em C++.</p>
<p>Aliás, em C++, podemos utilizar, sem prejuízos, classes no lugar de Strucutures. Entretanto, devido a grande quantidade de código legado (principalmente programação Windows), ainda é amplamente utilizada.</p>
<p>Em uma structure, podemos combinar conjuntos de dados.</p>
<h2>Definindo um struct (exemplo simples)</h2>
<p>Definir um struct é muito simples. Veja:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:e229f472-f06a-496a-9431-c19900f50a2f" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: cpp; pad-line-numbers: true;">
struct PERSON
{
	char Name[50];
	int Age;
};
</pre>
</pre>
</div>
<p>Simplificando (muito talvez), reunimos um conjunto de “declarações de variáveis” dentro de um bloco identificado como <strong><em>struct</em></strong>. Cada “variável” definida é chamada, dentro de um struct, de campo.</p>
<h2>Inicializando um Struct</h2>
<p>A forma mais simples de atribuir valores aos “campos” de um <strong><em>struct</em></strong> é em sua inicialização. Acessar esses dados é simples (principalmente se você já usa C#). Observe:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:a8a0733c-f120-4fba-bbb6-de59991caa38" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: cpp;">
#include 

struct PERSON
{
	char Name[50];
	int Age;
};

void main(void)
{
	PERSON p = {
		"Elemar Jr",
		32
	};

	std::cout &lt;&lt; &quot;Hello World, &quot; &lt;&lt; 
		p.Name &lt;&lt; 
		std::endl;
}
</pre>
</pre>
</div>
<p>Perceba:</p>
<ul>
<li>os valores para os campos da struct são passados “um-por-um”, em sequência (a mesma dos atributos), entre chaves “{}”;</li>
<li>para acessar o valor de um campo, usamos a notação &lt;variável&gt;.&lt;campo&gt;;</li>
</ul>
<p>Se desejar, pode ignorar a inicialização e simplesmente atribuir valor para os campos:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:2a5be2fe-3389-477e-a32f-c804f61c1190" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: cpp;">
#include 

struct RECTANGLE
{
	int Top;
	int Left;
	int Width;
	int Height;
};

void main(void)
{
	RECTANGLE r1 = {0, 0, 50, 200};
	RECTANGLE r2;
	r2.Top = 10;
	r2.Left = 40;
	r2.Width = 200;
	r2.Height = 300;

	std::cout &lt;&lt; &quot;R1 T:&quot; &lt;&lt; r1.Top 
		&lt;&lt; &quot;, L: &quot; &lt;&lt; r1.Left
		&lt;&lt; &quot;, H:&quot; &lt;&lt; r1.Height 
		&lt;&lt; &quot;, W:&quot; &lt;&lt; r1.Width
		&lt;&lt; std::endl;

	std::cout &lt;&lt; &quot;R2 T:&quot; &lt;&lt; r2.Top 
		&lt;&lt; &quot;, L: &quot; &lt;&lt; r2.Left
		&lt;&lt; &quot;, H:&quot; &lt;&lt; r2.Height 
		&lt;&lt; &quot;, W:&quot; &lt;&lt; r2.Width
		&lt;&lt; std::endl;
}
</pre>
</pre>
</div>
<h2>Structs e ponteiros</h2>
<p>Structs, por default, são <strong><em>value-types</em></strong>. Observe:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:849800bf-0c85-4976-b9f2-f62e5c537041" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: cpp;">
#include 

struct RECTANGLE
{
	int Top;
	int Left;
	int Width;
	int Height;
};

void main(void)
{
	RECTANGLE r1 = {0, 0, 50, 200};
	RECTANGLE r2 = r1;

	std::cout 
		&lt;&lt; &quot;R1 Address: &quot; &lt;&lt; &amp;r1 &lt;&lt; std::endl
		&lt;&lt; &quot;R2 Address: &quot; &lt;&lt; &amp;r2 &lt;&lt; std::endl;
}
</pre>
</pre>
</div>
<p>A execução desse aplicativo mostra que <strong><em>r1</em></strong> e <strong><em>r2</em></strong> ocupam posições diferentes na memória. Se desejarmos compartilhar o mesmo “valor”, usamos ponteiros (que tal dar uma olhada na <a href="http://elemarjr.net/2011/09/22/c-101-parte-4-ponteiros-conceitos-bsicos/">parte 4</a>?!). Observe:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:baeb8fc5-5f15-42ae-bae0-9bdcf451fad2" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: cpp;">
#include 

struct RECTANGLE
{
	int Top;
	int Left;
	int Width;
	int Height;
};

void main(void)
{
	RECTANGLE r1 = {0, 0, 50, 200};
	RECTANGLE* r2 = &amp;r1;
	(*r2).Top = 10;

	std::cout &lt;&lt; &quot;R1 T:&quot; &lt;&lt; r1.Top 
		&lt;&lt; &quot;, L: &quot; &lt;&lt; r1.Left
		&lt;&lt; &quot;, H:&quot; &lt;&lt; r1.Height 
		&lt;&lt; &quot;, W:&quot; &lt;&lt; r1.Width
		&lt;&lt; std::endl;

	std::cout &lt;&lt; &quot;R2 T:&quot; &lt;&lt; (*r2).Top 
		&lt;&lt; &quot;, L: &quot; &lt;&lt; (*r2).Left
		&lt;&lt; &quot;, H:&quot; &lt;&lt; (*r2).Height 
		&lt;&lt; &quot;, W:&quot; &lt;&lt; (*r2).Width
		&lt;&lt; std::endl;
}
</pre>
</pre>
</div>
<p>A execução desse program mostra <strong><em>r1</em></strong> e <strong><em>r2</em></strong> compartilham o mesmo valor.</p>
<p>Era isso!</p>
<p> <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<br /> Tagged: <a href='http://elemarjr.net/tag/c/'>C</a>, <a href='http://elemarjr.net/tag/c-101/'>C++ 101</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elemarjr.wordpress.com/2158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elemarjr.wordpress.com/2158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elemarjr.wordpress.com/2158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elemarjr.wordpress.com/2158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elemarjr.wordpress.com/2158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elemarjr.wordpress.com/2158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elemarjr.wordpress.com/2158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elemarjr.wordpress.com/2158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elemarjr.wordpress.com/2158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elemarjr.wordpress.com/2158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elemarjr.wordpress.com/2158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elemarjr.wordpress.com/2158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elemarjr.wordpress.com/2158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elemarjr.wordpress.com/2158/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2158&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elemarjr.net/2012/01/28/c-101-parte-11-structures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/784c5d06fca162d5fc3fbe59e25e5180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elemarjr</media:title>
		</media:content>
	</item>
		<item>
		<title>Encaminhamento condicional de mensagens com Message Router (usando C#)</title>
		<link>http://elemarjr.net/2012/01/27/encaminhamento-condicional-de-mensagens-com-message-router-usando-c/</link>
		<comments>http://elemarjr.net/2012/01/27/encaminhamento-condicional-de-mensagens-com-message-router-usando-c/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 22:43:42 +0000</pubDate>
		<dc:creator>elemarjr</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[EIP]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[MSMQ]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">https://elemarjr.wordpress.com/?p=2156</guid>
		<description><![CDATA[Olá pessoal. Tudo certo!? Continuando nossas discussões sobre mensageria, minha proposta para esse post é discutir mais um importante pattern: Message Router. O fundamento desse pattern consiste em transferir mensagens de uma determinada Queue para outras segundo um critério, sem alterar as mensagens. Sua aplicação é ampla. Podemos considerar esse pattern tanto em sistemas mais [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2156&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Tudo certo!?</p>
<p>Continuando nossas discussões sobre <a href="http://elemarjr.net/tag/messaging">mensageria</a>, minha proposta para esse post é discutir mais um importante pattern: Message Router.</p>
<p>O fundamento desse pattern consiste em transferir mensagens de uma determinada Queue para outras segundo um critério, sem alterar as mensagens. Sua aplicação é ampla. Podemos considerar esse pattern tanto em sistemas mais simples de mensageria (usando MSMQ, por exemplo), quanto em sistemas mais robustos (em ambientes no Windows Azure).</p>
<p>Esse pattern pode ser combinado com “Pipers And Filters” (apresentei implantação no <a href="http://elemarjr.net/2012/01/26/ganhando-flexibilidade-e-escalabilidade-com-mensageria-e-pipes-and-filters-usando-c/">post anterior</a>).</p>
<h2>Cenário mais simples: Transferência de Queue (um-para-um)</h2>
<p>O cenário mais simples para um Message Router é a transferência de uma mensagem de uma Queue para outra.</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image37.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb37.png?w=188&#038;h=177" width="188" height="177" /></a></p>
<p>O ícone que estou usando na ilustração foi sugerido no livro <a href="http://www.eaipatterns.com/">Enterprise Integration Patterns</a> na descrição desse padrão. Eis a implementação simples:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:524abf0b-fc9d-44d2-b456-5ea667f0bc07" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp;">
using System;
using System.Messaging;

namespace MSMQ.MessageRouters
{
    public sealed class SimpleMessageRouter
    {
        readonly MessageQueue inputQueue;
        readonly MessageQueue outputQueue;

        public SimpleMessageRouter(MessageQueue input, MessageQueue output)
        {
            this.inputQueue = input;
            this.outputQueue = output;
        }

        public void Start()
        {
            this.inputQueue.ReceiveCompleted += OnReceiveCompleted;
            this.inputQueue.BeginReceive();
        }

        void OnReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            var source = (MessageQueue)sender;
            var message = source.EndReceive(e.AsyncResult);
            this.outputQueue.Send(message);
            this.inputQueue.BeginReceive();
        }
    }
}
</pre>
</pre>
</div>
<p>Esse pattern ajuda quando precisamos “ampliar” sistemas legados. Movimentando mensagens entre Queues, podemos compatibilizar/integrar sistemas que não compartilhem a mesma estrutura.</p>
<h2>Direcionamento condicional (If-Else)</h2>
<p>Em sistemas mais complexos, podemos desejar que mensagens sigam fluxos de processamento diferentes. Podemos considerar desvios de acordo com o conteúdo da própria mensagem ou conforme determinadas condições do ambiente. Em qualquer um desses cenários, podemos associar um predicado as mensagens que, de acordo com sua realização, encaminhe-as para Queues adequadas. Observe:</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image38.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb38.png?w=260&#038;h=193" width="260" height="193" /></a></p>
<p>Aqui, a implementação em C#.</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:dee0e7d1-5148-4672-931e-5e3e991926a2" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp;">
using System;
using System.Messaging;

namespace MSMQ.MessageRouters
{
    public sealed class IfMessageRouter
    {
        readonly MessageQueue inputQueue;
        readonly Predicate condition;
        readonly MessageQueue ifTrueQueue;
        readonly MessageQueue ifFalseQueue;

        public IfMessageRouter(MessageQueue input, 
            Predicate condition,
            MessageQueue ifTrue,
            MessageQueue ifFalse
            )
        {
            this.inputQueue = input;
            this.condition = condition;
            this.ifTrueQueue = ifTrue;
            this.ifFalseQueue = ifFalse;
        }

        public void Start()
        {
            this.inputQueue.ReceiveCompleted += OnReceiveCompleted;
            this.inputQueue.BeginReceive();
        }

        void OnReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            var source = (MessageQueue)sender;
            var message = source.EndReceive(e.AsyncResult);

            if (this.condition(message))
                SendTrue(message);
            else
                SendFalse(message);

            this.inputQueue.BeginReceive();
        }

        void SendTrue(Message message)
        {
            if (this.ifTrueQueue != null)
                this.ifTrueQueue.Send(message);
        }

        void SendFalse(Message message)
        {
            if (this.ifFalseQueue != null)
                this.ifFalseQueue.Send(message);
        }
    }
}
</pre>
</pre>
</div>
<p>Perfeito. Continuando na linha de exemplos que mostrei nos <a href="http://elemarjr.net/2012/01/26/ganhando-flexibilidade-e-escalabilidade-com-mensageria-e-pipes-and-filters-usando-c/">post anterior</a>, adiciono um condicional para que apenas mensagens começando com “A” sejam encaminhadas. Observe:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:d56b91ed-1d55-48a7-a6d4-2214fbf2ae71" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp;">
using System;
using System.Messaging;

namespace MSMQ.MessageRouters
{
    class Program
    {
         static void Main(string[] args)
        {
            Console.Title = "If Message Router";

            Predicate startsWithA = (message) =&gt;
            {
                message.Formatter = new XmlMessageFormatter(new[] { typeof(string) });
                return (((string)message.Body).StartsWith("A")) ;
            };

            new IfMessageRouter(
                GetMessageQueue(@".\private$\sample_queue"),
                startsWithA,
                GetMessageQueue(@".\private$\sample_transformed"),
                null
                ).Start();

            Console.WriteLine("Press ENTER to exit");
            Console.ReadLine();
        }

        static MessageQueue GetMessageQueue(string name)
        {
            if (MessageQueue.Exists(name))
                return new MessageQueue(name);
           
            return MessageQueue.Create(name);
        }
    }
}
</pre>
</pre>
</div>
<p>É um exemplo bem simples (lembre-se que mensagens raramente serão strings, como indicado aqui). Mas, dá para reproduzir facilmente. </p>
<h2>Direcionamento condicional (Case)</h2>
<p>Condicionals If-Else podem se tornar custosos. Principalmente, por poderem exigir etapas e Queues adicionais. A solução está em suportar <strong><em>Cases</em></strong>.</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image39.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb39.png?w=260&#038;h=184" width="260" height="184" /></a></p>
<p>Agora, a implementação em C#:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:959af835-5823-4195-a7e8-e79045dbf198" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp;">
using System;
using System.Messaging;
using System.Collections.Generic;

namespace MSMQ.MessageRouters
{
    public sealed class CaseMessageRouter
    {
        readonly MessageQueue inputQueue;
        readonly Func evaluationFunc;
        readonly Dictionary caseQueues;
        readonly MessageQueue defaultQueue;

        public CaseMessageRouter(
            MessageQueue input, 
            Func evaluationFunc,
            Dictionary caseQueues,
            MessageQueue defaultQueue
            )
        {
            this.inputQueue = input;
            this.evaluationFunc = evaluationFunc;
            this.caseQueues = caseQueues;
            this.defaultQueue = defaultQueue;
        }

        public void Start()
        {
            this.inputQueue.ReceiveCompleted += OnReceiveCompleted;
            this.inputQueue.BeginReceive();
        }

        void OnReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            var source = (MessageQueue)sender;
            var message = source.EndReceive(e.AsyncResult);
            
            var key = this.evaluationFunc(message);

            if (this.caseQueues.ContainsKey(key))
                this.caseQueues[key].Send(message);
            else
                this.defaultQueue.Send(message);

            this.inputQueue.BeginReceive();
        }
    }
}
</pre>
</pre>
</div>
<p>Era isso!</p>
<br /> Tagged: <a href='http://elemarjr.net/tag/arquitetura/'>Arquitetura</a>, <a href='http://elemarjr.net/tag/eip/'>EIP</a>, <a href='http://elemarjr.net/tag/messaging/'>Messaging</a>, <a href='http://elemarjr.net/tag/msmq/'>MSMQ</a>, <a href='http://elemarjr.net/tag/patterns/'>Patterns</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elemarjr.wordpress.com/2156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elemarjr.wordpress.com/2156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elemarjr.wordpress.com/2156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elemarjr.wordpress.com/2156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elemarjr.wordpress.com/2156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elemarjr.wordpress.com/2156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elemarjr.wordpress.com/2156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elemarjr.wordpress.com/2156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elemarjr.wordpress.com/2156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elemarjr.wordpress.com/2156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elemarjr.wordpress.com/2156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elemarjr.wordpress.com/2156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elemarjr.wordpress.com/2156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elemarjr.wordpress.com/2156/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2156&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elemarjr.net/2012/01/27/encaminhamento-condicional-de-mensagens-com-message-router-usando-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/784c5d06fca162d5fc3fbe59e25e5180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elemarjr</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb37.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb38.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb39.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Ganhando Flexibilidade e Escalabilidade com Mensageria e &#8220;Pipes and Filters&#8221; (usando C#)</title>
		<link>http://elemarjr.net/2012/01/26/ganhando-flexibilidade-e-escalabilidade-com-mensageria-e-pipes-and-filters-usando-c/</link>
		<comments>http://elemarjr.net/2012/01/26/ganhando-flexibilidade-e-escalabilidade-com-mensageria-e-pipes-and-filters-usando-c/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 01:48:56 +0000</pubDate>
		<dc:creator>elemarjr</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[EIP]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[MSMQ]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">https://elemarjr.wordpress.com/?p=2148</guid>
		<description><![CDATA[Olá pessoal. Tudo certo!? Tornar nossas aplicações escaláveis é um grande (e importante) desafio. A abordagem mais comum passa pela decomposição de grandes atividades em “tarefas” menores que possam ser executadas com independência de estado. Um dos patterns arquiteturais mais comuns para esse desafio é o “Pipes and Filters” (que já foi discutido amplamente em [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2148&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Tudo certo!?</p>
<p>Tornar nossas aplicações escaláveis é um grande (e importante) desafio. A abordagem mais comum passa pela decomposição de grandes atividades em “tarefas” menores que possam ser executadas com independência de estado.</p>
<p>Um dos patterns arquiteturais mais comuns para esse desafio é o “Pipes and Filters” (que já foi discutido amplamente em <a href="http://elemarjr.net/2011/03/22/architectural-patterns-pipes-and-filters/">outro post</a>). A implementação desse pattern pode ser muito simplificada através da adoção de Message Queues (comuns para MSMQ e Azure), como pipes, e a implementação de “unidades de processamento”, como filters.</p>
<h2>Endentendo um pouco mais o cenário</h2>
<p>Imagine que você esteja processando solicitações de geração de mídia personalizada (como ocorre no site da <a href="http://safaribooks.com">Safari Books</a>, por exemplo). A geração de um “pdf personalizado” incorre em diversas etapas de processamento que podem ser fracionadas. Observe:</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image34.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb34.png?w=549&#038;h=205" width="549" height="205" /></a></p>
<p>&#160;</p>
<p>Essa abordagem permite que essas etapas de processamento possam ser paralelizadas. Veja:</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image35.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb35.png?w=537&#038;h=262" width="537" height="262" /></a></p>
<p>Como o “Process A” não precisa esperar que seus subsequentes concluam suas atividades, pode atender uma nova solicitação. Na próxima vez que concluir, precisa apenas colocar a atividade na&#160; “sua” Queue de tarefas concluídas. Ela será processada assim que o processo relacionado estiver pronto.</p>
<p>A capacidade e “velocidade” de processamento tenderá para a do “Filter” mais lento (em atividades em “cadeia” a performance da corrente inteira é determinada pelo elo mais fraco). Sabendo disso, podemos escalar pontos específicos minimizando impactos e maximizando o resultado.</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image36.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb36.png?w=547&#038;h=268" width="547" height="268" /></a></p>
<p>Sou fascinado pela Teoria das Restrições (você é?). Mas esse seria um tema para outro post.</p>
<h2>Implementando um “Filter” abstrato usando MSMQ</h2>
<p>Interagir com o MSMQ, como indicado no <a href="http://elemarjr.net/2012/01/25/trocando-mensagens-entre-aplicaes-usando-msmq-usando-c/">post anterior</a> é muito simples. Entretanto, podemos generalizar (e facilitar) a criação de filters. Observe:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:9e8d9622-4a64-4ea4-ae68-d06bf2683259" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp; pad-line-numbers: true;">
using System;
using System.Messaging;

namespace MSMQ.PipersAndFilters
{
    public abstract class Filter
    {
        readonly MessageQueue inputQueue;
        readonly MessageQueue outputQueue;

        public Filter(MessageQueue input, MessageQueue output)
        {
            this.inputQueue = input;
            this.outputQueue = output;
        }

        public void Start()
        {
            this.inputQueue.ReceiveCompleted += OnReceiveCompleted;
            this.inputQueue.BeginReceive();
        }

        void OnReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            var source = (MessageQueue)sender;
            var message = source.EndReceive(e.AsyncResult);
            message.Formatter = new XmlMessageFormatter(new [] { typeof(T) });
            this.outputQueue.Send(Process(message));
            this.inputQueue.BeginReceive();
        }

        protected abstract Message Process(Message original);
    }
}
</pre>
</pre>
</div>
<p>Basicamente, esse filtro permanece “ouvindo” a Queue “input” indefinidamente. Cada vez que uma mensagem é recebida, é processada e encaminhada para a Queue “output”.</p>
<p>Para criar um exemplo simples, considere que desejemos converter todas as mensagens colocadas na Queue para maiúsculo:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:3af12e85-d13f-4aa0-a0cb-02ff45a565a4" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp;">
using System.Messaging;

namespace MSMQ.PipersAndFilters
{
    public class ToUpperFilter : Filter
    {
        public ToUpperFilter(MessageQueue input, MessageQueue output) :
            base(input, output)
        {}

        protected override Message Process(Message original)
        {
            var s = (string) original.Body;
            return new Message(s.ToUpper());
        }
    }
}
</pre>
</pre>
</div>
<p>Bacana, não. Por fim, veja como é simples colocar esse filtro para funcionar:</p>
<p><div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:d2a4cd75-ea23-4e77-9462-c027e5e53660" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp;">
using System;
using System.Messaging;

namespace MSMQ.PipersAndFilters
{
    class Program
    {
         static void Main(string[] args)
        {
            Console.Title = "Filter";

            new ToUpperFilter(
                GetMessageQueue(@".\private$\sample_queue"),
                GetMessageQueue(@".\private$\sample_transformed")
                ).Start();

            Console.WriteLine("Press ENTER to exit");
            Console.ReadLine();
        }

        static MessageQueue GetMessageQueue(string name)
        {
            if (MessageQueue.Exists(name))
                return new MessageQueue(name);
           
            return MessageQueue.Create(name);
        }
    }
}
</pre>
</pre>
</div>
<p>Esse “filtro” interage perfeitamente com o exemplo do post anterior. Acho que você pegou a idéia.</p>
<p>Perceba que essa implementação não suporta transações (o que não é bom no mundo real). Mas, esse, é tema para outro post.</p>
<p>Por agora, era isso!</p>
<br /> Tagged: <a href='http://elemarjr.net/tag/arquitetura/'>Arquitetura</a>, <a href='http://elemarjr.net/tag/eip/'>EIP</a>, <a href='http://elemarjr.net/tag/messaging/'>Messaging</a>, <a href='http://elemarjr.net/tag/msmq/'>MSMQ</a>, <a href='http://elemarjr.net/tag/patterns/'>Patterns</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elemarjr.wordpress.com/2148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elemarjr.wordpress.com/2148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elemarjr.wordpress.com/2148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elemarjr.wordpress.com/2148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elemarjr.wordpress.com/2148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elemarjr.wordpress.com/2148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elemarjr.wordpress.com/2148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elemarjr.wordpress.com/2148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elemarjr.wordpress.com/2148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elemarjr.wordpress.com/2148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elemarjr.wordpress.com/2148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elemarjr.wordpress.com/2148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elemarjr.wordpress.com/2148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elemarjr.wordpress.com/2148/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2148&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elemarjr.net/2012/01/26/ganhando-flexibilidade-e-escalabilidade-com-mensageria-e-pipes-and-filters-usando-c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/784c5d06fca162d5fc3fbe59e25e5180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elemarjr</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb34.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb35.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb36.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Trocando mensagens (entre aplica&#231;&#245;es) usando MSMQ (com C#)</title>
		<link>http://elemarjr.net/2012/01/25/trocando-mensagens-entre-aplicaes-usando-msmq-usando-c/</link>
		<comments>http://elemarjr.net/2012/01/25/trocando-mensagens-entre-aplicaes-usando-msmq-usando-c/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 23:53:50 +0000</pubDate>
		<dc:creator>elemarjr</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[EIP]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[MSMQ]]></category>

		<guid isPermaLink="false">https://elemarjr.wordpress.com/?p=2139</guid>
		<description><![CDATA[Olá pessoal. Tudo certo? Integrar aplicações não é tarefa fácil. Há diversas alternativas. Entretanto, as mais atraentes envolvem a utilização de algum tipo de mensageria. No “mundo Microsoft”, a alternativa mais comum é a utilização do MSMQ (Microsoft Messaging Queuing), que está na versão 5.0. Em .NET, a interface com essa tecnologia pode ocorrer tanto [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2139&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Tudo certo?</p>
<p>Integrar aplicações não é tarefa fácil. Há diversas alternativas. Entretanto, as mais atraentes envolvem a utilização de algum tipo de mensageria.</p>
<p>No “mundo Microsoft”, a alternativa mais comum é a utilização do MSMQ (<a href="http://msdn.microsoft.com/en-us/library/ms711472.aspx">Microsoft Messaging Queuing</a>), que está na versão 5.0. Em .NET, a interface com essa tecnologia pode ocorrer tanto através de WCF quanto pela API disponível na DLL <a href="http://msdn.microsoft.com/pt-br/library/system.messaging.aspx">System.Messaging</a>.</p>
<p>Este é apenas o primeiro de muitos posts que pretendo escrever sobre padrões de integração. Minha intenção é demonstrar todos aqueles descritos no excelente livro “<a href="http://www.eaipatterns.com/">Enterprise Integration Patterns</a>” de Gregor Hohpe e Bobby Woolf.</p>
<h2>Antes de começar</h2>
<p>O MSMQ é forncecido como um “componente” do sistema operacional. Para utilizar este componente, antes, precisamos habilitá-lo apropriadamente.</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image27.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb27.png?w=309&#038;h=271" width="309" height="271" /></a></p>
<p>Fazendo isso, poderemos “monitorar” (e interferir) no funcionamento do componente no “Management Console”</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image28.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb28.png?w=456&#038;h=327" width="456" height="327" /></a></p>
<h2>Pegando a idéia básica</h2>
<p>O conceito básico do MSMQ envolve em aplicações trocando mensagens. Vejamos a explicação <a href="http://msdn.microsoft.com/en-us/library/ms711472.aspx">disponível no MSDN</a>.</p>
<blockquote><p>Message Queuing (MSMQ) technology enables applications running at different times to communicate across heterogeneous networks and systems that may be temporarily offline. Applications send messages to queues and read messages from queues. The following illustration shows how a queue can hold messages that are generated by multiple sending applications and read by multiple receiving applications.</p>
</blockquote>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image29.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb29.png?w=364&#038;h=226" width="364" height="226" /></a></p>
<p>A segurança e confiabilidade dessa solução a credencia como alternativa interessante para comunicação entre aplicações.</p>
<h2>Pensando em Arquitetura</h2>
<p>Em sua forma mais básica, a arquitetura de uma aplicação com suporte a mensageria se baseia no relacionamento de apenas três componentes:</p>
<ol>
<li>Sending Application (Publisher)</li>
<li>Message Queue – fornecida completamente pelo MSMQ</li>
<li>Receiving Application (Subscriber)</li>
</ol>
<p>Entretanto, podemos projetar soluções mais ricas. Entre as opções arquiteturais mais frequentes, encontramos:</p>
<ul>
<li>Múltiplos publishers;</li>
<li>Múltiplos subscribers;</li>
<li>Múltiplas Queues;</li>
<li>Pipes e Filtros;</li>
<li>Tratadores de falha (com filas de falha, inclusive);</li>
<li>Roteadores;</li>
<li>Tradutores (mudando o formato da mensagem);</li>
<li>Adaptadores, Bridges e Bus;</li>
<li>etc.</li>
</ul>
<p>Cada uma dessas “opções” permite discussão rica que faremos com cuidado em momentos oportunos. Além disso, quase todos os padrões envolvendo Queues facilitam o desenvolvimento de soluções escaláveis.</p>
<h2>Exemplo simples para envio de mensagens</h2>
<p>Escrever um programa para enviar mensagens para uma Queue é algo bem simples. O exemplo que apresento aqui é uma aplicação console que envia toda digitação do usuário (após o Enter). Observe:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:b623966f-4283-466e-91eb-70324ad291e9" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp; pad-line-numbers: true;">
using System;
using System.Messaging;

namespace MessageSender
{
    class Program
    {
        const string queue_name = @&quot;.\private$\sample_queue&quot;;

        static void Main(string[] args)
        {
            Console.Title = &quot;Sender&quot;;
            
            MessageQueue queue;
            if (MessageQueue.Exists(queue_name))
                queue = new MessageQueue(queue_name);
            else
                queue = MessageQueue.Create(queue_name);

            while (true)
                queue.Send(Console.ReadLine());
        }
    }
}
</pre>
</pre>
</div>
<p>Consideremos:</p>
<ul>
<li>Para utilizar o suporte a Messaging do .NET (MSMQ), precisamos adicionar uma referência para <strong><em>System.Messaging</em></strong>;</li>
<li>Precisamos criar (ou abrir) uma <strong><em>queue</em></strong> de trabalho. Para isso, precisamos informar a “máquina” onde ela deverá ser criada (Por agora, deixemos esse “detalhe” para uma discussão futura);</li>
<li>Utilizamos o método <strong><em>Send</em></strong> para enviar mensagens. Podemos enviar (quase) qualquer objeto (precisa ser serializável) para a Queue;</li>
</ul>
<p>Veja a execução:</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image30.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb30.png?w=455&#038;h=232" width="455" height="232" /></a></p>
<p>No exemplo, enviei três mensagens para a Queue (que criamos). Consultando o Console Management, podemos confirmar isso. Observe:</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image31.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb31.png?w=539&#038;h=283" width="539" height="283" /></a></p>
<h2>Exemplo simples para recebimento de mensagens</h2>
<p>Escrever programas para receber mensagens também é bastante simples. Observe:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:94f5b167-c41a-41d4-88a4-66cd5435d4f5" class="wlWriterEditableSmartContent">
<pre style="white-space:normal;">
<pre class="brush: csharp;">
using System;
using System.Messaging;

namespace MessageReceiver
{
    class Program
    {
        const string queue_name = @&quot;.\private$\sample_queue&quot;;
        static void Main(string[] args)
        {
            Console.Title = &quot;Receiver&quot;;

            var queue = new MessageQueue(queue_name);
            queue.Formatter = new XmlMessageFormatter(new [] { typeof(string) });

            while (true)
                Console.WriteLine(&quot;Received: {0}&quot;, queue.Receive().Body);
        }
    }
}
</pre>
</pre>
</div>
<p>Consideremos:</p>
<ul>
<li>Para utilizar o suporte a Messaging do .NET (MSMQ), precisamos adicionar uma referência para <strong><em>System.Messaging</em></strong>;</li>
<li>Precisamos abrir uma <strong><em>queue</em></strong> de trabalho. </li>
<li>O tipo do objeto no “corpo da mensagem” deverá ser informado em um Formatter que será utilizado pela infra para “recriar” objetos enviados na mensagem. No exemplo que estou apresentando, usamos <strong><em>string</em></strong></li>
<li>Utilizamos o método <strong><em>Receive</em></strong> para receber mensagens (retirando-as da Queue). Por default, esse método “interrompe” a execução até que uma mensagem esteja disponível. Há outras sobrecargas para esse método que permitem que informemos um tempo limite de espera. Há também o método <strong><em>Peek</em></strong> que não retira a mensagem da fila;</li>
</ul>
<p>Executando esse programa, temos:</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image32.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb32.png?w=455&#038;h=231" width="455" height="231" /></a></p>
<p>Monitorando o status da queue, percebemos que todas as mensagens foram retiradas.</p>
<p><a href="http://elemarjr.files.wordpress.com/2012/01/image33.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;padding-top:0;" title="image" border="0" alt="image" src="http://elemarjr.files.wordpress.com/2012/01/image_thumb33.png?w=539&#038;h=283" width="539" height="283" /></a></p>
<p>Já temos um bom começo.</p>
<p>Era isso.</p>
<br /> Tagged: <a href='http://elemarjr.net/tag/arquitetura/'>Arquitetura</a>, <a href='http://elemarjr.net/tag/eip/'>EIP</a>, <a href='http://elemarjr.net/tag/messaging/'>Messaging</a>, <a href='http://elemarjr.net/tag/msmq/'>MSMQ</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elemarjr.wordpress.com/2139/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elemarjr.wordpress.com/2139/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elemarjr.wordpress.com/2139/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elemarjr.wordpress.com/2139/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elemarjr.wordpress.com/2139/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elemarjr.wordpress.com/2139/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elemarjr.wordpress.com/2139/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elemarjr.wordpress.com/2139/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elemarjr.wordpress.com/2139/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elemarjr.wordpress.com/2139/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elemarjr.wordpress.com/2139/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elemarjr.wordpress.com/2139/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elemarjr.wordpress.com/2139/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elemarjr.wordpress.com/2139/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2139&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elemarjr.net/2012/01/25/trocando-mensagens-entre-aplicaes-usando-msmq-usando-c/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/784c5d06fca162d5fc3fbe59e25e5180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elemarjr</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb27.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb28.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb29.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb30.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb31.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb32.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://elemarjr.files.wordpress.com/2012/01/image_thumb33.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>As pessoas REALMENTE t&#234;m dificuldades para aceitar mudan&#231;as?</title>
		<link>http://elemarjr.net/2012/01/24/as-pessoas-realmente-tm-dificuldades-para-aceitar-mudanas/</link>
		<comments>http://elemarjr.net/2012/01/24/as-pessoas-realmente-tm-dificuldades-para-aceitar-mudanas/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 01:27:08 +0000</pubDate>
		<dc:creator>elemarjr</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[carreira]]></category>

		<guid isPermaLink="false">https://elemarjr.wordpress.com/?p=2116</guid>
		<description><![CDATA[Olá pessoal. Tudo certo?! Há pouco tempo revisei uma de minhas crenças mais enraizadas: pessoas têm dificuldades em aceitar mudanças! Durante muito tempo assumi que, se há uma mudança, há resistência. Se as pessoas conquistaram uma “zona de conforto”, não vão aceitar qualquer coisa que as retire dessa posição. Lendo Dostoiévski, entendi que as pessoas [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2116&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Tudo certo?!</p>
<p>Há pouco tempo revisei uma de minhas crenças mais enraizadas: <strong>pessoas têm dificuldades em aceitar mudanças!</strong></p>
<p>Durante muito tempo assumi que, se há uma mudança, há resistência. Se as pessoas conquistaram uma “zona de conforto”, não vão aceitar qualquer coisa que as retire dessa posição. </p>
<p>Lendo Dostoiévski, entendi que as pessoas se acostumam a tudo, até mesmo a viver mal. Mais que isso, as pessoas defendem esse “mal viver”.</p>
<p>Pensava tudo isso. Não penso mais! aceito que exista algum “fundamento” psicológico nessa linha de pensamento. Entretanto, penso que, com mais frequência do que gostaríamos de reconhecer, trata-se apenas de uma saída fácil para nossa dificuldade em articular e argumentar defesas de nossas idéias.</p>
<h2></h2>
<h2>O problema da abordagem</h2>
<p>Toda vez que pensamos em uma mudança que implique na alteração das rotinas/modelos mentais de outras pessoas, costumamos (pelo menos, eu), inicialmente, ser otimistas demais quanto a suas reações. Assumimos que basta apresentar a “qualidade” de nossas idéias para que essas sejam aceitas imediatamente. </p>
<blockquote><p>Quando as pessoas apresentam obstáculos para realizar as mudanças, falamos que estão resistindo (e que isso é natural). Assim, vivemos em um ciclo vicioso de falsa aceitação da resitência alheia e tolerância para a nossa própria incompetência.</p>
</blockquote>
<p>Atualmente, penso que há um problema sério na abordagem de nossas propostas de mudança. Para mim, é isso que precisamos rever.</p>
<h2>O que costumamos ignorar?</h2>
<p>Penso que o o otimismo demasiado com novas idéias é o principal obstáculo para suas realizações. Ou seja, quando apresentamos (e defendemos) nossas idéias, habitualmente, pensamos apenas nas <strong>vantagens/facilidades resultantes da mudança</strong>. Entretanto, penso que deveríamos pensar em, pelo menos, quatro perspectivas. São elas:</p>
<ol>
<li>O que há de <strong>bom em mudar</strong>?</li>
<li>O que há de <strong>ruim em mudar</strong>?</li>
<li>O que haveria de <strong>bom em não mudar</strong>?</li>
<li>O que haveria de <strong>ruim em não mudar</strong>?</li>
</ol>
<p>Perceba, <strong>defendo que pensemos nos aspectos positivos/negativos de mudar E de não mudar</strong>!</p>
<p>Além disso, para termos sucesso, penso que devemos tentar praticar um pouco de empatia. Assim, devemos <strong>tentar </strong>responder a essas questões conforme nossa “posição” e conforme a posição daqueles que desejamos/precisamos envolver nas mudanças. Dessa forma, conseguimos “firmar” nossa posição e achar boas respostas para o “Sim, mas…”.</p>
<h2>Um exemplo prático (e, infelizmente, comum): adoção de testes de unidade automatizados</h2>
<p>Apenas para ilustrar meu ponto de vista, considere esse cenário/rotina comum:</p>
<ol>
<li>Programador vai a um evento e ouve falar sobre testes de unidade automatizados;</li>
<li>Superados os receios iniciais, absorvido nos excelentes argumentos de outros programadores mais experientes (!?), fica convencido de que conseguirá melhorar muito seu código escrevendo testes de unidade;</li>
<li>Programador volta para casa e “estuda um pouco” sobre como escrever testes;</li>
<li>Empolgado, programador tenta convencer a seus colegas e superiores das maravilhas da escrita dos testes de unidade;</li>
<li>Programador fica surpreso com a resistência dos colegas e superiores (maior resistência dos superiores, em teoria. maior resistência dos colegas, na prática);</li>
<li>Programador fica desanimado e desiste dos testes de unidade;</li>
<li>Programador reclama que seu chefe e/ou seus colegas não têm maturidade (senioridade) para implantar testes.</li>
</ol>
<p>Por que será que isso ocorreu? Atualmente, penso que o problema esteja relacionado a uma abordagem errada. Talvez, o problema esteja em realçar demais “o que há de bom em mudar”. Mas, considere, será que estamos preparados para argumentar sobre:</p>
<ul>
<li>os aspectos (aparentemente) ruins da mudança, como, por exemplo:</li>
<ul>
<li>tempo/esforço/custo adicionais (aparentes, ou não), relacionados a escrever e manter mais código (os testes de unidade)?</li>
<li>as dificuldades inerentes a garantir mais “testabilidade”, sobretudo em código legado?</li>
<li>o esforço relacionado a “capacitação” adicional da equipe?</li>
</ul>
<li>os aspectos (aparentemente) bons de “não mudar”, como, por exemplo:</li>
<ul>
<li>a manutenção do estado (e processos) atuais;</li>
</ul>
<li>os aspectos (aparentemente) ruins em “não mudar” – consequências em manter as coisas como estão (quem sabe, <a href="http://elemarjr.net/2011/03/02/entropia/">pensar um pouco mais sobre entropia</a>)</li>
</ul>
<p>Além disso, será que praticamos um pouco de empatia? Consideramos falar em termos de custo para quem está interessado em maximizar o “retorno sobre o investimento”?</p>
<p>Enfim, penso que, contrariando o senso comum, as pessoas estão dispostas a mudar! O problema é que, talvez, estejamos sendo pouco esforçados/persistentes e abrangentes em nossas argumentações.</p>
<p>O que você acha?</p>
<p>Era isso!</p>
<br /> Tagged: <a href='http://elemarjr.net/tag/carreira/'>carreira</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elemarjr.wordpress.com/2116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elemarjr.wordpress.com/2116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elemarjr.wordpress.com/2116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elemarjr.wordpress.com/2116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elemarjr.wordpress.com/2116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elemarjr.wordpress.com/2116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elemarjr.wordpress.com/2116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elemarjr.wordpress.com/2116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elemarjr.wordpress.com/2116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elemarjr.wordpress.com/2116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elemarjr.wordpress.com/2116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elemarjr.wordpress.com/2116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elemarjr.wordpress.com/2116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elemarjr.wordpress.com/2116/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elemarjr.net&amp;blog=14656382&amp;post=2116&amp;subd=elemarjr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elemarjr.net/2012/01/24/as-pessoas-realmente-tm-dificuldades-para-aceitar-mudanas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/784c5d06fca162d5fc3fbe59e25e5180?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elemarjr</media:title>
		</media:content>
	</item>
	</channel>
</rss>
