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:
- 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:
25 de abril de 2009 11:17
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
25 de abril de 2009 16:55
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!
27 de abril de 2009 02:48
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 !
11 de maio de 2009 10:37
Ivan, você poderia me informar como poderia dizer o que está contido no diretório "contrib" e no "Resouses"?
desde já muito grato!
valeu!
Postar um comentário