quarta-feira, 26 de novembro de 2008

Jopr!!! :)

O Jopr é uma ferramenta de gerenciamento e monitoração que permite "cuidar"de forma centralizada de diferentes servidores que fazem parte do seu ambiente. Resumindo, facilita a manutenção, testes, deployment e monitoração de JBoss AS, Apache, Postgres, Sistema Operacional, File System, etc... etc... etc... além de proporcionar gráficos de disponibilidade e alertas.

O nome Jopr (se pronuncia jopper) foi escolhido baseado no filme Jogos de Guerra (WarGames), onde havia um super computador chamado WOPR (Whopper) - War Operation Plan Response. :)

O Embedded Jopr também é uma ferramenta importante em toda essa história, pois tem foco em apenas 1 instância de JBoss disponibilizando ferramentas para monitorar e manter esta instância em forma gráfica (isso mesmo, gráfica).

Veja algumas referências sobre o Jopr abaixo.
Fórum:
http://www.jboss.com/index.html?module=bb&op=viewforum&f=292

Jopr:
http://www.jboss.org/jopr/

Embedded Jopr:
http://www.jboss.org/embjopr/

WarGames:
http://en.wikipedia.org/wiki/WarGames

Entrevista com Christian Morgan sobre o Jopr
http://www.redhatmagazine.com/2008/10/31/interview-chris-morgan-on-jopr/

Demo do Embedded Jopr:
http://www.jboss.org/embjopr/demo.html

terça-feira, 30 de setembro de 2008

Verificando código das Rules no Drools

Em muitos casos é necessário verificar o códifo fonte referente às Rules do Drools para entender algum erro gerado.
Para isso, utilize o parâmetro de start de VM:
-Ddrools.dump.dir=SEUDIRETORIO


Todos os fontes serão gerados no diretório informado.

Ex.:
package org.acme.fidelity;
import org.acme.fidelity.*;
public class Rule_CartaoBranco_0 {
private static final long serialVersionUID = 400L;
public static void consequence(org.drools.spi.KnowledgeHelper drools, org.acme.fidelity.SolicitacaoPassageiro sol, org.drools.FactHandle sol__Handle__ ) throws Exception {

sol.setCartao(Cartao.BRANCO)

}


}

terça-feira, 19 de agosto de 2008

JBoss Brasil!

Comunidade de usuários JBoss oficial do Brasil foi lançada recentemente pelo Edgar!Vale a pena conferir. http://jbossbrasil.ning.com/



Exibir minha página em JBoss Brasil

segunda-feira, 18 de agosto de 2008

Detectando Connection Leaks no JBoss - Parte 1

Quando o usuário te liga falando as famosas frases:
- "alguma coisa está acontecendo!" ou
- "hummm, a aplicação está estranha!" ou ainda
- "esse JBoss NÃO FUNCIONA! não fecha minhas conexões!" ... hummm "JBoss não fecha suas conexões"? Ok, o JBoss fecha conexões idle (timeout default de 15 minutos), mas até lá já estourou o pool, e olhando o log você verá as mensagens:

15:58:48,931 ERROR [STDERR] org.jboss.util.NestedSQLException: No ManagedConnections available within configured blocking timeout ( 30000 [ms] ); - nested throwable: (javax.resource.ResourceException: No ManagedConnections available within configured blocking timeout ( 30000 [ms] ))


E até que o JBoss é gente fina, ao fechar alguma conexão aberta avisa educadamente para você fazer isso:

16:03:19,135 INFO  [CachedConnectionManager] Closing a connection for you.  Please close them yourself: org.jboss.resource.adapter.jdbc.WrappedConnection@121dcac java.lang.Throwable: STACKTRACE


Mas afinal, em alguns casos a aplicação não loga em modo debug onde está abrindo/fechando as conexões, e em aplicações grandes, ou sem padronização, a tarefa de detectar um gargalo destes torna-se tarefa complicada. Então, como detectar onde está ocorrendo a leak?

Este post tem como objetivo mostrar algumas técnicas para isolar os pontos e atacá-los.

Para fazer esta prova de conceito, criei uma classe que tenta abrir 30 conexões em pool de no máximo 20, fazendo um loop e armazenando-as em um Map.

public class ConnectionLeak {

private static Logger log = Logger.getLogger(ConnectionLeak.class);

private static Map m = new HashMap();

public static void action() {
for (int i = 0; i < 30; i++) {
try {
Context ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("java:DefaultDS");
Connection c = ds.getConnection();
log.info("Obtendo conexao: " + c + " loop: " + i);
m.put(i, c);
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}



Estou logando um toString de cada conexão após abri-la:

16:31:33,444 INFO  [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@41f871 loop: 0
16:31:33,445 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@11df416 loop: 1
16:31:33,446 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@183d60d loop: 2
16:31:33,447 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@5a1e6b loop: 3
16:31:33,447 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@83198c loop: 4
16:31:33,448 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@1025f9f loop: 5
16:31:33,449 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@d3e83f loop: 6
16:31:33,450 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@3492fc loop: 7
16:31:33,450 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@19e0994 loop: 8
16:31:33,451 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@86f847 loop: 9
16:31:33,452 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@1162ab9 loop: 10
16:31:33,453 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@4eda4a loop: 11
16:31:33,465 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@1eab16b loop: 12
16:31:33,466 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@126099c loop: 13
16:31:33,467 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@40eca3 loop: 14
16:31:33,468 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@6fe350 loop: 15
16:31:33,469 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@1b4b415 loop: 16
16:31:33,469 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@9addef loop: 17
16:31:33,470 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@1609812 loop: 18
16:31:33,471 INFO [ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@9fe953 loop: 19

1. Monitore as conexões ativas do seu Datasource
Existem boas ferramentas para realizar uma monitoração efetiva do seu pool de conexões, entre elas está o JON - JBoss Operations Network que além de guardar histórico podendo ser filtrado em horas, dias, meses também gera alertas com ações remediativas e envio de e-mails ou traps SNMP. Porém o JBoss AS disponibiliza o Web Console e o JMX Console que, apesar de não serem tão completos como o JON, podem ser utilizados para um diagnóstico inicial. Abaixo um Screenshot do meu Connection Leak simulado:




2. Habilite o log abaixo no jboss-log4j.xml:

<!-- Show the evolution of the DataSource pool in the logs [inUse/Available/Max]-->
<category name="org.jboss.resource.connectionmanager.JBossManagedConnectionPool">
<priority value="TRACE" class="org.jboss.logging.XLevel"/>
</category>


2008-08-18 16:58:04,460 INFO  [org.jboss.ConnectionLeak] Obtendo conexao: org.jboss.resource.adapter.jdbc.WrappedConnection@4f12c2 loop: 1
2008-08-18 16:58:04,461 TRACE [org.jboss.resource.connectionmanager.JBossManagedConnectionPool] supplying ManagedConnection from pool: org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener@15092c0[state=NORMAL mc=org.jboss.resource.adapter.jdbc.local.LocalManagedConnection@d2883b handles=0 lastUse=1219089352148 permit=false trackByTx=false mcp=org.jboss.resource.connectionmanager.JBossManagedConnectionPool$PoolBySubject@554189 context=org.jboss.resource.connectionmanager.InternalManagedConnectionPool@141a32f xaResource=org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource@1ee1775 txSync=null]
2008-08-18 16:58:04,462 TRACE [org.jboss.resource.connectionmanager.JBossManagedConnectionPool] Got connection from pool org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener@15092c0[state=NORMAL mc=org.jboss.resource.adapter.jdbc.local.LocalManagedConnection@d2883b handles=0 lastUse=1219089352148 permit=true trackByTx=false mcp=org.jboss.resource.connectionmanager.JBossManagedConnectionPool$PoolBySubject@554189 context=org.jboss.resource.connectionmanager.InternalManagedConnectionPool@141a32f xaResource=org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource@1ee1775 txSync=null] [InUse/Available/Max]: [3/17/20]


3. Verifique as conexões em cache
O MBean CachedConnectionManager possui o método listInUseConnections() que permite a verificação das conexões em uso. Pode te dar alguma pista:



to be continued...

terça-feira, 12 de agosto de 2008

JBoss 4.2.3.GA

Pouco antes de sair o tão esperado JBoss 5, foi lançado o JBoss 4.2.3.GA que tem como principal característica, além das correções de bugs referentes à versões anteriores, a possibilidade de ser compilado com Java 6 descrita na Feature Request JBAS-4501.

Vale lembrar que o suporte a JDBC 4 deve ser considerado como modo experimental.

Esta General Availability (GA) foi disponibilizada no dia 18 de julho de 2008 (demorei um pouco para postar...)

Release Notes:
https://sourceforge.net/project/shownotes.php?release_id=614346&group_id=22866

JPS - Process Status Tool

Após alguns longos meses estou voltando a postar nesta madrugada de quarta-feira (13/08/2008) enquanto aguardo a finalização de alguns testes.
Existe uma ferramenta muito útil e de fácil utilização chamada JPS, a qual lista os processos Java startados no seu Sistema Operacional.

Bem melhor que digitar ps aux | grep java! :)

Exemplos:

[bmachado@bmachado ~]$ jps
5343
30286 Jps
30271 Main

[bmachado@bmachado ~]$ jps -l
5343
30456 sun.tools.jps.Jps
30271 org.jboss.Main

[bmachado@bmachado ~]$ jps -m
5343
30529 Main -c node1
30664 Jps -m


Mais informações:
http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html

terça-feira, 1 de julho de 2008

Open TDC - 2008

No dia 28/06 aconteceu o Open TDC da GlobalCode o qual contou com palestras muito legais sobre JavaSE, JavaEE, metodologias e tendências tecnológicas.

Apresentei a palestra Administração do JBoss Application Server que dava algumas dicas sobre ambiente de produção, performance, tuning, balanceamento de carga e monitoramento de um ambiente utilizando JON (JBoss Operations Network).

Foi uma experiência muito gratificante poder participar de um evento bacana ao lado de pessoas tão bem relacionadas no mercado Java.

Como disse na palestra, só tenho a agradecer a todas as pessoas que compareceram, pois era uma manhã fria de sábado, e mesmo assim estavam lá para assistir palestras sobre Java. :)

Aproveitei para rever alguns amigos das antigas como Dr. Spock que também palestrou no evento.

Valeu Edgar e David pelo apoio e confiança.

Veja algumas fotos abaixo:



Exemplo de balanceamento de carga 2 JBosses com Apache e mod_jk




Lançamento de camisetas


Pessoal pulando para pegar a camiseta :)
Eu, Edgar Silva (Solutions Architect JBoss) e David Barzilay (Gerente de Marketing da Red Hat BR)

Mais fotos aqui.

quarta-feira, 11 de junho de 2008

JBoss Resteasy JAXRS: REST in Peace

Estou aproveitando a noite para colocar alguns posts em dia... obs.: Sport 2x0 Corinthians - Sport bate Corinthians e leva Copa do Brasil pela 1ª vez...

Em um dos dias de consultoria, retornei ao escritório para conversar com o Edgar sobre um dos projetos. Ao chegar, o vi muito empolgado com REST - (JSR 311: JAX-RS: The JavaTM API for RESTful Web Services), que está se tornando cada vez mais popular como alternativa para arquiteturas baseadas em SOAP.

É uma spec que tem por objetivo disponibilizar uma API em Java para o rápido desenvolvimento de REST ful WebServices totalmente baseada em anotações (Java 5).

No fundo, a explicação mais básica para o objetivo da API é uma forma rápida de desenvolver um retorno (que pode ser um XML, Texto, etc) sem precisar saber de Servlets ou JAX-WS, por exemplo... :) ... de forma padronizada. O que torna o desenvolvimento muito produtivo.

Atualmente para implementar REST em Java acaba sendo um pouco sofrível, e esta JSR veio para facilitar e agilizar nossa vida.

Aproveitem para ver um mini-tutorial de fácil entendimento sobre JBoss Resteasy feito pelo Edgar.

JBoss Messaging 2.0 Alpha

Estou meio atrasado com o post sobre o JBoss Messaging 2.0 Alpha, mas vale a intenção :).

Dia 02/06 foi lançada a mais nova versão do JBoss Messaging, a qual tem foco em performance e o principal objetivo é ser a número 1 em providers de mensageria open-source.

Abaixo algumas das principais características:
- Arquitetura 100% baseada em POJOs
- Pode ser executado fora do JBoss AS, ou seja, independente do JBoss AS... não precisa ter o Application Server de pé.
- Alta performance utilizando Journal, podendo ser executado via Java NIO ou Linux Asynchronous IO
- Utilização de Apache MINA

Veja algumas comparações com outros providers, incluindo o JBossMQ e ActiveMQ:
http://www.jboss.org/file-access/default/members/jbossmessaging/freezone/docs/userguide-2.0.0.alpha1/html/performance.html#performance.results

Referências:
User Guide: http://www.jboss.org/file-access/default/members/jbossmessaging/freezone/docs/userguide-2.0.0.alpha1/html/index.html
Tim Fox's blog: http://jbossfox.blogspot.com/2008/03/high-performance-persistence-with-jboss.html
Clebert Suconic's Blog: http://clebertsuconic.blogspot.com/2008/05/speeding-up-io-on-files.html

quinta-feira, 20 de março de 2008

Alterando Portas do JBoss

Um dos maiores problemas que muitos administradores JBoss passam é como subir mais de uma configuração na mesma máquina. Há algumas formas de realizar isto, uma delas é criar um IP virtual e subir o JBoss com o parâmetro -b.

Exemplo:
./run.sh -c <configuracao> -b <host>

Outra forma é subir as duas configurações trocando as portas comuns para evitar conflitos. A forma mais fácil de trocar as portas é alterar o arquivo conf/jboss-service.xml descomentando o MBean org.jboss.services.binding.ServiceBindingManager e alterando o atributo ServerName para ports-02 ou ports-03, ou ports-n.

Exemplo:

<mbean code="org.jboss.services.binding.ServiceBindingManager"
name="jboss.system:service=ServiceBindingManager">
<attribute name="ServerName">ports-02</attribute>
<attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute>
<attribute name="StoreFactoryClassName">
org.jboss.services.binding.XMLServicesStoreFactory
</attribute>
</mbean>

A instalação do JBoss AS já disponibiliza um arquivo exemplo para o binding das portas, o ideal é copia-lo para o diretório conf da sua configuração customizando conforme seja necessário. Exemplo: /server/conf/port-bindings.xml
ou copia-lo no diretório server adicionando todas as possibilidades de binding de portas para cada configuração do JBoss. Exemplo:
/server/port-bindings.xml

Referências:
http://wiki.jboss.org/wiki/Wiki.jsp?page=JBossRunParameters
http://www.jboss.org/wiki/Wiki.jsp?page=UsingJBossBehindAFirewall
http://wiki.jboss.org/wiki/Wiki.jsp?page=ConfiguringMultipleJBossInstancesOnOneMachine
http://wiki.jboss.org/wiki/Wiki.jsp?page=JBossDTDs

quarta-feira, 5 de março de 2008

De UTF-8 para ISO-8859-1 e vice-versa

Para converter arquivos UTF-8 para ISO-8859-1 e vice-versa no Linux pode-se utilizar o iconv ou o recode.
No Blog do Mitre há bons exemplos do iconv:

Resumindo:
iconv -f utf-8 -t iso-8859-1 arquivo > novo_arquivo

sexta-feira, 29 de fevereiro de 2008

JBoss Portal: User Role

Para validar se um usuário possui uma determina Role no JBoss Portal basta fazer o seguinte:

No seu código Java do portlet:
request.isUserInRole("Admin");

Seguindo a jsr-168, as roles utilizadas no método isUserInRole precisam ser declaradas no portlet.xml para serem reconhecidas em um portlet container. Se não for declarado, sempre retornará false. Veja abaixo:

<portlet-app>
...
<portlet>
...
<security-role-ref>
<role-name>Admin</role-name>
</security-role-ref>
...
</portlet>
...
</portlet-app>

Clustering Scheduler

JBoss possui um MBean para agendamento de tarefas chamado Scheduler, o qual muitas pessoas se perguntam sobre sua atuação durante uma configuração em Cluster.
A idéia de uma configuração em cluster seria iniciar a execução do scheduler em apenas um nó (Master Node ) e caso este nó saia do cluster, a execução deve ser iniciada em um outro nó.

Para isso, a configuração do Scheduler deve ser a seguinte:


<mbean code="org.jboss.varia.scheduler.Scheduler"
name="Order:service=Scheduler">
<depends>jboss.ha:service=HASingletonDeployer,type=Barrier</depends>
<attribute name="StartAtStartup">true</attribute>
<attribute name="SchedulableClass">org.jboss.scheduler.OrderUpdateScheduler</attribute>
<attribute name="InitialStartDate">NOW</attribute>
<attribute name="SchedulePeriod">20000</attribute>
<attribute name="InitialRepetitions">-1</attribute>
</mbean>


Referências:
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=128528
http://wiki.jboss.org/wiki/Wiki.jsp?page=HASingletonDeployer

segunda-feira, 25 de fevereiro de 2008

JBoss Portal: Informações importantes

Abaixo irei descrever algumas informações importantes sobre JBoss Portal, a qual todos os desenvolvedores iniciantes de portlets devem se deparar.

Onde obter informações:
http://labs.jboss.com/jbossportal/docs/

FAQ:
http://jboss.org/index.html?module=bb&op=viewforum&f=215

No PortletSwap você consegue baixar alguns exemplos de portlets e temas já prontos para utilização no JBoss Portal:
http://labs.jboss.com/portletswap/downloads/

No site de downloads do JBoss (Portlets) também é possível obter outros portlets (Wiki, Forum e Blog):
http://labs.jboss.com/projects/download/

Ao criar seu portlet, utilize a classe org.jboss.portlet.JBossPortlet ao invés GenericPortlet. Com JBossPortlet você consegue obter informações importantes, como:

protected void doView(JBossRenderRequest request, JBossRenderResponse response) throws PortletException, IOException, UnavailableException {
//o usuário logado
User user = request.getUser();
user.getUserName()
//portlet utilizado
PortalNode node = request.getPortalNode();
node.getName();
//portal node
PortalNode portal = (PortalNode) request.getAttribute("org.jboss.portal.api.PORTAL_NODE");
while (portal.getType() != PortalNode.TYPE_PORTAL) {
portal = portal.getParent();
}
}

entre muitas outras coisas.

Um bom exemplo de uso disso, é a classe TestPortlet que vem junto com os Samples do JBoss Portal, vale a pena dar uma olhada.

terça-feira, 19 de fevereiro de 2008

Utilizando P6Spy JBoss

O P6Spy é uma ferramenta que permite realizar o monitoramento de queries realizadas utilizando JPA, Hibernate, etc. Sua utilização é bem simples para o JBoss, bastando apenas poucas configurações.

Copie o arquivo p6spy.jar para o diretório lib de sua configuração do JBoss:
cp p6spy.jar $JBOSS_HOME/server/sua_configuracao/lib

Copie o arquivo spy.properties para o diretório conf referente a sua configuração do JBoss:
cp spy.properties $JBOSS_HOME/server/sua_configuracao/conf

Edite o arquivo spy.properties para utilizar o driver jdbc referente ao banco de dados a ser utilizado, no meu caso, irei utilizar MySQL, entao irei utilizar a configuração:

# mysql Connector/J driver
realdriver=com.mysql.jdbc.Driver

Configure a propriedade logfile informando o arquivo onde será gravado os logs do P6Spy, no meu caso irei utilizar /tmp/spy.log

logfile = /tmp/spy.log

Edite o arquivo de configuração do seu DataSource no mudando o atributo driver-class para utilizar o P6Spy:
com.p6spy.engine.spy.P6SpyDriver

Pronto, com isso o arquivo spy.log receberá as queries executadas em seu sistema.

Referencias:
http://www.p6spy.com/

Encoding MySQL para UTF-8

Basta alterar o arquivo my.cnf da seguinte forma:
character-set-server=utf8
default-collation=utf8_unicode_ci

ou logo após se conectar utilizar o comando:
SET NAMES utf8

terça-feira, 29 de janeiro de 2008

Pneumotórax

Febre, hemoptise, dispnéia e suores noturnos.
A vida inteira que podia ter sido e que não foi.
Tosse, tosse, tosse.


Mandou chamar o médico:
— Diga trinta e três.
— Trinta e três . . . trinta e três . . . trinta e três . . .
— Respire.


...............................................................................................................


— O senhor tem uma escavação no pulmão esquerdo e o pulmão direito infiltrado.
— Então, doutor, não é possível tentar o pneumotórax?
— Não. A única coisa a fazer é tocar um tango argentino.

Manuel Bandeira

Java - Gerando RSS com ROME

ROME RSS and Atom Utilities é um framework java que serve para gerar arquivos RSS de forma fácil e rápida. Sua utilização basicamente consiste na criação de um objeto Feed e uma lista de Entries a qual será atribuida ao Feed.

A seguir há um exemplo de um Servlet que processa uma lista de Notícias gravada em um banco de dados e gera o RSS utilizando PrintWriter.


//imports...

public class FeedWriter extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/xml");
OutputStream os = response.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os , "UTF-8");
PrintWriter pw = new PrintWriter(osw);
create("rss_2.0", pw);
writer.close();
}

protected void create(String feedType, Writer writer) {
try {
SyndFeed feed = new SyndFeedImpl();
feed.setFeedType(feedType);

feed.setTitle("Noticias)");
feed.setLink("http://rome.dev.java.net");
feed.setDescription("BLA BLA BLA");

List entries = new ArrayList();
SyndEntry entry;
SyndContent description;

Dao dao = new Dao();
for (Noticia noticia : dao.findAllNoticias()) {
entry = new SyndEntryImpl();
entry.setTitle(noticia.getTitulo());
entry.setLink(noticia.getLink());
entry.setPublishedDate(noticia.getDataPost());
description = new SyndContentImpl();
description.setType("text/plain");
description.setValue(noticia.getDescricao());
entry.setDescription(description);
entries.add(entry);
}

feed.setEntries(entries);

SyndFeedOutput output = new SyndFeedOutput();
output.output(feed,writer);
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("ERROR: "+ex.getMessage());
}
}
}


O retorno será algo semelhante a:


Para saber mais sobre o ROME, acesse http://wiki.java.net/bin/view/Javawsxml/Rome

segunda-feira, 28 de janeiro de 2008

Saudades de Toronto

Saudades de andar nas ruas de Toronto às 2:00am e se sentir seguro...

Rafael José diz:
volta pra cá
Bruno Rossetto diz:
rs
Rafael José diz:
mas e agora? vai fazer oq?
Bruno Rossetto diz:
fiz o BO
Bruno Rossetto diz:
fazer nada
Bruno Rossetto diz:
fazer o q?
Bruno Rossetto diz:
nao tem o q fazer
Bruno Rossetto diz:
só resta tocar o tango argentino...


http://edgarsilva.com.br/2008/01/16/o-seu-salario-e-uma-bosta/

quinta-feira, 24 de janeiro de 2008

JBoss Profiler para detectar Memory Leaks

Após alguns estudos e testes utilizando JBoss profiler encontrei um artigo muito legal de Clebert Suconic e Michael Juntao Yuan sobre Memory Leaks, porém ao fazer a configuração adicional para utilizar o inventoryReport tive o seguinte erro:

12:06:35,596 ERROR [[HtmlAdaptor]] Servlet.service() for servlet HtmlAdaptor threw exception
javax.management.RuntimeErrorException
at org.jboss.mx.interceptor.ReflectedDispatcher.handleInvocationExceptions(ReflectedDispatcher.java:178)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:163)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
.
.
.
Caused by: java.lang.UnsatisfiedLinkError: notifyInventory


Para corrigi-lo, basta rodar os scripts de compilação para regerar os arquivos libjbossAgent.so e libjbossInspector.so e coloca-los em seu $LD_LIBRARY_PATH.

Artigo sobre Memory Leaks:
http://developer.redhatmagazine.com/2006/09/18/use-jboss-profiler-to-detect-memory-leaks/

Outros links úteis:
http://www.jboss.org/wiki/Wiki.jsp?page=JBossProfiler
http://wiki.jboss.org/wiki/Wiki.jsp?page=HowToConfigureJBossProfiler
http://weblogs.java.net/blog/edgars/archive/2007/06/looking_as_deep.html
http://www.jboss.org/?module=bb&op=viewtopic&t=102793
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4009745#4009745

segunda-feira, 14 de janeiro de 2008

Caracteres Chineses no Red Hat (ctrl + space)

Ctrl + space é uma das combinações mais importantes em IDEs Java (autoclomplete), porém a partir da versão 3 do Red Hat EL o ctrl + space ativa um esquema de caracteres não-ocidentais (Chinês Tradicional e Simplificado). Isto é disponibilizado pelo scim, e a forma mais fácil de desativar isso é desinstalando-o (a não ser que você precise de caracteres em Chinês).

Para desisntala-lo basta digitar em linha de comando: yum remove scim e desinstalar todas as suas dependências.

terça-feira, 8 de janeiro de 2008

compilerTargetVM compilerSourceVM source level 5

Caso queira utilizar recursos referentes à versão 5.0 da vm no JBoss em JSPs basta alterar o arquivo /jboss-web.deployer/conf/web.xml adicionando 2 parâmetros:

- compilerTargetVM = 1.5
- compilerSourceVM = 1.5

para o servlet org.apache.jasper.servlet.JspServlet

compilerTargetVM Compiler target VM
default is System.properties
java.specification.version > 1.4
[1.5] else [1.4]

compilerSourceVM Compiler source VM
default is System.properties
java.specification.version > 1.4
[1.5] else [1.4]

Syntax error, parameterized types are only available if source level is 5.0

segunda-feira, 7 de janeiro de 2008

Lendo propriedades de arquivo no JMeter

Praticamente todo mundo já leu alguma coisa sobre JMeter, ou já viu alguma apresentação em um dos vários eventos Java no país, ou até mesmo já colocou a mão na massa para realizar algum teste de stress com esta ferramenta. De fato, é muito simples realizar um teste de stress básico com JMeter, até mesmo em sistemas web.

Porém, o JMeter possui muitas características para incrementar seus testes de stress e deixá-los muito poderosos, como testes distribuídos, variáveis e funções, beanshell, etc...

Neste post irei mostrar como ler propriedades de um arquivo texto utilizando o componente CSV Data Set Config (element -> config).

Declarando as propriedades

O config CSV Data Set Config é atualmente a forma mais simples de ler propriedades de um arquivo, para isso, basta criar um arquivo texto com valores separados por vírgula.

Exemplo:
a1, b1, c1

Adicione o CSV Data Set Config em sua Thread Group configurando as propriedades da seguinte forma:



Filename: path do arquivo texto, ex: "../teste.txt" (os paths relativos são resolvidos a partir com o path do test plan ativo, também pode-se utilizar path absoluto)
Variable names: "a,b,c" (este será o nome das propriedades utilizadas para acessar os valores)
Delimiter (use '\t' for tab): ","

Exibindo propriedades

A partir da versão 2.3.1 foi adicionado o componente Debug Sampler o qual lista diversas coisas, entre elas, os valores das variáveis do arquivo.

Adicione o Debug Sampler em seu Thread Group (sampler -> debug sampler), e adicioner também um View Results Tree. O Debug Sampler irá trabalhar em conjunto com o View Results Tree, exibindo separadamente os valores referentes a cada request.

Abaixo está o resultado de um teste simples com leitura de propriedades de um arquivo.


Links relacionados
http://jakarta.apache.org/jmeter/usermanual/component_reference.html#CSV_Data_Set_Config
http://jakarta.apache.org/jmeter/usermanual/functions.html
http://jakarta.apache.org/jmeter/usermanual/component_reference.html#Debug_Sampler