<?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>Rafaeltuelho&#039;s Weblog</title>
	<atom:link href="http://rafaeltuelho.net.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://rafaeltuelho.net.br</link>
	<description>algumas coisas para lembrar e compartilhar...</description>
	<lastBuildDate>Tue, 11 Jun 2013 02:26:15 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='rafaeltuelho.net.br' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Rafaeltuelho&#039;s Weblog</title>
		<link>http://rafaeltuelho.net.br</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://rafaeltuelho.net.br/osd.xml" title="Rafaeltuelho&#039;s Weblog" />
	<atom:link rel='hub' href='http://rafaeltuelho.net.br/?pushpress=hub'/>
		<item>
		<title>Oracle Fusion Middleware: conceitos</title>
		<link>http://rafaeltuelho.net.br/2013/02/15/oracle-fusion-middleware-conceitos/</link>
		<comments>http://rafaeltuelho.net.br/2013/02/15/oracle-fusion-middleware-conceitos/#comments</comments>
		<pubDate>Fri, 15 Feb 2013 19:14:57 +0000</pubDate>
		<dc:creator>rafaeltuelho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Middleware]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Infraestrutura]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[OFM]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Oracle Fusion Middleware]]></category>
		<category><![CDATA[weblogic]]></category>

		<guid isPermaLink="false">http://rafaeltuelho.net.br/?p=315</guid>
		<description><![CDATA[Oracle Fusion Middleware (OFM) é uma família de produtos que compreende desde ferramentas de desenvolvimento para a plataforma Java Enterprise Edition (JavaEE), até  soluções para integração de sistemas, gerenciamento de identidade, colaboração e Business Intelligence (BI). O OFM é fornecido e mantido pela empresa Oracle e é composto por uma grande variedade de produtos que [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=315&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.oracle.com/technetwork/middleware/interactive-reporting/overview/index.html" target="_blank">Oracle Fusion Middleware</a> (OFM) é uma família de produtos que compreende desde ferramentas de desenvolvimento para a plataforma <a href="http://www.oracle.com/technetwork/java/javaee/overview/index.html" target="_blank"><em>Java Enterprise Edition</em></a> (JavaEE), até  soluções para integração de sistemas, gerenciamento de identidade, colaboração e <em>Business Intelligence</em> (BI). O OFM é fornecido e mantido pela empresa Oracle e é composto por uma grande variedade de produtos que oferecem suporte ao desenvolvimento, implantação e gerenciamento de sistemas para a plataforma JavaEE.</p>
<p>De forma bem simplista podemos definir middleware como sendo o software responsável por conectar componentes de software ou aplicações corporativas. Em um sistema <a href="http://en.wikipedia.org/wiki/Multitier_architecture" target="_blank">multicamadas</a> (ex: três camadas: apresentação, lógica/negócio e dados) o <em><strong>Middle</strong></em>ware atua na camada do meio hospedando os componentes com a lógica de negócio da aplicação. Outra função importate do Middleware é fornecer a infraestrutura necessária para o desenvolvimento de aplicações de negócio (<em>business applications</em>). Serviços tais como: acesso concorrente à recursos computacionais, controle transacional, mensageria, segurança, logging etc. Tudo isso é oferecido pelo Middleware de forma, pelo menos em tese, a deixar o desenvolvedor responsável apenas com o que diz respeito ao negócio da aplicação.</p>
<p>A imagem a seguir destaca alguns componentes do OFM em uma visão de divisão em três camadas.</p>
<div class="wp-caption aligncenter" style="width: 666px"><a href="http://docs.oracle.com/cd/E23943_01/core.1111/e10103/img/ascon_dt_010.gif"><img alt="" src="http://docs.oracle.com/cd/E23943_01/core.1111/e10103/img/ascon_dt_010.gif" width="656" height="482" /></a><p class="wp-caption-text">Oracle Fusion Middleware Architecture</p></div>
<p>Não se preocupe com o significado de cada componente que aparece na imagem acima neste momento. Ao longo do post iremos comentar os principais deles.</p>
<p>Dada uma breve descrição sobre o OFM exponho neste post alguns conceitos importantes para aqueles que pretendem iniciar sua jornada pelo arcabouço de produtos que compõem o Middleware da Oracle.</p>
<p>Hoje em dia instalar um software não é tarefa complicada. Para obter o binário correto basta saber em qual plataforma (arquitetura de hardware e sistema operacional) de destino da instalação e realizar o download no site do fornecedor. Em seguida basta seguir o guia de instalação do produto. Entretanto, para alguns tipos de software, existem alguns aspectos importantes que devem ser observados para evitar problemas futuros. É o caso do Middleware. Uma solução de Middleware <span style="text-decoration:underline;">geralmente é composta</span> por uma variedade de componentes desenvolvida sob uma arquitetura modular. Essa característica implica uma certa complexidade na gerência do software que vai desde a instalação, operação até a gerência do ambiente.</p>
<h2>Middleware Component</h2>
<p>O primeiro conceito diz respeito aos tipos de componentes utilizados no OFM. Existem dois tipos:</p>
<ul>
<li><span style="line-height:13px;"><strong><em>java component</em></strong>: componente composto por uma ou mais aplicações e recursos JavaEE impltantado (deployado) em um domínio do Oracle Weblogic Server. Exemplos:</span>
<ul>
<li><em>Oracle SOA Suite</em></li>
<li><em>Oracle Webcenter Portal</em></li>
<li><em>Oracle Business Intelligence Enterprise Edition</em></li>
</ul>
</li>
<li><strong><em>system component</em></strong>: serviço (processo) gerenciado pelo <a href="http://docs.oracle.com/cd/E16764_01/doc.1111/e14007/intro.htm" target="_blank"><em>Oracle Process Manager and Notification</em> (OPMN)</a> &#8211; gerenciador de processos com uma interface de linha de comando (CLI). Exemplos:
<ul>
<li><em>Oracle Http Server</em></li>
<li><em>Oracle Web Cache</em></li>
<li><em>Oracle Internet Directory</em></li>
<li><em>Oracle Forms</em></li>
<li><em>Oracle Reports</em></li>
<li><em>Oracle Business Intelligence</em></li>
</ul>
</li>
</ul>
<p>Todo produto da linha OFM é executado sobre um mesmo componente de middleware: o <a href="http://www.oracle.com/technetwork/middleware/weblogic/overview/index.html" target="_blank"><strong>Weblogic Server</strong></a> (WLS). Esta é a &#8220;<em>runtime&#8221;</em> (não confundir com a Java Virtual Machine &#8211; JVM sobre a qual roda o Weblogic) de todo o middleware Oracle. Em praticamente toda a instalação de um produto OFM você encontrará uma estrutura de diretórios contendo os binários do Weblogic.</p>
<p>Após instalar o OFM teremos um ambiente composto por, pelo menos:</p>
<ul>
<li><span style="line-height:13px;">Um <em>Oracle Weblogic Server <strong>Domain</strong>,<strong> </strong></em>que nada mais é que um conjunto de instâncias de servidores conhecido como <strong><em>Managed Servers</em></strong><em>, </em>sendo que um deles é utilizado para administração dos demais &#8211; o<em> <strong>Administration Console</strong></em>. Os <em>managed servers</em> hospedam as aplicações e recursos (<em>java component</em>) JavaEE (<em>EJBs, Data Sources, JMS Destinations, etc</em>)<em>.</em><br />
</span></li>
<li>Um ou mais <em><strong>Oracle Instance</strong></em> (<em>system component</em>).</li>
<li>Se o componente/produto do OFM (ex: <em>Oracle Business Intelligence ou Oracle SOA Suite</em>) necessitar de um banco de dados de metadados, um database será criado como <strong><em>metadata repository</em></strong>.</li>
</ul>
<p>Dessa forma é muito importante se familiarizar com a estrutura de diretórios utilizada na instalação do WLS. A imagem abaixo esquematiza a estrutura criada para a instalação do produto <strong>Oracle SOA Suite</strong>.</p>
<div class="wp-caption aligncenter" style="width: 680px"><a href="http://docs.oracle.com/cd/E23943_01/core.1111/e10103/img/ascon_dt_007_mdlwr_hm.gif"><img alt="" src="http://docs.oracle.com/cd/E23943_01/core.1111/e10103/img/ascon_dt_007_mdlwr_hm.gif" width="670" height="175" /></a><p class="wp-caption-text">Oracle Middleware Home</p></div>
<h2>Middleware Home e Weblogic Home</h2>
<p>O <strong>Middleware Home</strong> é o diretório raiz de qualquer componente/produto (j<em>ava</em> ou s<em>ystem component</em>) do OFM. Logo abaixo encontra-se o <strong>Weblogic Server Home</strong> criado durante a instalação do Weblogic. O Weblogic Home hospeda o servidor de aplicação Weblogic.</p>
<div class="wp-caption aligncenter" style="width: 167px"><a href="http://docs.oracle.com/cd/E12839_01/install.1111/b32474/img/mw_home.gif"><img alt="" src="http://docs.oracle.com/cd/E12839_01/install.1111/b32474/img/mw_home.gif" width="157" height="161" /></a><p class="wp-caption-text">Weblogic Server Home após a instalação do Weblogic</p></div>
<p style="padding-left:30px;"><strong>NOTA: um detalhe importante e que confunde bastante em alguns casos é: em um mesmo Host o diretório <span style="color:#0000ff;">Middleware Home</span> <span style="text-decoration:underline;">deve ser único</span> para uma <span style="text-decoration:underline;">determinada <em>release</em> do OFM</span> (ex: <span style="color:#0000ff;">11g</span> ou <span style="color:#0000ff;">12c</span>). Outro detalhe é que dentro do Middleware Home só pode haver um <span style="color:#0000ff;">Weblogic Server Home</span>. Dessa forma não é possível instalar duas versões diferentes do Weblogic dentro de uma mesma estrutura do Middleware Home. Quando for necessário instalar <em>releases</em> diferentes do OFM em um mesmo Host recomenda-se criar estrutura de diretórios diferentes para cada <em>release</em> (ex: Middleware<span style="color:#0000ff;">11g<span style="color:#000000;"> e Middleware<span style="color:#0000ff;">12c</span></span></span>).</strong></p>
<p>No mesmo nível do Weblogic Server Home encontram-se outros diretórios. Abaixo descrevemos cada um deles.</p>
<h2>Oracle Home</h2>
<p>Com exceção do Weblogic Server Home, que contém os binários do application server, cada produto OFM é instalado em seu próprio <strong>Oracle Home</strong>. Este diretório armazena os binários do produto. Dessa forma nenhum processo escreve nele. No diagrama abaixo os binários do Oracle SOA Suite foram instalados dentro do Oracle Home chamado <strong>oracle_soa1</strong> (neste caso também referenciado como SOA Oracle Home). Para produtos do tipo <em>java component</em> um weblogic domain também é criado para hospeda a aplicação e recursos JavaEE que compõem o produto.</p>
<div id="attachment_338" class="wp-caption aligncenter" style="width: 262px"><a href="http://rafaeltuelho.files.wordpress.com/2013/02/oracle_home1.gif"><img class="size-full wp-image-338" alt="Oracle Home após a instalação do Oracle SOA Suite" src="http://rafaeltuelho.files.wordpress.com/2013/02/oracle_home1.gif?w=630"   /></a><p class="wp-caption-text">Oracle Home após a instalação do Oracle SOA Suite</p></div>
<h2>Domain Home</h2>
<p>Um Weblogic Domain deve ser entendido como um grupo lógico de <em>java components</em> (neste contexto são aplicações e recursos JavaEE). Um domínio é composto por um <strong><em><a href="http://docs.oracle.com/cd/E23943_01/core.1111/e10105/concepts.htm#CHDIGHHG" target="_blank">Administration Server</a> </em></strong>(geralmente referenciado como <em>admin server</em>) e geralmente possui um ou mais <a href="http://docs.oracle.com/cd/E23943_01/core.1111/e10105/concepts.htm#CHDBABGE" target="_blank"><strong><em>Managed Servers </em></strong></a>(também referenciados como instâncias do weblogic). As aplicações e recursos são implantadas e executadas dentro do(s) <em>Managed Server(s)</em>. Na instalação padrão de um produto do OFM a estrutura de diretórios utilizada para hospedar um domínio do weblogic segue o digrama abaixo:</p>
<div id="attachment_339" class="wp-caption aligncenter" style="width: 381px"><a href="http://rafaeltuelho.files.wordpress.com/2013/02/wls_elements_1.gif"><img class="size-full wp-image-339" alt="SOA Domain após a instalação do Oracle SOA Suite" src="http://rafaeltuelho.files.wordpress.com/2013/02/wls_elements_1.gif?w=630"   /></a><p class="wp-caption-text">SOA Domain após a instalação do Oracle SOA Suite</p></div>
<p>O domínio não necessariamente deve residir dentro do diretório <strong>User Projects</strong> na estrutura do <strong>Oracle Middleware Home</strong>. Observe que a estrutura utilizada para hospedar o <em>domain</em> está fora do Weblogic Home e pode, inclusive, residir fora do Middleware Home (ex: em um storage remoto utilizando um protocolo <strong>NFS</strong> ou <strong>SAN</strong>). O diagrama abaixo destaca o <em>domain</em> criado para o Oracle SOA Suite.</p>
<p>É muito comum a instalação de vários produtos OFM em um mesmo ambiente/host. Dessa forma cada produto pode utilizar seu próprio domínio weblogic. O diagrama abaixo destaca dois <em>domains</em> distintos: um para hospedar o <strong>Oracle WebCenter</strong> e outro para o <strong>Oracle SOA Suite</strong>. Observe também dois <em>Oracle Homes</em> distintos, um para cada produto OFM.</p>
<div id="attachment_325" class="wp-caption aligncenter" style="width: 536px"><a href="http://docs.oracle.com/cd/E12839_01/install.1111/b32474/img/wls_elements_2.gif"><img class="size-full wp-image-325" alt="Estrutura de Weblogic Domains para múltiplos produtos OFM instalados em um mesmo ambiente Oracle Middleware." src="http://rafaeltuelho.files.wordpress.com/2013/02/wls_elements_2.gif?w=630"   /></a><p class="wp-caption-text">Estrutura de Weblogic Domains para múltiplos produtos OFM instalados em um mesmo ambiente Oracle Middleware.</p></div>
<p style="padding-left:30px;"><strong>NOTA: todos os produtos instalados dentro de uma estrutura <span style="color:#0000ff;">Oracle Middleware Home</span> devem ser compatíveis com a mesma <em>release</em> do OFM utilizada no ambiente em questão. Por exemplo, não seria possível instalar o Oracle WebCenter <span style="color:#ff0000;">12c</span> em um ambiente preparado para o OFM <span style="color:#0000ff;">11g</span></strong>.</p>
<p>Outro aspecto interessante relacionado ao <em>Weblogic Domain</em> é possibilidade de extender (escalar) determinado domínio existente dentro de um host. Durante a criação ou configuração de um <em>domain</em> é possível adicionar novos <em>managed servers</em>, seja para extender um produto ou reutilizar um mesmo domínio. Por exemplo, ao invés de criar um novo domínio para instalar o Oracle WebCenter, poderíamos utilizar o mesmo <em>domain</em> criado para o Oracle SOA Suite. Nesse caso a estrutura de diretórios do OFM em nosso ambiente ficaria conforme a imagem abaixo:</p>
<div id="attachment_327" class="wp-caption aligncenter" style="width: 536px"><a href="http://docs.oracle.com/cd/E12839_01/install.1111/b32474/img/extend_domain.gif"><img class="size-full wp-image-327" alt="Domínio extendido" src="http://rafaeltuelho.files.wordpress.com/2013/02/extend_domain.gif?w=630"   /></a><p class="wp-caption-text">Domínio extendido</p></div>
<h2>Oracle Instance</h2>
<p>Diferentemente dos diretórios descritos nos tópicos anteriores um diretório <strong>Oracle Instance</strong> hospeda <em>system components</em>, ou seja, serviços/processos não JavaEE tais como: <em>Oracle Http Server</em>, <em>Oracle Web Cache</em> ou <em>Oracle Internet Directory</em>.</p>
<p><span style="text-decoration:underline;">Diferentemente do Oracle Home</span> um diretório Oracle Instance contém arquivos passíveis de alteração (configuração, logs e temporários gerados durante a execução do processo/serviço). <span style="text-decoration:underline;">Assim como o diretório Weblogic Domain</span> um Oracle Instance pode residir fora da estrutura do Oracle Middleware. O diagrama abaixo destaca um ambiente OFM contendo dois produtos instalados: um <em>system component</em> (<em>WebTier</em> composto por <em>Oracle Http Server</em> e <em>Oracle WebCache</em>) e um <em>java component</em> (<em>Oracle SOA Suite</em>), este último reside em um <em>Weblogic Domain:</em></p>
<div id="attachment_329" class="wp-caption aligncenter" style="width: 536px"><a href="http://docs.oracle.com/cd/E12839_01/install.1111/b32474/img/oracle_instance.gif"><img class="size-full wp-image-329 " alt="OFM com Webtier (system component) e SOA Suite (java compoenent - Weblogic Domain)" src="http://rafaeltuelho.files.wordpress.com/2013/02/oracle_instance.gif?w=630"   /></a><p class="wp-caption-text">OFM com Webtier (system component) e SOA Suite (java compoenent &#8211; Weblogic Domain)</p></div>
<h2>Oracle Common Home</h2>
<p>Este diretório não está associado à um componente ou produto específico dentro da estrutura Oracle Middleware Home. Ele contém uma variedade de utilitários e bibliotecas utilizadas e necessárias pela solução de gerenciamento e monitoramento do OFM conhecida como <a href="http://www.oracle.com/us/products/enterprise-manager/index.html" target="_blank"><strong><em>Oracle (Enterprise Manager) Fusion Middleware Control</em></strong></a> e também pelo conjunto de bibliotecas, não incluídas por padrão no Weblogic, <a href="http://docs.oracle.com/cd/E12839_01/doc.1111/e14827/configure.htm#CACJEEIA" target="_blank"><strong><em>Java Required Files</em></strong> (JRF)</a>.</p>
<p style="padding-left:30px;"><strong>NOTA: dentro da estrutura Middleware Home só pode haver um único diretório Oracle Common.</strong></p>
<p><strong></strong>O diagrama abaixo destaca o diretório Oracle Common Home:</p>
<div id="attachment_337" class="wp-caption aligncenter" style="width: 409px"><a href="http://docs.oracle.com/cd/E16764_01/install.1111/b32474/img/oracle_home.gif"><img class="size-full wp-image-337" alt="Oracle Common Directory" src="http://rafaeltuelho.files.wordpress.com/2013/02/oracle_home.gif?w=630"   /></a><p class="wp-caption-text">Oracle Common Directory</p></div>
<h2>Oracle Metadata Repository</h2>
<p>Alguns produtos do OFM, tais como o <em>Oracle BPEL Process Manager</em>, <em>Oracle Business Activity Monitoring</em>, <em>Oracle Business Intelligence</em> necessitam de um Banco de Dados específicos para armazenar metadados do produto. Um <strong><em>Metadata Repository</em></strong> pode ser de dois tipos: baseado em banco de dados (<em>database-based</em>) ou baseado em um sistema de arquivos (<em>filesystem-based</em>). Embora os dois tipos sejam suportados a Oracle recomenda a utilização de repositórios baseados em Banco de Dados para o ambiente de produção.</p>
<p>Para esses produtos que necessitam de um repositório de metadados é necessário executar o passo de criação do repositório <span style="text-decoration:underline;">antes de prosseguir com a instalação do produto</span>. Para isso é utilizada uma ferramenta específica: o <a href="http://docs.oracle.com/cd/E12839_01/core.1111/e10105/repos.htm#ASADM260" target="_blank"><em><strong>Repository Creation Utility</strong></em></a> (RCU). Essa ferramenta cria os schemas de Banco de Dados necessários para o funcionamento do produto.</p>
<p>O diagrama abaixo destaca o <em>Metadata </em><em>Repository</em> utilizado pelo produto <em>Oracle SOA Suite:</em></p>
<div id="attachment_333" class="wp-caption aligncenter" style="width: 350px"><a href="http://docs.oracle.com/cd/E23943_01/core.1111/e10105/img/fmw.gif"><img class="size-full wp-image-333" alt="Oracle SOA Suite's metadata repository" src="http://rafaeltuelho.files.wordpress.com/2013/02/fmw_metadata_repository1.gif?w=630"   /></a><p class="wp-caption-text">Oracle SOA Suite&#8217;s metadata repository</p></div>
<p>Espero com este post ter esclarecido alguns conceitos, geralmente ignorados ou confundidos, durante a instalação ou preparação de um ambiente de execução do Oracle Fusion Middleware. A fonte de referência para os conceitos aqui expostos é a excelente <a href="http://docs.oracle.com/cd/E12839_01/index.htm" target="_blank">documentação oficial do produto disponível no siste da Oracle</a>.</p>
<p>Nos próximos posts pretendo continuar explorando alguns conceitos específicos do <strong>Oracle Weblogic Server</strong>.</p>
<p>Abraço <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rafaeltuelho.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rafaeltuelho.wordpress.com/315/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=315&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rafaeltuelho.net.br/2013/02/15/oracle-fusion-middleware-conceitos/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8f139bacbb0559d5b6e5fe0bd736cf9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rafaeltuelho</media:title>
		</media:content>

		<media:content url="http://docs.oracle.com/cd/E23943_01/core.1111/e10103/img/ascon_dt_010.gif" medium="image" />

		<media:content url="http://docs.oracle.com/cd/E23943_01/core.1111/e10103/img/ascon_dt_007_mdlwr_hm.gif" medium="image" />

		<media:content url="http://docs.oracle.com/cd/E12839_01/install.1111/b32474/img/mw_home.gif" medium="image" />

		<media:content url="http://rafaeltuelho.files.wordpress.com/2013/02/oracle_home1.gif" medium="image">
			<media:title type="html">Oracle Home após a instalação do Oracle SOA Suite</media:title>
		</media:content>

		<media:content url="http://rafaeltuelho.files.wordpress.com/2013/02/wls_elements_1.gif" medium="image">
			<media:title type="html">SOA Domain após a instalação do Oracle SOA Suite</media:title>
		</media:content>

		<media:content url="http://rafaeltuelho.files.wordpress.com/2013/02/wls_elements_2.gif" medium="image">
			<media:title type="html">Estrutura de Weblogic Domains para múltiplos produtos OFM instalados em um mesmo ambiente Oracle Middleware.</media:title>
		</media:content>

		<media:content url="http://rafaeltuelho.files.wordpress.com/2013/02/extend_domain.gif" medium="image">
			<media:title type="html">Domínio extendido</media:title>
		</media:content>

		<media:content url="http://rafaeltuelho.files.wordpress.com/2013/02/oracle_instance.gif" medium="image">
			<media:title type="html">OFM com Webtier (system component) e SOA Suite (java compoenent - Weblogic Domain)</media:title>
		</media:content>

		<media:content url="http://rafaeltuelho.files.wordpress.com/2013/02/oracle_home.gif" medium="image">
			<media:title type="html">Oracle Common Directory</media:title>
		</media:content>

		<media:content url="http://rafaeltuelho.files.wordpress.com/2013/02/fmw_metadata_repository1.gif" medium="image">
			<media:title type="html">Oracle SOA Suite&#039;s metadata repository</media:title>
		</media:content>
	</item>
		<item>
		<title>Weblogic e Java Classloading: parte 1</title>
		<link>http://rafaeltuelho.net.br/2013/02/05/weblogic-e-java-classloading-parte-1/</link>
		<comments>http://rafaeltuelho.net.br/2013/02/05/weblogic-e-java-classloading-parte-1/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 20:23:49 +0000</pubDate>
		<dc:creator>rafaeltuelho</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[classloader]]></category>
		<category><![CDATA[classloading]]></category>
		<category><![CDATA[jvm]]></category>

		<guid isPermaLink="false">http://rafaeltuelho.net.br/?p=304</guid>
		<description><![CDATA[Neste post descrevo um pouco sobre o modelo de Classloading Java. Na sequência pretendo escrever sobre Classloading no contexto do Oracle Weblogic Application Server. A fonte de referência usada neste post é a excelente documentação oficial do Weblogic [1]. O mecanismo de Classloading é uma &#8220;peça&#8221; importantíssima dentro da Máquina Virtual Java (JVM). É o [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=304&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Neste post descrevo um pouco sobre o modelo de <strong><em>Classloading Java</em></strong>. Na sequência pretendo escrever sobre Classloading no contexto do Oracle Weblogic Application Server. A fonte de referência usada neste post é a excelente documentação oficial do Weblogic [1].</p>
<p>O mecanismo de Classloading é uma &#8220;peça&#8221; importantíssima dentro da Máquina Virtual Java (JVM). É o mecanismo responsável por encontrar e carregar uma Classe Java na memória da JVM em tempo de execução. Quando uma aplicação referencia uma Classe Java em tempo de execução, é o Classloader (<strong>CL</strong>) quem localiza e carrega sua definição na Memória Heap. Nesse processo de carga, caso a classe não seja localizada no Classpath ocorre a famosa <a href="http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ClassNotFoundException.html" target="_blank"><strong><em>ClassNotfoundException</em></strong></a> (dentre outras exceptions associadas à este tipo de problema).</p>
<h2>Classloader hierárquico</h2>
<p>Por definição a JVM trabalha com uma hierarquia de Classloader (<em>Java Classloader Hierarchy</em>) semelhante ao relacionamento hierárquico entre classes Java (Superclasses e Subclasses). Na raiz dessa hierarquia está o <strong><em>bootstrap classloader</em></strong> &#8211; carregado pela JVM e composto por classes internas distribuídas pelas bibliotecas da JDK (classes pertencentes ao pacote java.*) &#8211; geralmente localizadas em <strong>&lt;JAVA_HOME&gt;/jre/lib/rt.jar</strong>.</p>
<p>No segundo nível do CL está o <strong><em>extensions classloader</em></strong>. Neste CL são carregadas as classes localizadas em <strong>&lt;JAVA_HOME&gt;/jre/lib/ext</strong>. Utilizar este diretório é uma forma de estender o CL padrão do Java. Entretanto as bibliotecas localizadas nesse diretório devem ser autocontidas, ou seja, não podem depender de classes/bibliotecas externas.</p>
<p>Estendendo o &#8220;<em>extension classloader</em>&#8221; está o <strong><em>system classloader</em></strong>, responsável por carregar classes contidas no classpath utilizado para carregar a JVM. Seguindo a hierarquiva vem o &#8220;<strong><em>application classloader</em></strong>&#8220;. A partir desse nível são definidos os classloaders específicos da aplicação (por exemplo o classloader carregado pelo Weblogic)<strong>.</strong></p>
<p style="padding-left:30px;"><strong>NOTA</strong>: No contexto do Weblogic, o termo utilizado pela Oracle para referenciar o classloader utilizado pelo Applciation Server é &#8220;system classloader&#8221;. Nesse mesmo contxto o temo &#8220;application classloader&#8221; refere-se às bibliotecas e aplicações Java Enterprise Edition (JavaEE).</p>
<p>A imagem abaixo [2] mostra a hierarquia padrão do modelo de classloader do Java.</p>
<p><a href="http://rafaeltuelho.files.wordpress.com/2013/02/clhierarchy.gif"><img class="aligncenter size-medium wp-image-306" alt="clhierarchy" src="http://rafaeltuelho.files.wordpress.com/2013/02/clhierarchy.gif?w=246&#038;h=300" width="246" height="300" /></a></p>
<h2>Carregamento (<em>loading</em>) de classes</h2>
<p>De acordo com o artigo &#8220;<a href="http://www.ibm.com/developerworks/java/library/j-dclp1/" target="_blank"><em>Demystifying class loading problems, Part 1: An introduction to class loading and debugging tools</em></a>&#8221; [2] publicado no site<a href="http://www.ibm.com/developerworks" target="_blank"> IBM developerWorks</a>, o processo de carregamento de uma Classe Java pode ser separado em três momentos distintos: <strong><em>loading</em></strong>, <strong><em>linking</em></strong> e <strong><em>initializing</em></strong>.</p>
<p>A imagem abaixo [2] mostra o processo de class loading de uma Classe Java.</p>
<p style="text-align:center;"><a href="http://rafaeltuelho.files.wordpress.com/2013/02/clphases.gif"><img class="size-full wp-image-307 aligncenter" alt="cl phases" src="http://rafaeltuelho.files.wordpress.com/2013/02/clphases.gif?w=630"   /></a></p>
<p>Primeiro (<strong><em>loading phase</em></strong>) o arquivo (<strong>.class</strong>) binário da classe é localizado (dentro da lista de classes/bibliotecas informada no classpath usado pela JVM) e carregado no Bytecode. O processo de <em>loading</em> define, internamente na JVM, uma <span style="text-decoration:underline;">estrutura básica</span> para que a classe seja carregada em memória.</p>
<p>No segundo momento o processo de <strong><em>linking</em></strong> realiza três passos adicionais:</p>
<ul>
<li><strong><em> Bytecode verification</em></strong>: neste passo o classloader se certifica de que o bytecode da classe está ok.</li>
<li><em><strong> Class preparation</strong></em>: neste passo a estrutura necessária para acomodar a definição da classe (métodos, campos, interfaces implementadas, etc) é preparada.</li>
<li><em><strong> Resolving</strong></em>: neste passo o classloader carrega todas as dependências referenciadas pela classe em questão. Pode-se entender como a montagem do grafo de dependências referenciadas por: hierarquia de classes pais (superclasses), interfaces, campos, assinatura de métodos, etc.</li>
</ul>
<p>No terceiro e último momento (<em><strong>initializing</strong></em>) o conteúdo estático (<em>static fields</em>, <em>static blocks</em>, etc) da classe é inicializado.</p>
<p>Após esse processo a Classe é considerada como carregada e pode ser utilizada pela aplicação.</p>
<h2>Modelo de Delegação (<em>delegation model</em>)</h2>
<p>Outro aspecto importante relacionado ao Classloader é o modelo utilizado para carregamento de uma classe. Antes de falar sobre o modelo de delegação em si vale a pena comentar um pouco sobre o &#8220;disparo&#8221; de carregamento de uma Classe Java. Existe basicamente duas formas de iniciar (disparar/delegar) o carregamento de uma classe: carregamento <strong>explícito</strong> e carregamento <strong>implícito</strong>.</p>
<p>Na primeira forma a classe é carregada explicitamente usando as seguintes chamadas no código Java:</p>
<pre> cl.loadClass("com.mycompany.MyClass");  //cl é uma instância de java.lang.ClassLoader
 Class.forName("com.mycompany.MyClass"); //o classloader pais neste caso é o mesmo usado para carregar a classe na qual a chamada à Class.forName() está sendo realizada.</pre>
<p>Quando uma dessas chamadas é realizada de forma explícita ocorre o seguinte: se a classe referenciada já estiver sido carregada anteriormente, uma referência à esta classe é retornada. Caso contrário o CL utiliza o modelo de delegação para carregar a classe.</p>
<p>Na segunda forma a classe é carregada por referência, ou seja, quando ela é referenciada por outra classe carregada em um momento distinto (conforme descrito no passo &#8216;<em>Resolving</em>&#8216; da fase &#8216;<em>Linking</em>&#8216; do processo de classloading descrito no tópico anterior). Assim como no carregamento implícito, caso a classe já tenha sido carregada, uma referência à ela é retornada. Caso contraário o carregamento realizado usando o modelo de delegação.</p>
<p>No modelo de delegação a implementação do classloader faz uma checagem inicial para verificar se a classe solicitada já foi carregada e reside no cache. Essa checagem melhora a performance de carregamento, pois caso a classe já esteja no cache, não será necessário carregá-la novamente do disco. Se a classe não for encontrada no cache o CL atual <span style="text-decoration:underline;">primeiro</span> solicita a classe ao seu pai (superior imediato na hierarquia). <span style="text-decoration:underline;">Somente</span> se a classe não puder ser carregada pelo CL pai o CL em questão (filho) <span style="text-decoration:underline;">tenta</span> carregar a classe. Caso a classe solicitada seja encontrada nos dois CLs (pai e filho), a versão encontrada no CL pai é carregada.</p>
<p>Este modelo de delegação é utilizado para evitar que existam múltiplas cópias de uma mesma classe sejam carregadas. Múltiplas cópias de uma mesma classe podem ocosionar problemas de conflito de classes gerando exception como a famosa <em>ClassCastException</em>. Para mais detalhes sobre os diferentes problemas ocasionados devido ao conflito de classes em um classloader consulte o artigo &#8220;<a href="http://www.ibm.com/developerworks/java/library/j-dclp2/" target="_blank"><em>Demystifying class loading problems, Part 2: Basic class loading exceptions</em></a>&#8221; [3]. Nesse artigo o autor explica as diferentes <em>exceptions</em> geralmente relaciodas ao conflito de classes em classloaders.</p>
<p>O ponto a ser destacado no modelo de delegação utilizado pelo Java Classloader é:</p>
<blockquote><p>&#8220;<strong>Um classloader filho (ex: <em>application classloader</em>) solicita a classe <span style="text-decoration:underline;">primeiro</span> ao seu pai antes de tentar localizar e carregar por conta própria.</strong>&#8220;</p></blockquote>
<p>Por exemplo: Quando uma classe da sua aplicação (carregada pelo CL da aplicação) referencia uma classe fornecida pelo JDK (ex: java.lang.String), o carregamento é delegado pelo boostrap/root classloader (que de fato carregou as classes contidas em JAVA_HOME/jre/lib/rt.jar).</p>
<p>___<br />
[1] <a href="http://docs.tpu.ru/docs/oracle/en/fmw/11.1.1.6.0/web.1111/e13706/classloading.htm" rel="nofollow">http://docs.tpu.ru/docs/oracle/en/fmw/11.1.1.6.0/web.1111/e13706/classloading.htm</a><br />
[2] <a href="http://www.ibm.com/developerworks/java/library/j-dclp1/" rel="nofollow">http://www.ibm.com/developerworks/java/library/j-dclp1/</a><br />
[3] <a href="http://www.ibm.com/developerworks/java/library/j-dclp2/" rel="nofollow">http://www.ibm.com/developerworks/java/library/j-dclp2/</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rafaeltuelho.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rafaeltuelho.wordpress.com/304/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=304&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rafaeltuelho.net.br/2013/02/05/weblogic-e-java-classloading-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8f139bacbb0559d5b6e5fe0bd736cf9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rafaeltuelho</media:title>
		</media:content>

		<media:content url="http://rafaeltuelho.files.wordpress.com/2013/02/clhierarchy.gif?w=246" medium="image">
			<media:title type="html">clhierarchy</media:title>
		</media:content>

		<media:content url="http://rafaeltuelho.files.wordpress.com/2013/02/clphases.gif" medium="image">
			<media:title type="html">cl phases</media:title>
		</media:content>
	</item>
		<item>
		<title>Onde obter versões antigas do Java (JDK e JRE)</title>
		<link>http://rafaeltuelho.net.br/2013/02/05/onde-obter-versoes-antigas-do-java-jdk-e-jre/</link>
		<comments>http://rafaeltuelho.net.br/2013/02/05/onde-obter-versoes-antigas-do-java-jdk-e-jre/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 17:06:10 +0000</pubDate>
		<dc:creator>rafaeltuelho</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[arquivo]]></category>
		<category><![CDATA[downloads]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdk]]></category>
		<category><![CDATA[jvm]]></category>

		<guid isPermaLink="false">http://rafaeltuelho.net.br/?p=299</guid>
		<description><![CDATA[A plataforma Java é uma tecnologia bastante madura e bem antiga. De acordo com a página Java Version History no Wikipedia a primeira release (1.0) do Java Development Kit (JDK) data de Janeiro de 1996. Com uma trajetória tão longa e com sucesso comprovado no mercado corporativo não é raro nos depararmos com projetos em [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=299&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>A plataforma Java é uma tecnologia bastante madura e bem antiga. De acordo com a página <em><a title="Java Version History Wiki page" href="http://en.wikipedia.org/wiki/Java_version_history" target="_blank">Java Version History</a></em> no Wikipedia a primeira <em>release</em> (1.0) do Java Development Kit (JDK) data de Janeiro de 1996. Com uma trajetória tão longa e com sucesso comprovado no mercado corporativo não é raro nos depararmos com projetos em plena execução em versões antigas dessa plataforma.</p>
<p>&#8220;Volta e meia&#8221; precisamos baixar uma versão antiga da JVM para realizar testes ou preparar um ambiente semelhante ao atual ambiente de execução do projeto. Mas, onde podemos obter versões oficiais e específicas do Java (JVM, JRE, bibliotecas, etc)? As versões mais antigas eram mantidas pelo &#8220;falecida&#8221; Sun Microsystems. Bem, existe uma página que faço questão de manter em meus <a href="https://delicious.com/rafaelcba" target="_blank">Favoritos</a>. Trata-se da página &#8220;<em><strong><a title="Java Archive" href="http://www.oracle.com/technetwork/java/archive-139210.html" target="_blank">Oracle Java Archive</a></strong></em>&#8220;. Nela é possível obter todas as versões antigas da plataforma Java Standard/Enterprise Edition, inclusive bibliotecas depreciadas.</p>
<p><a href="http://www.oracle.com/technetwork/java/archive-139210.html"><img class="aligncenter size-medium wp-image-300" alt="oraclejavaarchive" src="http://rafaeltuelho.files.wordpress.com/2013/02/oraclejavaarchive.png?w=259&#038;h=300" width="259" height="300" /></a></p>
<p>Ninguém gosta de lidar com velharia. Mas pra quem lida com consultoria em plataformas &#8220;maduras&#8221; como o Java isso é quase inevitável.</p>
<p>Abraço.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rafaeltuelho.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rafaeltuelho.wordpress.com/299/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=299&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rafaeltuelho.net.br/2013/02/05/onde-obter-versoes-antigas-do-java-jdk-e-jre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8f139bacbb0559d5b6e5fe0bd736cf9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rafaeltuelho</media:title>
		</media:content>

		<media:content url="http://rafaeltuelho.files.wordpress.com/2013/02/oraclejavaarchive.png?w=259" medium="image">
			<media:title type="html">oraclejavaarchive</media:title>
		</media:content>
	</item>
		<item>
		<title>Root login no Oracle Solaris 11</title>
		<link>http://rafaeltuelho.net.br/2012/12/19/root-login-no-oracle-solaris-11/</link>
		<comments>http://rafaeltuelho.net.br/2012/12/19/root-login-no-oracle-solaris-11/#comments</comments>
		<pubDate>Wed, 19 Dec 2012 15:51:20 +0000</pubDate>
		<dc:creator>rafaeltuelho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Oracle Solaris]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[sshd]]></category>

		<guid isPermaLink="false">http://rafaeltuelho.net.br/?p=290</guid>
		<description><![CDATA[Recentemente criei uma máquina virtual x86 para rodar o Oracle Solaris 11 usando o VirtualBox. A ideia é utilizar essa VM como ambiente de prova de conceito para produtos da linha Oracle Fusion Middleware. Como todo sistema Unix-like o Solaris possui algumas restrições de segurança que impossibilita o acesso de root via SSH. Minha primeira tentativa [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=290&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Recentemente criei uma máquina virtual x86 para rodar o Oracle Solaris 11 usando o <a title="Oracle VirtualBox" href="https://www.virtualbox.org/" target="_blank">VirtualBox</a>. A ideia é utilizar essa VM como ambiente de prova de conceito para produtos da linha Oracle Fusion Middleware. Como todo sistema <em>Unix-like</em> o Solaris possui algumas restrições de segurança que impossibilita o acesso de root via SSH. Minha primeira tentativa foi editar a configuração do serviço <strong>sshd</strong> e habilitar a flag &#8216;<strong>PermitRootLogin&#8217;</strong>. Entretanto, isso não basta para que o login de root funcione no Solaris.</p>
<p>Após algumas &#8220;googladas&#8221; descobri que é necessário realizar os seguintes ajustes na configuração do S.O:</p>
<ul>
<li>Habilitar o login de root no serviço sshd. Edite o arquivo /etc/ssh/sshd_config</li>
</ul>
<pre># Are root logins permitted using sshd.
# Note that sshd uses pam_authenticate(3PAM) so the root (or any other) user
# maybe denied access by a PAM module regardless of this setting.
# Valid options are yes, without-password, no.
PermitRootLogin <strong>yes</strong></pre>
<ul>
<li>Comentar a propriedade &#8216;CONSOLE&#8217; no arquivo /etc/default/login</li>
</ul>
<pre># If CONSOLE is set, root can only login on that device.
# If the specified device is /dev/console, then root can also log into
# any of the currently enabled /dev/vt/# virtual terminal devices.
# Comment this line out to allow remote login by root.
#
<strong>#CONSOLE</strong>=/dev/console</pre>
<ul>
<li>Editar a configuração do módulo PAM. Edite o arquivo /etc/pam.conf</li>
</ul>
<p>Adicione a seguinte linha no fim do arquivo:</p>
<pre>sshd-kbdint   account   required   pam_unix_account.so.1</pre>
<p><span style="color:#0000ff;">Adicionado em 18/01/2013.</span><br />
<span style="color:#0000ff;">&#8212;</span></p>
<ul>
<li><span style="line-height:13px;">Para permitir o login de root pela console/shell da própria máquina é necessário alterar a role na qual o root está associado. Execute o seguinte comando como root.</span></li>
</ul>
<pre>root@solaris11:~# rolemod -K <strong>type=normal</strong> root
Found user in files repository.
UX: rolemod: root is currently logged in, some changes may not take effect until next login.</pre>
<p>Agora tente executar o login como root pela console da máquina/VM (sem ser via ssh).</p>
<p><span style="color:#0000ff;">&#8212;</span></p>
<p>obs: obviamente, por questões de segurança, essa configuração não é interessante em ambiente de produção.</p>
<p> <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rafaeltuelho.wordpress.com/290/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rafaeltuelho.wordpress.com/290/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=290&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rafaeltuelho.net.br/2012/12/19/root-login-no-oracle-solaris-11/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8f139bacbb0559d5b6e5fe0bd736cf9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rafaeltuelho</media:title>
		</media:content>
	</item>
		<item>
		<title>TDC 2012: slides e demo da palestra</title>
		<link>http://rafaeltuelho.net.br/2012/11/18/tdc-2012-slides-e-demo-da-palestra/</link>
		<comments>http://rafaeltuelho.net.br/2012/11/18/tdc-2012-slides-e-demo-da-palestra/#comments</comments>
		<pubDate>Sun, 18 Nov 2012 22:16:54 +0000</pubDate>
		<dc:creator>rafaeltuelho</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[TDC2012]]></category>

		<guid isPermaLink="false">http://rafaeltuelho.net.br/?p=286</guid>
		<description><![CDATA[Na edição Goiânia que acontenceu nos dias 20 e 21 de Outubro participei da trilha Java com a paelstra “Aumentando a eficiência do web container com chamadas assíncronas“. Após um longo tempo finalmente tive tempo de disponibilizar a demo no github. Os slides estão disponíveis no slideshare. &#160; O projeto usado na demo está disponível [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=286&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Na edição Goiânia que acontenceu nos dias 20 e 21 de Outubro participei da trilha Java com a paelstra “<a href="http://www.thedevelopersconference.com.br/tdc/2012/goiania/trilha-java#programacao" target="_blank">Aumentando a eficiência do web container com chamadas assíncronas</a>“.</p>
<p>Após um longo tempo finalmente tive tempo de disponibilizar a <a href="https://github.com/rafaeltuelho/TDC2012-asyncservlets.git" target="_blank">demo no github</a>.</p>
<p>Os slides estão disponíveis no slideshare.</p>
<iframe src='http://www.slideshare.net/slideshow/embed_code/14841499' width='630' height='516'></iframe>
<p>&nbsp;</p>
<p>O projeto usado na demo está disponível no Github no repositório <a title="Demo TDC 2012" href="https://github.com/rafaeltuelho/TDC2012-asyncservlets.git" target="_blank">TDC2012-asyncservlets</a>.</p>
<p>Abraço.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rafaeltuelho.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rafaeltuelho.wordpress.com/286/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=286&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rafaeltuelho.net.br/2012/11/18/tdc-2012-slides-e-demo-da-palestra/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8f139bacbb0559d5b6e5fe0bd736cf9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rafaeltuelho</media:title>
		</media:content>
	</item>
		<item>
		<title>Bash Script: substituindo um texto em vários arquivos</title>
		<link>http://rafaeltuelho.net.br/2012/11/16/bash-script-substituindo-um-texto-em-varios-arquivos/</link>
		<comments>http://rafaeltuelho.net.br/2012/11/16/bash-script-substituindo-um-texto-em-varios-arquivos/#comments</comments>
		<pubDate>Fri, 16 Nov 2012 14:09:52 +0000</pubDate>
		<dc:creator>rafaeltuelho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[oracle middleware]]></category>
		<category><![CDATA[shell script]]></category>
		<category><![CDATA[weblogic]]></category>

		<guid isPermaLink="false">http://rafaeltuelho.net.br/?p=274</guid>
		<description><![CDATA[Neste post quero compartilhar um bash script que criei para um necessidade bastante comum em ambientes Unix Like. Necessidade: &#8220;alterar um texto em vários arquivos de uma única vez&#8221; Situação hipotética: &#8220;vários arquivos texto (xml, properties, txt etc) espalhados dentro de um diretório raiz contendo um determinado termo (palavra, path de arquivo, propriedade etc)&#8221; Esse [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=274&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Neste post quero compartilhar um <em>bash script</em> que criei para um necessidade bastante comum em ambientes <em>Unix Like.</em></p>
<p>Necessidade:</p>
<blockquote><p>&#8220;alterar um texto em vários arquivos de uma única vez&#8221;</p></blockquote>
<p>Situação hipotética:</p>
<blockquote><p>&#8220;vários arquivos texto (xml, properties, txt etc) espalhados dentro de um diretório raiz contendo um determinado termo (palavra, path de arquivo, propriedade etc)&#8221;</p></blockquote>
<p>Esse tipo de situação é bastante comum no dia a dia de um administrador de sistemas e servidores. A abordagem da utilização de um script para automatizar esse tipode tarefa é bastante utilizada em ambientes baseados em Unix que possuam um shell com suporte a qualquer linguagem de script (<strong>bash, ksh, python, ruby etc</strong>).</p>
<p>No meu caso implementei um script bash para execução em sistemas Linux. Minha necessidade inicial foi alterar o caminho da instalação do Oracle Weblogic Application Server &#8211; WLS. A instalação do WLS escreve o caminho do diretório raiz da instalação em vários arquivos de configuração (arquivos <strong>.properties</strong> e <strong>.xml</strong>) e scripts de gerenciamento (arquivos .<strong>sh</strong>) espalhados por toda a sua estrutura de diretórios. Caso seja necessário alterar o caminho raiz da instalação do WLS, você tem duas alternativas: <strong>1)</strong> instalar novamente o WLS; <strong>2)</strong> alterar o path da instalação em todos os arquivos de configuração.</p>
<p>No meu caso meu WLS foi instalado em &#8216;<strong>/opt/Oracle/Middleware</strong>&#8216;, porém precisei mudar o caminho raiz para &#8216;<strong>/opt/Oracle/Middlware<span style="color:#ff0000;">11g<span style="color:#000000;">&#8216;</span></span></strong>.</p>
<p>Pois bem, meu scritpt recebe como entrada os seguintes parâmetros:</p>
<ol>
<li><strong>path</strong>: diretório raiz onde os arqivos se encontram</li>
<li><strong>file pattern name</strong>: nome do arquivo a ser alterado (geralmente um coringa &#8216;*.&#8217;)</li>
<li><strong>old text</strong>: texto a ser alterado</li>
<li><strong>new text</strong>: novo texto</li>
</ol>
<p>Quando executar o script sem parâmetros um pequeno help será exibido sugerindo um exemplo de uso.</p>
<pre># ~/replaceText.sh
invalid call!
 usage: ./replaceText &lt;path&gt; &lt;file pattern name&gt; &lt;old text&gt; &lt;new text&gt;
NOTES:
 1) don't use the pattern '*', instead specify a file extension (eg: '*.sh', '*.txt', '*.properties', '*.xml')
 2) for text containing special chars you have to scape them with '\'
eg: ./replaceText "/opt/Oracle/Middleware" "*.xml" "Oracle\/Middleware\/" "Oracle\/Middleware11g\/"</pre>
<p>Ao executar o script com todos os parâmetros o diretório raiz (primeiro argumento) será percorrido e, para cada arquivo encontrado (obedecendo o padrão informado no segundo argumento), será necessário confirmar a alteração.</p>
<pre># ~/replaceText.sh <strong>/opt/Oracle/Middleware/</strong> "<strong>*.properties</strong>" "Oracle\/Middleware\/" "Oracle\/Middleware<strong>11g</strong>\/"
 alterar o arquivo: /opt/Oracle/Middleware/user_projects/domains/cluster-replicated-domain/init-info/tokenValue.properties
 <strong>deseja continuar? ([S]im/[n]ao/[t]odos) S</strong>
 substituir [Oracle\/Middleware\/] por [Oracle\/Middleware<strong>11g</strong>\/]
 <strong>diff</strong> /opt/Oracle/Middleware/user_projects/domains/cluster-replicated-domain/init-info/tokenValue.properties /opt/Oracle/Middleware/user_projects/domains/cluster-replicated-domain/init-info/tokenValue.properties<strong>.BAK</strong>
 ----------------------------------------
 21c21
 &lt; @DOMAIN_HOME=/opt/Oracle/Middleware<strong>11g</strong>/user_projects/domains/cluster-replicated-domain
 ---
 &gt; @DOMAIN_HOME=/opt/Oracle/Middleware/user_projects/domains/cluster-replicated-domain
 24c24
 &lt; @USERDOMAIN_HOME=/opt/Oracle/Middleware<strong>11g</strong>/user_projects/domains/cluster-replicated-domain
 ---
 &gt; @USERDOMAIN_HOME=/opt/Oracle/Middleware/user_projects/domains/cluster-replicated-domain
 ----------------------------------------</pre>
<p>No exemplo acima alterei todos os arquivos de propriedades (<strong>*.properties</strong>). Observe que existe a opção de alterar todos os arquivos encontrados de uma única vez. Basta selecionar a opção <strong>[a]ll</strong> quando for solicitada a confirmação. Observe também que o script faz um backup de todos os arquivos alterados (<strong>.BAK</strong>).</p>
<p>Ok. Após todo esse bla bla bla o código do script:</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash

DIR_PATH=$1
FILE_SEARCH_PATTERN=$2
OLD_STRING=$3
NEW_STRING=$4

LAST_REPLY=&quot;S&quot;

askToContinue(){
   if [[ ! $LAST_REPLY =~ ^[Aa]$  ]]
   then
      read -p &quot;continue? ([Y]es/[n]o/[A]ll) &quot; -n1
      echo

      LAST_REPLY=$REPLY
      if [[ ! $REPLY =~ ^[Yy]$ ]]
      then
         continue
      fi
   fi
}

usage(){
   echo
   echo -e &quot;\r invalid call!&quot;
   echo -e &quot;   usage: ./replaceText    &quot;
   echo
   echo -e &quot;\r NOTES:&quot;
   echo -e &quot;\r\t 1) don't use the pattern '*', instead specify a file extension (eg: '*.sh', '*.txt', '*.properties', '*.xml')&quot;
   echo -e &quot;\r\t 2) for text containing special chars you have to scape them with '\'&quot;
   echo
   echo -e &quot;   eg: ./replaceText \&quot;/opt/Oracle/Middleware\&quot; \&quot;*.xml\&quot; \&quot;Oracle\\/Middleware\\/\&quot; \&quot;Oracle\\/Middleware11g\\/\&quot;&quot;
   echo
   exit
}

[[ ! &quot;$#&quot; = &quot;4&quot; ]] &amp;&amp; usage

for file_name in `find &quot;$DIR_PATH&quot; -type f -name &quot;$FILE_SEARCH_PATTERN&quot;`
do
  #Testa se o arquivo contem o texto a ser substituido
  file $file_name | grep -i &quot;text&quot; &gt; /dev/null
  [[ &quot;$?&quot; -eq &quot;1&quot;  ]] &amp;&amp; continue
  grep $OLD_STRING $file_name &gt; /dev/null
  [[ &quot;$?&quot; -eq &quot;1&quot;  ]] &amp;&amp; continue

  echo -e &quot;\r\r\r changes the file: $file_name \r&quot;
  askToContinue

  echo -e &quot;\t replace [$OLD_STRING] by [$NEW_STRING] \r&quot;

  if [ -d $DIR_PATH  ];
  then
     sed -i.BAK -e &quot;s/${OLD_STRING}/${NEW_STRING}/g&quot; $file_name

     echo -e &quot;\t\t diff $file_name $file_name.BAK&quot;
     echo -e &quot;\r ----------------------------------------&quot;
     diff $file_name $file_name.BAK
     echo -e &quot;\r ----------------------------------------&quot;
  else
     echo -e &quot;\r $PATH_DIR does not exists!&quot;
     exit
  fi

done
</pre>
<p>Eu usei o script sem problemas em um Linux Fedora (Linux Red Hat based). Mas creio que funcionará sem grandes problemas em qualquer Unix com um shell <strong>Bash</strong>.</p>
<p>Abraço <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rafaeltuelho.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rafaeltuelho.wordpress.com/274/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=274&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rafaeltuelho.net.br/2012/11/16/bash-script-substituindo-um-texto-em-varios-arquivos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8f139bacbb0559d5b6e5fe0bd736cf9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rafaeltuelho</media:title>
		</media:content>
	</item>
		<item>
		<title>TDC 2012: the developers conference</title>
		<link>http://rafaeltuelho.net.br/2012/10/14/tdc-2012-the-developers-conference/</link>
		<comments>http://rafaeltuelho.net.br/2012/10/14/tdc-2012-the-developers-conference/#comments</comments>
		<pubDate>Sun, 14 Oct 2012 17:32:20 +0000</pubDate>
		<dc:creator>rafaeltuelho</dc:creator>
				<category><![CDATA[Comunidade]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Publicações]]></category>
		<category><![CDATA[COMUNIDADE]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[TDC]]></category>
		<category><![CDATA[TDC2012]]></category>

		<guid isPermaLink="false">http://rafaeltuelho.wordpress.com/?p=268</guid>
		<description><![CDATA[Este ano tive a honra de ter uma palestra aceita no evento The Developers Conference (edição Goiânia). O TDC é um dos maiores eventos de software do país. O evento reune anualmente desenvolvedores das principais plataformas e tecnologias do mundo do software. É uma verdadeira mistura de tribos tecnologicas. São várias trilhas com debates e [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=268&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><img class="alignleft" style="border:none;" title="The Developers Conference 2012, um evento organizado pela Globalcode" alt=" The Developers Conference 2012, um evento organizado pela Globalcode" src="http://www.thedevelopersconference.com.br/banners/2012/banner-TDC2012-goiania-250x120.png" height="120" width="250" /></p>
<p>Este ano tive a honra de ter uma palestra aceita no evento <em><a href="http://www.thedevelopersconference.com.br" target="_blank"><strong>T</strong>he <strong>D</strong>evelopers <strong>C</strong>onference</a></em> (edição Goiânia). O <strong>TDC</strong> é um dos maiores eventos de software do país. O evento reune anualmente desenvolvedores das principais plataformas e tecnologias do mundo do software. É uma verdadeira mistura de tribos tecnologicas. São várias trilhas com debates e palestras de altíssima qualidade disponíveis para todos os interesses e gostos. As trilhas acontencem simultâneamente durante o evento.</p>
<p>Na edição Goiânia que acontence dias 20 e 21 de Outubro participarei da trilha Java com a paelstra &#8220;<a href="http://www.thedevelopersconference.com.br/tdc/2012/goiania/trilha-java#programacao" target="_blank">Aumentando a eficiência do web container com chamadas assíncronas</a>&#8220;.</p>
<p>Se você ainda não fez a sua <a href="http://www.thedevelopersconference.com.br/tdc/2012/inscricoes#goiania" target="_blank">inscrição</a> corra e não perca a oportunidade de ficar por dentro das novidades no mundo do software e aproveite para fazer um ótimo <em>social network</em> durante o evento.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rafaeltuelho.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rafaeltuelho.wordpress.com/268/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=268&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rafaeltuelho.net.br/2012/10/14/tdc-2012-the-developers-conference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8f139bacbb0559d5b6e5fe0bd736cf9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rafaeltuelho</media:title>
		</media:content>

		<media:content url="http://www.thedevelopersconference.com.br/banners/2012/banner-TDC2012-goiania-250x120.png" medium="image">
			<media:title type="html">The Developers Conference 2012, um evento organizado pela Globalcode</media:title>
		</media:content>
	</item>
		<item>
		<title>Colhendo envidências em caso de erro (crash) na JVM</title>
		<link>http://rafaeltuelho.net.br/2012/07/04/colhendo-envidencias-em-caso-de-erro-crash-na-jvm/</link>
		<comments>http://rafaeltuelho.net.br/2012/07/04/colhendo-envidencias-em-caso-de-erro-crash-na-jvm/#comments</comments>
		<pubDate>Wed, 04 Jul 2012 20:37:59 +0000</pubDate>
		<dc:creator>rafaeltuelho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[heap dump]]></category>
		<category><![CDATA[jVisualVM]]></category>
		<category><![CDATA[jvm hotspot]]></category>

		<guid isPermaLink="false">http://rafaeltuelho.wordpress.com/?p=234</guid>
		<description><![CDATA[Sabe aquela situação em que a equipe responsável pelo ambiente de produção chega pra você e diz: &#8220;o servidor X está caindo toda hora&#8230; já olhamos os recursos da máquina (rede, memória, cpu e disco), inclusive o log do servidor, mas não identificamos nada&#8230;&#8221; Isso mesmo! Há casos em que seu processo caiu sem dar [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=234&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Sabe aquela situação em que a equipe responsável pelo ambiente de produção chega pra você e diz: &#8220;o servidor X está caindo toda hora&#8230; já olhamos os recursos da máquina (rede, memória, cpu e disco), inclusive o log do servidor, mas não identificamos nada&#8230;&#8221;</p>
<p>Isso mesmo! Há casos em que seu processo caiu sem dar explicações e sem deixar pista alguma.</p>
<p>Já tive a oportunidade de passar por essa situação algumas vezes&#8230; Trata-se de uma situação complicada, pois quase sempre ocorre em um momento e ambiente crítico onde o tempo para solução é o seu pior inimigo. Bem, após bater cabeça com esse tipo de problema, posso afirmar que a melhor opção é preparar o seu ambiente para colher algumas evidências quando o problema voltar a ocorrer. Como quase tudo na TI esse tipo de situação é inevitável. Softwares e Hardware podem falhar por &#8220;n&#8221; motivos. Nesse post deixo algumas dicas que podem lhe ajudar na investigação &#8220;pós queda&#8221; de um processo Java (rodando em cima de uma JVM).</p>
<p>Existem dois casos em que é bastante comum o processo da JVM cair:</p>
<ol>
<li><strong>insuficiência de memória</strong></li>
<li><strong>algum erro fatal da jvm</strong></li>
</ol>
<p>O tipo de erro relacionado à insuficiência de memória é o conhecido por OutOfMemoryError (OOM) e ocorre devido à algum <em>memory leak</em> no código da aplicação. Para analisar a causa desse tipo de erro é interessante ter em mãos o estado (snapshot) do Heap da JVM no momento em que o erro ocorre. Para isso é necessário habilitar alguns parâmetros na JVM conforme abaixo:</p>
<h3><span id="Gera.C3.A7.C3.A3o_do_Dump_HPROF_do_Heap_da_JVM." class="mw-headline"> Geração do Dump (formato <a title="HPROF" href="http://java.sun.com/developer/technicalArticles/Programming/HPROF.html" target="_blank">hprof</a>) do Heap da JVM. </span></h3>
<p>Adicionar as seguintes propriedades no comando que inicia a JVM. Caso o comando seja parametrizado em um arquivo de configuração, basta usar uma variável JAVA_OPTS como no exemplo abaixo.</p>
<pre># HeapDUMP e Core DUMP
# registra a data e hora de início do processo
DATE_START=`date  +%d-%m-%Y-%k%M`

# Habilita a geração do DUMP de memória (HPROF)
JAVA_OPTS="$JAVA_OPTS <strong>-XX:+HeapDumpOnOutOfMemoryError</strong> "
JAVA_OPTS="$JAVA_OPTS <strong>-XX:HeapDumpPath</strong>=/var/log/jvm/heapdump_$DATE_START.hprof "</pre>
<p>NOTA: <em>o arquivo de dump no formato .hprof pode ser aberto com os utilizatários <a title="jVisualVM" href="http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html" target="_blank">jVisualvm</a> (fornecido pelo JDK Sun/Oracle Hotspot) ou <a title="MAT" href="http://www.eclipse.org/mat/" target="_blank">Eclipse Memory Analizer</a> (MAT).<span style="color:#800000;"> <strong>É necessário que a versão e arquitetura do JDK utilizado na análise dump seja idêntica à JVM utilizada pelo servidor de aplicação onde o erro ocorreu.</strong></span></em></p>
<p>O segundo caso de erro pode ser gerado por algum problema entre a JVM e SO. Um caso típico é o erro de estouro de pilha conhecido como <em>StackOverflowError</em>. Esse tipo de erro pode ocorrer caso a aplicação utilize algum tipo de loop infinito ou uma recursividade muito profunda. O tamanho da pilha alocada pela JVM durante a criação de uma thread java é de 1024KB (1mb) em um sistema Linux x64. É possível alterar esse valor para mais ou para menos a depender da necessidade da aplicação. O parâmetro da JVM <strong>-Xss:&lt;n&gt;k</strong> altera o valor da pilha, sendo que &lt;n&gt; é um valor inteiro.</p>
<h3><span id="Gera.C3.A7.C3.A3o_do_coredump_.28threads_e_mem.C3.B3ria.29_da_JVM" class="mw-headline"> Geração do coredump (threads e memória) da JVM </span></h3>
<p>Adicionar as seguintes propriedades no comando que inicia a JVM.</p>
<pre># Habilita a geração de coredump (BIN)
JAVA_OPTS="$JAVA_OPTS <strong>-XX:OnError='gcore -o /var/log/jvm/jboss_PID%p_$DATE_START.coredump %p'</strong> "
JAVA_OPTS="$JAVA_OPTS <strong>-XX:ErrorFile</strong>=/var/log/jvm/hs_err_jboss_PID%p_$DATE_START.log "</pre>
<p><em>NOTAS:</em></p>
<ul>
<li><em>o arquivo de dump no formato hprof pode ser aberto com os utilizatários jVisualvm (fornecido pelo JDK) ou Eclipse Memory Analizer (MAT).<span style="color:#800000;"> <em> <strong>É necessário que a versão e arquitetura do JDK utilizado na análise dump seja idêntica à JVM utilizada pelo servidor de aplicação onde o erro ocorreu.</strong></em></span></em></li>
<li><em>Para que o comando <strong>gcore</strong> (invocado pela JVM após o evento de erro) funcione é necessário que o pacote <strong>gdb</strong> (A GNU source-level debugger for C, C++, Fortran and other languages) esteja devidamente instalado no Sistema Operacional.</em></li>
</ul>
<h3><span id="Gerando_dumps_da_JVM_em_tempo_de_runtime_manualmente" class="mw-headline"> Gerando dumps da JVM em tempo de runtime manualmente </span></h3>
<p>O formato binário pode ser aberto com as ferramentas: jstack (JDK), jVisualVM (JDK), Eclipse MAT ou qualquer outro profiler Java que reconheça o formato HPROF.</p>
<pre>jmap -dump:live,format=b,file=jvm_heap.bin &lt;PID&gt;</pre>
<p>O formato texto pode ser aberto com as ferramentas: jVisualVM (JDK), <a title="IBM Thread Analizer" href="https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=2245aa39-fa5c-4475-b891-14c205f7333c" target="_blank">IBM Thread Analizer</a> ou qualquer outro profiler Java que reconheça dump de threads Java.</p>
<pre>jstack -F -l &lt;PID&gt; &gt; /tmp/jvm_thread.dump</pre>
<p><em>NOTA: os procedimentos acima causam o travamento das threads (equivalente ao efeito Stop The World do FullGC). <span style="color:#800000;"><strong>Portanto utilize com cautela em ambiente de produção!</strong></span></em></p>
<p>A análise dos dumps citados neste post é assunto para um novo post. Existem várias ferramentas que podem ser utilizadas na análise. Além das ferramentas é importante ter conhecimento da arquitertura da Máquina Virtual Java utilizada. No caso do dump de memória (heap) é importante conhecer a divisão geracional dos pools de memória da JVM , bem como os vários mecanismos de coleta de lixo. Para o dump de threads é importante conhecer um pouco sobre a execução de threads na plataforma Java: sincronização, pilha de execução, thread monitor, thread status (WAINTING, RUNNING, BLOCKED, etc). Com a ferramenta certa e com um pouco de paciência é possível chegar a tão desejada causa raiz do problema: nome da classe, nome do método, nome da biblioteca ou até mesmo a linha de código que causa ou influência o crash do processo Java.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rafaeltuelho.wordpress.com/234/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rafaeltuelho.wordpress.com/234/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=234&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rafaeltuelho.net.br/2012/07/04/colhendo-envidencias-em-caso-de-erro-crash-na-jvm/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8f139bacbb0559d5b6e5fe0bd736cf9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rafaeltuelho</media:title>
		</media:content>
	</item>
		<item>
		<title>Manutenção em Java Key Stores (JKS) usando o Keytool</title>
		<link>http://rafaeltuelho.net.br/2012/07/04/manutencao-em-java-key-stores-jks-usando-o-keytool/</link>
		<comments>http://rafaeltuelho.net.br/2012/07/04/manutencao-em-java-key-stores-jks-usando-o-keytool/#comments</comments>
		<pubDate>Wed, 04 Jul 2012 18:06:18 +0000</pubDate>
		<dc:creator>rafaeltuelho</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Segurança Digital]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[certificado digital]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[JKS]]></category>
		<category><![CDATA[keystore]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://rafaeltuelho.wordpress.com/?p=229</guid>
		<description><![CDATA[Manutenção de Kestores já existentes Em certas situações é necessário realizar uma manutenção em um keystore já existente no servidor. A manutenção pode ser motivada pela necessidade de importar/exportar uma chave/certitificado de outro ambiente no keystore em questão. Segue abaixo alguns comandos úteis da ferramenta keytool (fornecida pelo JDK da Sun/Oracle) Listar o conteúdo de [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=229&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<h2><span id="Manuten.C3.A7.C3.A3o_de_Kestores_j.C3.A1_existentes" class="mw-headline"> Manutenção de Kestores já existentes </span></h2>
<p>Em certas situações é necessário realizar uma manutenção em um keystore já existente no servidor. A manutenção pode ser motivada pela necessidade de importar/exportar uma chave/certitificado de outro ambiente no keystore em questão.</p>
<p>Segue abaixo alguns comandos úteis da ferramenta <strong>keytool </strong>(fornecida pelo JDK da Sun/Oracle)</p>
<h3><em><span id="Listar_o_conte.C3.BAdo_de_um_keystore" class="mw-headline"> <strong>Listar</strong> o conteúdo de um keystore </span></em></h3>
<p>Antes de qualquer manutenção no keystore é interessante listar o seu conteúdo.</p>
<ul>
<li>O comando abaixo lista todos os certificados armazenados no keystore (JKS) informado.</li>
</ul>
<pre>keytool -list -keystore server_keystore.jks</pre>
<p>A saída do comando deve ser semelhante a apresentada pela listagem abaixo:</p>
<pre> *****************  WARNING WARNING WARNING  *****************                                                                                                                   
 * The integrity of the information stored in your keystore  *
 * has NOT been verified!  In order to verify its integrity, *
 * you must provide your keystore password.                  *
 *****************  WARNING WARNING WARNING  *****************

 Keystore type: JKS
 Keystore provider: SUN

 Your keystore contains 4 entries

 <strong>server1.domain.com</strong>, Mar 26, 2012, PrivateKeyEntry, 
 Certificate fingerprint (MD5): A7:8B:B7:9A:11:50:CC:98:4C:B5:89:BA:04:3B:CD:AD
 <strong>server2.domain.com</strong>, Mar 26, 2012, PrivateKeyEntry, 
 Certificate fingerprint (MD5): 2F:A2:50:65:C9:B2:2B:16:C0:2E:10:8A:8C:AB:50:E0
 <strong>server3.domain.com</strong>, Mar 26, 2012, PrivateKeyEntry, 
 Certificate fingerprint (MD5): 98:CC:AF:88:82:85:07:9A:23:FA:3C:FB:AD:1C:14:62
 <strong>server4.domain.com</strong>, Mar 26, 2012, PrivateKeyEntry, 
 Certificate fingerprint (MD5): 84:57:8C:40:03:12:F1:56:0B:89:9D:1E:20:E6:48:B5</pre>
<h3><span id="Exportar_um_certificado_espec.C3.ADfico" class="mw-headline"> <strong>Exportar</strong> um certificado específico </span></h3>
<ul>
<li>No exemplo abaixo o certificado (identificado pelo alias <strong>server3.domain.com</strong>) armazenado no keystore server_keystore.jks será exportado para o arquivo <strong>server3.cer</strong></li>
</ul>
<pre>keytool -export -alias server3.domain.com -keystore server_keystore.jks -file server3.cer</pre>
<h3><em><span id="Importar_um_certificado_espec.C3.ADfico" class="mw-headline"> <strong>Importar</strong> um certificado específico </span></em></h3>
<p>De posse do certificado exportado no passo anterior basta usar o comando <em>keytool &#8211;import</em> para importá-lo em um keystore (JKS) diferente.</p>
<ul>
<li>No exemplo abaixo o certificado (identificado pelo alias <strong>server1.domain.com</strong>) armazenado no arquivo server1.cer será importado dentro do keystore client_keystore.jks</li>
</ul>
<pre>keytool -import -alias server1.domain.com -file server1.cer -keystore client_keystore.jks</pre>
<h3><em><span id="Clonar_um_certificado_espec.C3.ADfico" class="mw-headline"> <strong>Clonar</strong> um certificado específico </span></em></h3>
<p>Caso seja necessário clonar uma determinada chave/certificado armazenado no keystore basta utilizar o comando <em>keytool -keyclone</em>.</p>
<ul>
<li>No exemplo abaixo o certificado identificado pelo alias <strong>server3.domain.com</strong> será clonado com um novo alias (<strong>clone_</strong>server3.domain.com) dentro do keystore server_keystore.jks</li>
</ul>
<pre>keytool -keyclone -alias server3.domain.com -dest clone_server3 -keystore server_keystore.jks</pre>
<p>obs:<br />
1) você será questionado quanto a senha que deseja definir para a chave clonada. Caso queira manter a senha da chave original (clonada) confirme com &#8216;&lt;Enter&gt;&#8217;.<br />
2) a opção &#8216;-keyclone&#8217; funciona apenas para certificados contendo o par de chaves pública/privada. Não é possível clonar (duplciar) chaves públicas.</p>
<h3><em><span id="Excluir_um_certificado_espec.C3.ADfico" class="mw-headline"> <strong>Excluir</strong> um certificado específico </span></em></h3>
<p>Caso seja necessário excluir uma determinada chave/certificado armazenado no keystore basta utilizar o comando <em>keytool -delete</em>.</p>
<ul>
<li>No exemplo abaixo o certificado identificado pelo alias <strong>server1.domain.com</strong> será excluído do keystore server_keystore.jks</li>
</ul>
<pre>keytool -delete -alias server1.domain.com -keystore server_keystore.jks</pre>
<h3><em><span id="Renomear_.28altear_o_alias.29_um_certificado_espec.C3.ADfico" class="mw-headline"><strong>Renomear (altear o alias)</strong> um certificado específico </span></em></h3>
<p>Caso seja necessário renomear (alterar o alias) uma determinada chave/certificado armazenado no keystore basta utilizar o comando <em>keytool -changealias</em>.</p>
<ul>
<li>No exemplo abaixo o certificado identificado pelo alias <strong>server1.domain.com</strong> será renomeado para o alias <strong>serverX</strong> no keystore server_keystore.jks</li>
</ul>
<pre>keytool -changealias -alias server1.domain.com -destalias serverX.domain.com -keystore server_keystore.jks</pre>
<ul>
<li>para mais detalhes sobre a ferramenta keytool consulte a documentação oficial do JDK disponível em <a class="external autonumber" href="http://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html" rel="nofollow">[1]</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rafaeltuelho.wordpress.com/229/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rafaeltuelho.wordpress.com/229/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=229&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rafaeltuelho.net.br/2012/07/04/manutencao-em-java-key-stores-jks-usando-o-keytool/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8f139bacbb0559d5b6e5fe0bd736cf9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rafaeltuelho</media:title>
		</media:content>
	</item>
		<item>
		<title>Configuração de Portas no JBoss AS 5 (Binding Service)</title>
		<link>http://rafaeltuelho.net.br/2012/05/29/jboss-as-5-ports-bind/</link>
		<comments>http://rafaeltuelho.net.br/2012/05/29/jboss-as-5-ports-bind/#comments</comments>
		<pubDate>Tue, 29 May 2012 20:36:37 +0000</pubDate>
		<dc:creator>rafaeltuelho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[as5 configuração]]></category>

		<guid isPermaLink="false">http://rafaeltuelho.wordpress.com/?p=213</guid>
		<description><![CDATA[Serviço de Gerenciamento de Portas O JBoss AS gerencia o mapeamento de portas utilizadas pelos diversos serviços do servidor através do mecanismo conhecido por Ports Bind. Esse serviço é configurado no arquivo localizado em JBOSS_HOME/server/default/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml E possui o seguinte esquema:  definição do bean ServiceBindingManagementObject que possui o conjunto de portas prédefinido no JBossAS. &#60;bean name="ServiceBindingManagementObject" [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=213&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<h4>Serviço de Gerenciamento de Portas</h4>
<p>O JBoss AS gerencia o mapeamento de portas utilizadas pelos diversos serviços do servidor através do mecanismo conhecido por <strong>Ports Bind</strong>.<br />
Esse serviço é configurado no arquivo localizado em</p>
<pre>JBOSS_HOME/server/default/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml</pre>
<p>E possui o seguinte esquema:</p>
<ul>
<li> definição do bean <strong>ServiceBindingManagementObject</strong> que possui o conjunto de portas prédefinido no JBossAS.</li>
</ul>
<pre> &lt;bean name="ServiceBindingManagementObject"
       class="org.jboss.services.binding.managed.ServiceBindingManagementObject"&gt;
  &lt;constructor&gt;
   &lt;parameter&gt;${jboss.service.binding.set:ports-default}&lt;/parameter&gt;
   &lt;parameter&gt;
    &lt;set&gt;
     &lt;inject bean="PortsDefaultBindings"/&gt;
     &lt;inject bean="Ports01Bindings"/&gt;
     &lt;inject bean="Ports02Bindings"/&gt;
     &lt;inject bean="Ports03Bindings"/&gt;
    &lt;/set&gt;
   &lt;/parameter&gt;
   &lt;parameter&gt;&lt;inject bean="StandardBindings"/&gt;&lt;/parameter&gt;
  &lt;/constructor&gt;
 &lt;/bean&gt;</pre>
<ul>
<li>definição do conjunto de portas definidos no bean anterior</li>
</ul>
<pre> &lt;bean name="PortsDefaultBindings" class="org.jboss.services.binding.impl.ServiceBindingSet"&gt;
  &lt;constructor&gt;
   &lt;parameter&gt;ports-default&lt;/parameter&gt;
   &lt;parameter&gt;${jboss.bind.address}&lt;/parameter&gt;
   &lt;parameter&gt;0&lt;/parameter&gt;
   &lt;parameter&gt;&lt;null/&gt;&lt;/parameter&gt;
  &lt;/constructor&gt;
 &lt;/bean&gt;</pre>
<p>Observe que, por padrão, o JBossAS fornece quatro conjunto de portas: <strong>PortsDefaultBindings</strong>, <strong>Ports01Bindings</strong>, <strong>Ports02Bindings</strong> e <strong>Ports03Bindings</strong>&#8216;.</p>
<p>O que diferencia cada conjunto é o incremento aplicado a cada porta aberta pelos diversos serviços do JBoss. Por exemplo, o Ports01Bindings (ports-01) adiciona 100 ao valor da porta usada pelo conector http do JBoss Web, que por padrão é <strong>8080</strong>, mas neste caso (usando o conjunto ports-01) passará a ser <strong>8180</strong>.</p>
<p>Caso haja a necessidade de subir mais que quatro instâncias em um mesmo servidor utilizando o mecanismo de Ports Bind, será necessário definir novos conjuntos de portas (ex. Ports<strong>04</strong>Bindings, Ports<strong>05</strong>Bindings etc). Porém, é mais conveniente definir um conjunto de portas dinâmico. Dessa forma seu valor de incremento (padrão 100) pode ser parametrizado durante o statup do JBoss. Para isso precisamos fazer duas alterações no arquivo bindings-jboss-beans.xml.</p>
<ul>
<li> injetar um novo bean que define o conjuto de portas dinâmico/genérico.</li>
</ul>
<p>Chamaremos esse novo bean de Ports<strong>Dyna</strong>Bindings.</p>
<pre>&lt;bean name="ServiceBindingManagementObject"
      class="org.jboss.services.binding.managed.ServiceBindingManagementObject"&gt;
 &lt;constructor&gt;
  &lt;parameter&gt;${jboss.service.binding.set:ports-default}&lt;/parameter&gt;
  &lt;parameter&gt;
   &lt;set&gt;
    &lt;inject bean="PortsDefaultBindings"/&gt;
    &lt;inject bean="Ports01Bindings"/&gt;
    &lt;inject bean="Ports02Bindings"/&gt;
    &lt;inject bean="Ports03Bindings"/&gt;
<strong> &lt;inject bean="PortsDynaBindings"/&gt;</strong>
   &lt;/set&gt;
  &lt;/parameter&gt;
  &lt;parameter&gt;&lt;inject bean="StandardBindings"/&gt;&lt;/parameter&gt;
 &lt;/constructor&gt;
&lt;/bean&gt;</pre>
<ul>
<li> definir o bean Ports<strong>Dyna</strong>Bindings.</li>
</ul>
<p>Para isso basta copiar a definição do bloco Ports<strong>Default</strong>Bindings as propriedades conforme destacado abaixo.</p>
<pre> &lt;bean <strong>name="PortsDynaBindings"</strong> class="org.jboss.services.binding.impl.ServiceBindingSet"&gt;
  &lt;constructor&gt;
   <strong>&lt;parameter&gt;ports-dyna&lt;/parameter&gt;</strong>
   &lt;parameter&gt;${jboss.bind.address}&lt;/parameter&gt;
   <strong>&lt;parameter&gt;${jboss.bind.offset}&lt;/parameter&gt;</strong>
   &lt;parameter&gt;&lt;null/&gt;&lt;/parameter&gt;
  &lt;/constructor&gt;
 &lt;/bean&gt;</pre>
<p>Agora para usar esse novo esquema basta informar no arquivo de parâmetros da JVM da instância (run.conf) ou no script de inicialização do JBoss o nome do novo conjunto de portas, bem como a propriedade jboss.bind.offset. Veja como fica no arquivo run.conf:</p>
<pre>JAVA_OPTS=$JAVA_OPTS -Djboss.service.binding.set=<strong>ports-dyna</strong>
JAVA_OPTS=$JAVA_OPTS -Djboss.bind.offset=<strong>400</strong></pre>
<p>Esses parâmetros podem ser informados direto na linha de comando que inicia o JBoss:</p>
<pre>JBOSS_HOME/bin/run.sh -c default -b 0.0.0.0 -Djboss.service.binding.set=<strong>ports-dyna</strong> -Djboss.bind.offset=<strong>400</strong></pre>
<p>Dessa forma o JBoss fará o bind das portas incrementando o valor 400 ao valor padrão definido para cada serviço. Por exemplo, o JBoss Web estará acessível através da porta 8480.</p>
<p><strong>Para subir novas intâncias basta alterar o valor do parâmetro <span style="color:#3366ff;">jboss.bind.offset</span></strong></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rafaeltuelho.wordpress.com/213/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rafaeltuelho.wordpress.com/213/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rafaeltuelho.net.br&#038;blog=4054718&#038;post=213&#038;subd=rafaeltuelho&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rafaeltuelho.net.br/2012/05/29/jboss-as-5-ports-bind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/8f139bacbb0559d5b6e5fe0bd736cf9c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rafaeltuelho</media:title>
		</media:content>
	</item>
	</channel>
</rss>
