quarta-feira, 18 de março de 2009

Primeiros passos com o Jetty

Desde que comecei a trabalhar com desenvolvimento Web em Java, o principal container que utilizo é o Apache Tomcat. Comecei desenvolvendo para a versão 5.5 e logo já estava utilizando a versão 6.0.x e sempre achei um ótimo server, de fácil configuração e bom desempenho. Mas um dos servers de onde trabalho (Xeon 3ghz com 4 GB ram) começou a ter um grande aumento no número de requisições e isso expôs alguns limites do Tomcat. Começamos a ter quedas constantes do server junto com problemas de memória que só conseguimos resolver aumentando a memória da VM Java. Continuamos a utilizar o Tomcat mas tenho a impressão que estamos no limite (ou além do limite) do server.

O caso de sucesso da utilização do Jetty pelo site do GUJ, a falta de atualizações do Tomcat (que até esse post a última versão lançada pela Apache foi a 6.0.18 no final de julho de 2008) e minha curiosidade me fizeram olhar para o Jetty, para quem não sabe o Jetty é totalmente escrito em Java e é utilizado como servlet container do JBoss, então fui até o site efetuei o download da versão mais estável para o servlet 2.5 com o jsp 2.1 a 6.1.15.

Instalando o Jetty

Não há instalador apenas um arquivo compactado que ao ser extraído cria a seguinte estrutura:

jetty1

  • Contexts – diretório para hot deploy de aplicações.
  • Etc – diretório dos arquivos de configuração do Jetty.
  • Examples – diretório com aplicações de exemplo.
  • Extras – extensões opcionais para o Jetty.
  • Lib – diretório com todas as bibliotecas para rodar o Jetty.
  • Licenses – contém a licença do produto.
  • Log – saída padrão do server.
  • Modules – código fonte de todos os sub-módulos.
  • Patches – código-fonte de correções.
  • Project-website – site do projeto Jetty.
  • Webapps – possui aplicações de demonstração.

Os outros diretórios listados não são tão relevantes. No diretório raiz do Jetty está o start.jar que é responsável por iniciar o server e o pom.xml utilizado pelo plugin do Maven.

Iniciando o servidor

Para iniciar o servidor com as configurações padrões na porta 8080 basta executar o comando:

java –jar start.jar

As configurações são carregadas por padrão do arquivo  etc/jetty.xml que é na realidade um mapeamento da API de classes do Jetty que instancia os objetos, para quem trabalha com Java nada mais simples e intuitivo. Por exemplo:

   1: <Configure id="Server" class="org.mortbay.jetty.Server">



   2:   <Set name="port">8080</Set>



   3: </Configure>








Equivale em java á





   1: org.mortbay.jetty.Server server = new org.mortbay.jetty.Server();



   2: server.setPort(8080);








Há uma vasta referência de como utilizar o mapeamento nesse link. O arquivo jetty.xml pode ser carregado de qualquer lugar do disco e nem precisa ter esse nome, basta executar o server passando o local do arquivo como parâmetro:



java –jar start.jar c:\qualquerlugar\abc123.xml



Caso queira alterar configurações quando utilizar o arquivo de configuração padrão, pode-se redefini-las ao iniciar o server, por exemplo caso queira subir o server na porta 8888:



java –Djetty.port=8888 –jar start.jar



Configurações especificas para uma aplicação implantada podem ser configuradas no arquivo WEB-INF/jetty-web.xml (que pode ser também WEB-INF/web-jetty.xml) que possue o mesmo formato do jetty.xml difere apenas no fato de instanciar uma classe que representa o contexto da aplicação (org.mortbay.jetty.webapp.WebAppContext). Recursos JNDI são configurados no arquivo WEB-INF/jetty-env.xml, nada melhor do que outro exemplo para entender:





   1: <?xml version="1.0"?>



   2: <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">



   3:  



   4: <Configure class="org.mortbay.jetty.webapp.WebAppContext">



   5:  



   6:   <!-- Add an EnvEntry only valid for this webapp               -->



   7:   <New id="gargle"  class="org.mortbay.jetty.plus.naming.EnvEntry">



   8:     <Arg>gargle</Arg>



   9:     <Arg type="java.lang.Double">100</Arg>



  10:     <Arg type="boolean">true</Arg>



  11:   </New>



  12:  



  13:  <!-- Add an override for a global EnvEntry                           -->



  14:   <New id="wiggle"  class="org.mortbay.jetty.plus.naming.EnvEntry">



  15:     <Arg>wiggle</Arg>



  16:     <Arg type="java.lang.Double">55.0</Arg>



  17:     <Arg type="boolean">true</Arg>



  18:   </New>



  19:  



  20:   <!-- an XADataSource                                                -->



  21:   <New id="mydatasource99" class="org.mortbay.jetty.plus.naming.Resource">



  22:     <Arg>jdbc/mydatasource99</Arg>



  23:     <Arg>



  24:      <New class="com.atomikos.jdbc.SimpleDataSourceBean"><Set name="xaDataSourceClassName">org.apache.derby.jdbc.EmbeddedXADataSource</Set><Set name="xaDataSourceProperties">databaseName=testdb99;createDatabase=create</Set><Set name="UniqueResourceName">mydatasource99</Set></New>



  25:     </Arg>



  26:    </New>



  27:  



  28: </Configure>



  29:  




Realmente o Jetty me pareceu muito fácil de configurar (uma das afirmações que se vê no site), possui uma documentação muito boa e pode ser embutido em aplicações stand alone para diversos fins.



Minhas primeiras impressões sobre o Jetty foram muito boas, mas terei cautela e irei estudá-lo (testando) antes de substituir o Tomcat em minhas aplicações. Novidades interessantes que descobrir sobre ele postarei.



Abraços e até a próxima!



Referências


Wiki do Jetty - http://docs.codehaus.org/display/JETTY/Jetty+Wiki

4 comentários:

Muito bom o post!

vou falar sobre o Jetty em minha monografia, tou precisando vuar pois só tenho 30 dias pra concluir, e o Jetty foi adicionado agora na pre-banca!
minha mono eh um comparativo entre Tomcat e o Jetty, numa aplicação simples que faz uso apenas de sevlet e jsp!

gostaria de saber se vc tem mais material do Jetty, traduzido, pois tou na luta pra traduzir e entender os materiais do site!
se tiver, e for possivel enviar para o email:
kalbertocomputacao@hotmail.com

desde já muito grato!

Kalberto Sena

Obrigado pelo elogio! Bom infelizmente não tenho materiais em português e acho difícil que encontre algo mais consistente que a própria documentação do Jetty. Sugiro que dê uma olhada no site do Jetty (o link está no post), como irá comparar com o Tomcat acho que irá encontrar muito material sobre ele (português e inglês) no próprio site da apache e em fórums de Java (GUJ e Portal Java), utilize alguma ferramenta de teste para fazer as comparações (tipo o JUnit) pode dar uma olhada no java-source http://java-source.net/open-source/testing-tools abraços!

Opa! Tudo certo?? Cara, vc sabe como que faço para levantar 2 instancias do jetty em portas diferentes e com contextsPaths iquais? Isso é pq estou usando um mesmo servidor pra hospedar 2 sites. E faço o proxy reverso com nginx, apontando para cada uma das portas do jetty. Mais não funciona! =/ sempre aponta para o mesmo site. só funciona seu eu mudo para um contexto diferente do raiz. ja fez algo do tipo? valeu !

Ivan, você poderia me informar como poderia dizer o que está contido no diretório "contrib" e no "Resouses"?

desde já muito grato!

valeu!