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
