Archive for March, 2008

Não sou tão monstro em comandos Linux quanto meu amigo Cláudio Miranda , mas um comandinho que vem me ajudado bastante é o :

ps aux | grep =run.sh | grep -v grep | awk ‘{ print $6 }’
Que imprime pra mim quanto o JBoss está gastando de memória residente, não é a única métrica importante, mas é um sinal importante para medir quanto que alguns tunnings estão ou não surtindo efeito.

Outra dica interessante é o comando:

watch -d2 “ps aux | grep =run.sh | grep -v grep | awk ‘{ print \$6 }’”

Que mostra a mudança do valor dinamicamente de 2 em 2 segundos.

Há 5 anos atrás tinhamos uma necessidade de integração em um cliente:

a) Usar Java na camada Servidora aproveitando a performance e suporte transacional dos EJBs

b) Usar Delphi como cliente

Eis então que durante alguns dias trabalhei na criação de um componente, o qual demos o nome de Jacode, não me pergunte a origem do nome, talvez eu estivesse bebado demais. Este projeto era embasado em vários conceitos de interoperabilidade, segurança e governança que hoje é bastante presente nas demandas de SOA de mercado. Vários outros desenvolvedores, da minha antiga empresa (Argos), contribuiram, estes caras, a maioria está hoje no Rio de Janeiro, São Paulo e Belo Horizonte, entre eles: Ricado Ferreira(Squadra), David Farias(Squadra) e Fábio Cabral(IBM). Este componente é usado até hoje pelo cliente, e o que pensavámos que fosse nos deixar pelo menos bem de vida 5 anos atrás, ficou para uso de somente um cliente, sendo assim, resolvi buscar os fontes de muitos anos atrás e tentar readaptá-lo para trabalhar em conjunto com o JBoss ESB, tive um tempo estes últimos dias e isto foi possível, apesar de que ainda há vários java.util.Vectors espalhados pelo código, e sem usar nada de Java 5.

Usando o Jacode com JBoss ESB

A idéia é doar/integrar os códigos do Jacode no core do ESB, isto se os caras quiserem/deixare/estiverem de bom humor e etc, que basicamente são 2 classes. a principal: org.jboss.soa.esb.ext.transformers.jacode.Jacode possui um método chamado de : getData(java.sql.Connection conn, int xmlType, int maxResults, String sql); este por sua vez devolve dados através de qualquer camada do JBoss ESB, podendo ser um Socket, ou para facilitar a vida um WebService. Veja exemplo da chamada:

@WebMethod(operationName = “getData”)
public String getData(@WebParam(name = “sql”)
String sql) {
try {
jacode = new Jacode();
return jacode.getData(ConnectionFactory.getConnection(), Jacode.XMLDELPHI, 30, sql) ;
} catch (SQLException ex) {
Logger.getLogger(DelphiBridge.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(DelphiBridge.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}

Na Cadama Delphi

Na camada Delphi, existe a classe da VCL TFieldDataLink que alimenta os DataControls através da referência a um DataSet, no caso este DataSet é um Stream que é o resultado String de nosso método, que é carregado para dentro de um componente TClientDataSet, que por sua vez possuirá o resultado em forma de um DataSet, exibindo os dados num DBGrid por exemplo, ou alguma ferramenta de Cubo de Decisão ou Relatório do Delphi. Veja o código de Exemplo na camada Delphi:

procedure TForm1.Button1Click(Sender: TObject);
var
service: DelphiBridge;
stream: TStringStream;
begin
service:= HTTPRIO1 as DelphiBridge;
ClientDataSet1.close;
stream:=TStringStream.create(service.getProductsSLAs);
ClientDataSet1.LoadFromStream(stream);
ClientDataSet1.open;
ShowMessage(’Data Loaded’);
end;

Integração é a Chave

Como você pode observar não há limites para as integrações no JBoss ESB, o que mais me chama a atenção é que estas são as realidades quando falamos de SOA no Brasil, os exemplos dos livros sempre falam de ERPs magnificos como PeopleSoft, SAP, mas quando pegamos algo em Delphi, VB, Clipper ou DataFlex, aí sim vem a pergunta se realmente sua ferramenta lhe ajuda a integrar sistemas de forma produtiva e realista, ou não!

Se você quiser assistir uma DEMO (meio complicada de criar pois o Wink no Linux é osso), clique aqui. 

[]s

No link: http://www.forbes.com/2007/03/27/07forbes2000_map.html

Você pode ver as 2000 maiores empresas do mundo, entre elas algumas brasileiras, no caso a mais bem colocada é a Petrobrás ocupando o número 50 no ranking do Forbes, ainda atrás de até várias empresas de tecnologias norte-americanas.

A lista das brasileira é a seguinte:

Rank Company Country Industry Sales ($bil) Profits ($bil) Assets ($bil) Market Vaue ($bil)
50 Petrobras-Petróleo Brasil Brazil Oil & Gas Operations

74.12

12.14 95.61 99.29
130 Vale do Rio Doce Brazil Materials 20.82

6.17

57.60 77.38
147 Banco Bradesco

Brazil

Banking 29.84 2.37 124.38

37.21

166 Banco do Brasil Brazil

Banking

22.15 2.78 138.68 26.78
330 Itaúsa Brazil Banking

13.87

0.98 66.36 17.18
411 Unibanco Group Brazil Banking 9.88

0.80

48.56 16.49
572 Eletrobrás

Brazil

Utilities 8.89 0.42 51.09

12.02

763 Usiminas Brazil

Materials

5.58 1.68 7.43 10.19
846 CSN-Cia Siderurgica Brazil Materials

4.29

0.86 10.27 9.02
863 Tele Norte Leste Brazil Telecommunications Services 7.16

0.48

11.20 6.61
887 Metalurgica Gerdau

Brazil

Materials 11.03 0.63 12.39

3.90

963 Cemig Brazil

Utilities

3.52 0.86 8.12 8.01
1082 CPFL Energia Brazil Utilities

4.18

0.66 6.15 6.41
1173 Embraer Brazil Aerospace & Defense

3.91

0.30 7.13 8.36
1396 Banco Nossa Caixa Brazil Banking 3.12

0.33

14.29 2.02
1606 Aracruz Celulose

Brazil

Materials 1.68 0.46 4.49

5.51

1674 Sabesp-Saneamento Basico Brazil

Utilities

2.12 0.37 7.33 3.82
1680 Braskem Brazil Chemicals

5.43

0.05 7.52 2.37
1685 Ipiranga Brazil Oil & Gas Operations

12.04

0.08 1.69 0.49
1690 Brasil Telecom Brazil Telecommunications Services 4.34

-0.01

7.37 4.12
1779 GOL Linhas Aéreas

Brazil

Transportation 1.78 0.32 1.76

5.63

1840 CBD-Brasil Distribuição Brazil

Food Markets

5.74 0.11 4.51 4.19

Fonte: Forbes

Neste artigo   o autor mostra vários pontos importantes sobre como balancear carga de processamento entre tomcats, o que pode valer para JBoss também. O interessante que há uma tabela comparativa sobre “Balanceamento de Dados” e “Clustering”, que esclarece alguns conceitos triviais sobre estes conceitos. Boa leiutra.

Em Delphi(TM) havia alguns truques via RTTI(Run Time Type Information) que sem ser programadores paranormais com truques do tipo “limpe 50 TEdits com 3 linhas de código” animavamos todo o time de desenvolvimento. Com Java, RTTI tem um nome mais bonito Reflection.

O saudosismo deste post, deve-se a lembrança de práticas similares, no caso, eu precisava criar uma classe BeanToProperties e PropertiesToBean, para que fosse possível ler um properties e todas sua chaves fossem passadas para atributos de um bean, claro com atributos com memso nome (já que não há um decoador “de para”), e vice-versa. Acho que até pode existir isso num Apache Commons da vida, mas como eu estou passando grande parte dos meus dias em aeroportos e apertado nos assentos da Tam e Grande Onibus Lotado, onde há pouca internet disponível, então resolvi criar um recurso destes para finalizar uma atividade no projeto, veja então o resultado.

Primeiro, eu preciso saber se o atributo da Classe em questão é equivalente a uma chave do Properties que tenho carregado, veja então:


public static java.util.List getFieldsFromClass(
Properties props) {

java.lang.reflect.Field[] methods = new ClientProperties()
.getClass().getDeclaredFields();

ArrayList< ?> a = Collections.list(props.propertyNames());

java.util.ArrayList fieldList = new java.util.ArrayList();

for (java.lang.reflect.Field m : methods) {
if (a.contains(m.getName())) {
fieldList.add(m);
}
}

return fieldList;
}


Em seguida, preciso obter os dados das chaves e atribuir aos atributos usando os métodos gets, para isso, veja o método:


ClientProperties bean = new ClientProperties();

List fields = getFieldsFromClass(props);
for (Field f : fields) {
try {
String methodName = “set”
+ f.getName().substring(0, 1).toUpperCase()
+ f.getName().substring(1, f.getName().length());

Class[] params = new Class[] { String.class };

Method method = bean.getClass().getDeclaredMethod(methodName,
params);

method.invoke(bean, props.getProperty(f.getName()));


Com isso, o objeto “bean” irá executar para a propriedade core o mesmo que: bean.setCore(prop.getValue(”core”)); , só que se eu tiver 58 propriedades, este método me economiza um super tempo!

Espero que esta dica ajude, ela está aqui com certeza para me ajudar, caso amanha eu esqueça como já fiz isto, mais ou menos como quase tudo que há em nível de códigos nesse blog. Até a próxima.

[]

Edgar

JMX é de fato uma das APIs mais notáveis presentes em Java, alguns servidores de Aplicações comerciais só vieram a implementar tais recursos somente a poucas anos atrás. No caso do JBoss, todo o MicroKernel foi concebido em torno desta tecnologia, o que torna mais simples a criação de ferramentas de monitoração, controle, monitores transacionais e até os profilers.
Como exemplo de invocação de chamadas JMX diretamente via código Java, veja a seguinte porção de código:


Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, “org.jnp.interfaces.NamingContextFactory”);
environment.put(Context.URL_PKG_PREFIXES, “org.jboss.naming:org.jnp.interfaces”);
environment.put(Context.PROVIDER_URL, “jnp://127.0.0.1:1099″); // remote machine IP
InitialContext ic = new InitialContext(environment);
RMIAdaptor server = (RMIAdaptor) ic.lookup(”jmx/invoker/RMIAdaptor”);
ObjectName name = new ObjectName(”jboss.system:type=ServerConfig”);
System.out.println(”ServerTempDir=”+server.getAttribute(name, “ServerTempDir”));


O código imprime o valor da propriedade ServerTemp que pode ser obtida facilmente através do JMX-Console num browser qualquer, qualquer outra propriedade do ServerConfig que está dentro do domínio jboss.system poderia ser obtida através do contexto JMX obtido via JNDI (RMIAdaptor) .

Alterações podem ser solicitadas também, isto também é possível também de forma programática.

Aguardem o que está por vim de interessante o novo JBoss Micro-Container.

Aqui os primeiros screenshots do JBoss Profiler 2.0, em breve o time deverá publicar o download do primeiro release do JBoss Profiler2.0, mas vejam aqui os screenshots:

screenshot-jboss-profiler-20.png
screenshot-jboss-profiler-20-clientproperties.png
FISL9

Recebi um email com a confirmação que a palestra:

JBoss 5 - As novidades da versão penta para a Comunidade Livre!

Foi aprovada! Então vejo vocês no dia 17, 18 e 19 de Abril na PUC em Porto Alegre, vai ser minha terceira vez neste evento, desde que eu fui na primeira vez, deixaram de fazer na PUC, e este ano está de volta, o que significará mais pessoas. O FISL é considerado como um dos maiores e mais importantes eventos de Software Livre do mundo, sendo assim, se você puder: Prestigi-o!

Nesta palestra vamos abordar as novidades do JBoss5, assim como as questoes de Micro-Container, novo Console, Plugins, e o JBoss Profiler 2.0.

Vejo vocês em Porto Alegre, e de noite no restaurante Mercado Del Puerto, comendo um Entrecot ao molho de vinho :)

JBossWorld

Minha correria de final quarter e ano fiscal na empresa, o meu provedor que dificulta manter meu site no ar, me impediram de blogar sobre o JBossWorld, evento que estive último fevereiro, mas há blogueiros como o Guilherme da Globo.COM, que fizeram uma cobertura fantástica em seu Blog, recomendo que todos leiam.

Bom, meu ano começa para valer agora, como alguns dos focos deste ano é consolidar as duas plataformas novas da JBoss: O SOA Platform, que está a um tempo sendo bastante divulgada aqui e em vários outros blogs, e o JBoss Communications Platform, este último deve dar o que falar para o nosso mercado que pede e exige bastante interatividade nas aplicações voltadas para o mercado de voz sobre IP e Telecom de modo geral. Logo, alguns posts sobre estas tecnologia que acima de qualquer outra coisas é: 100% Opensource, e claro, sua contribuição seria extremamente bem-vinda, veja mais em: http://labs.jboss.org/mobicents ou no site do projeto MobiCents, projeto adquirido ano passado pela Red Hat para fazer parte do leque de soluções JBoss.