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

<channel>
	<title>Diego Plentz &#187; tomcat</title>
	<atom:link href="http://plentz.org/tag/tomcat/feed/" rel="self" type="application/rss+xml" />
	<link>http://plentz.org</link>
	<description>plentiful thoughts from my empty head</description>
	<lastBuildDate>Sat, 03 Jul 2010 06:17:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Tomcat is deprecated</title>
		<link>http://plentz.org/2008/10/03/tomcat-is-deprecated/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tomcat-is-deprecated</link>
		<comments>http://plentz.org/2008/10/03/tomcat-is-deprecated/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 17:29:38 +0000</pubDate>
		<dc:creator>Diego Plentz</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[outofmemory]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://plentz.org/?p=204</guid>
		<description><![CDATA[Tomcat is deprecated. Use Jetty instead. É exatamente esse a impressão que eu tenho depois de migrar os nossos servidores para o Jetty. Depois de ver muita gente reclamando de OutOfMemory no Tomcat, inclusive aqui da empresa, resolvemos tentar o Jetty. A tempo que escutava o pessoal da Caelum (e principalmente o Kung) falando bem [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flickr.com/photos/hockeylover/2870581459/" title="Marky is frustrated by Hockey.Lover"><img src="http://farm4.static.flickr.com/3185/2870581459_59a7e18b58_m.jpg" alt="Marky is frustrated by Hockey.Lover" class="pc_img" height="160" width="240" style="border: 2px solid rgb(0, 0, 0);float: right; margin-left: 10px; margin-bottom: 10px;"/></a><br />
<a href="http://tomcat.apache.org/">Tomcat</a> is deprecated. Use <a href="http://www.mortbay.org/jetty/">Jetty</a> instead.</p>
<p>É exatamente esse a impressão que eu tenho depois de migrar os <a href="http://www.criterium.com.br">nossos servidores</a> para o Jetty. Depois de ver <strong>muita</strong> gente reclamando de <a href="http://wiki.apache.org/tomcat/OutOfMemory">OutOfMemory</a> no Tomcat, inclusive <a href="http://www.criterium.com.br">aqui da empresa</a>, resolvemos tentar o Jetty.</p>
<p>A tempo que escutava o pessoal da <a href="http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/">Caelum</a> (e principalmente o <a href="http://fabiokung.com/">Kung</a>) falando bem do Jetty, mas só quando se começa a usar que se percebe as vantagens. Como temos várias aplicações rodando (diferente do <a href="http://guj.com.br">GUJ</a>, que era só o <a href="http://www.jforum.net/">JForum</a>, acredito), imaginei que a troca não seria tão smooth <a href="http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/">assim</a>.</p>
<p>Claro que antes de sair trocando tudo, fizemos alguns testes pra ter certeza que tudo ia ocorrer bem. Por sinal, a troca foi <strong>bem</strong> tranquila do ponto de vista da aplicação, só tivemos que fazer alguns ajustes:</p>
<ul>
<li>o Jetty lança <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#unmodifiableMap(java.util.Map)">java.util.Collections$UnmodifiableMap</a> ao tentar modificar diretamente o (Hash)Map devolvido com <a href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletRequest.html#getParameterMap()">request.getParameterMap()</a> ao invés de usar o método setAttribute() do request &#8211; coisa que o Tomcat deixa;</li>
<li>Diferenças ao tentar recuperar um resource do sistema utilizando como pasta base &#8220;.&#8221;, ou usar &#8220;..&#8221; pra navegar na estrutura de pastas. Para resolver, basta usar como pasta base &#8220;/&#8221; (ex: &#8220;/com/foo/resources/xpto.xml&#8221;) e colocar dentro do WEB-INF/classes;</li>
<li>E a última, mas simples de resolver, é que o Jetty deixa habilitado listagem de diretórios. Você pode alterar isso no etc/webdefault.xml, trocando o atributo dirAllowed para false;</li>
</ul>
<p>Feitos esses ajustes, chegou a vez de configurar o Jetty para atender aos diferentes domínios. E é aqui que vi uma das grandes vantagens do Jetty. A parte de configuração dele fica <strong>muito</strong> organizada. Fizemos da seguinte forma:</p>
<ul>
<li>Para cada aplicação (pra cada .war na pasta /webapps do Jetty), criamos um arquivo de contexto no /contexts (não é necessário, mas como temos urls diferentes e contextos diferentes, tivemos que customizar &#8211; e acabamos ganhando um brinde que conto depois)</li>
<li>Cada arquivo de context tem uma estrutura estupidamente simples:
<p><code><br />
&lt;?xml version="1.0"  encoding="ISO-8859-1"?&gt;<br />
&lt;!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd"&gt;<br />
&lt;Configure class="org.mortbay.jetty.webapp.WebAppContext"&gt;<br />
&nbsp;&nbsp;&lt;Set name="contextPath"&gt;/&lt;/Set&gt;<br />
&nbsp;&nbsp;&lt;Set name="war"&gt;&lt;SystemProperty name="jetty.home" default="."/&gt;/webapps/demo_foo.war&lt;/Set&gt;<br />
&nbsp;&nbsp;&lt;Set name="defaultsDescriptor"&gt;&lt;SystemProperty name="jetty.home" default="."/&gt;/etc/webdefault.xml&lt;/Set&gt;<br />
<br />
&nbsp;&nbsp;&lt;Set name="virtualHosts"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Array type="String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Item&gt;demo.foo.com&lt;/Item&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Array&gt;<br />
&nbsp;&nbsp;&lt;/Set&gt;<br />
<br />
&lt;/Configure&gt;<br />
</code>
</li>
</ul>
<p>Explicando por partes:</p>
<ul>
<li><a href="http://docs.codehaus.org/display/JETTY/ContextDeployer">WebAppContext</a> é o tipo de contexto que você vai usar, estamos usando esse pois permite o hotdeploy</li>
<li>contextPath serve para dizer (óbvio) o contexto que quer que a aplicação fique disponível. Aqui prefirimos colocar todas no contexto / e configurar diferentes <a href="http://docs.codehaus.org/display/JETTY/Virtual+hosts">Virtual Hosts</a> pra cada aplicação.</li>
<li>a propriedade war só diz qual .war (que pode ser um exploded war também) que vai ser <em>deployado</em> naquele contexto</li>
<li>na seção que diz <a href="http://docs.codehaus.org/display/JETTY/Virtual+hosts">virtualHosts</a>, você pode configurar todos os endereços que quer que sua aplicacão responda. Para ela aceitar mais de um endereço, basta ir adicionando Item&#8217;s com as outras URLs. Aproveitando, no Jetty 7 será possível <a href="http://jira.codehaus.org/browse/JETTY-721">usar wildcards</a>!</li>
</ul>
<p>Com isso feito, ficou <strong>muito</strong> fácil configurar o deploy automático de todas nossas aplicações, pois basta substituir o arquivo .war e dar um <a href="http://en.wikipedia.org/wiki/Touch_(Unix)">touch</a> no arquivo de contexts que o Jetty faz reload do contexto (e esse é o brinde! )! Agora, com o Jetty combinado ao <a href="https://hudson.dev.java.net/">Hudson</a>, com um clique podemos fazer deploy de qualquer uma das nossas aplicações em um ambiente específico ou mesmo em todos, <strong>automaticamente</strong>. Mas <a href="https://hudson.dev.java.net/">isso</a> já é assunto para um outro post.</p>
<p></p>
<h3>Links Relacionados</h3>
<ul>
<li><a href="http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/">Melhorando o GUJ: Jetty, NIO e load balancing</a></li>
<li><a href="http://docs.codehaus.org/display/JETTY/Jetty+Documentation">Jetty Documentation</a></li>
<li></li>
</ul>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt="by-nc-nd" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-nd/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><img src="http://plentz.org/wordpress/?ak_action=api_record_view&id=204&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://plentz.org/2008/10/03/tomcat-is-deprecated/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
