29 de jul. de 2013

Comandos Forge

Segue uma lista de comandos úteis do JBoss forge para referência rápida, apesar disso a melhor dica é SEMPRE usar o TAB no teclado quando não souber um comando completo pois as opções serão listadas automaticamente.
list-commands : lista principais comandos do forge, não lista comandos específicos de plugins.
list-commands --all : Lista todos os comandos disponíveis do forge exceto comandos específicos de um plugin.
new-project : Cria um novo projeto, ex:
new-project --named {nomeProjeto} --topLevelPackage {br.com.seusoftwarewebsite} --projectFolder {/caminho/pasta/projeto}

persistence : Configura um framework de persistência ao seu projeto.
persistence setup --provider {providerJPAEscolhido} --container {appServerSelecionado}








22 de jan. de 2013

Como instalar o Postgres DB no CentOS

O primeiro passo é instalar o postgres server, para isso execute o comando em um shell:
sudo yum -y install postgresql-server

Isso irá fazer a instalação do Postgres e dos pacotes necessários para o seu ambiente e usará o postgresql-server disponível no repositório default do CentOS que você estiver rodando, neste caso quando fiz este post o postgres instalado foi o 8.4.13, se você faz questão de instalar a última versão disponível, procure outras instruções na internet ou na documentação oficial do Postgres ou se preferir adicione o repositório yum do postgresql no seu ambiente. Após instalado você deve ver uma mensagem como essa:

Agora precisamos inicializar o Banco de Dados pela primeira vez, digite o comando em um shell:
sudo service postgresql initdb

Aguarde a mensagem de inicialização:

Depois de inicializado a primeira vez pode-se então utilizar os comando start e stop de serviço normalmente para parar ou iniciar o servidor, por exemplo:
sudo service postgresql stop
sudo service postgresql start

Para configurações deve-se editar o arquivo /var/lib/pgsql/data/postgresql.conf , sugiro descomentar e mudar o listen address para all se estiver em ambiente de desenvolvimento(linha 59): listen_addresses = '*'
depois reinicie o servidor:
sudo service postgresql restart

Após a reinicialização vamos definir uma senha padrão para o usuário postgres, para isso devemos mudar o usuário do shell para postgres:
sudo su - postgres

Se pedir uma senha no comando acima deve-se utilizar a senha padrão do sudo do seu S.O normalmente.

Para mudar a senha basta digitar o comando: psql -c "alter user postgres with password 'nova_senha' "

Substitua nova_senha pela senha desejada e pronto, o postgresql está instalado e com o usuário de administração configurado. Podemos agora conectar um client visual para administrá-lo. Especificamente para o Postgres ugiro o pgAdmin ou se você preferir um genérico o Squirrel que server para vários bancos de dados.
Vou mostrar os passos para baixar e conectar o pgAdmin, primeiro use o yum para instalá-lo abaixo, ou se preferir dê uma olhada na documentação oficial:
yum install pgadmin3

Após instalado precisamos ainda executar uma última configuração no arquivo /var/lib/pgsql/data/pg_hba.conf para autorizar a conexão de clientes no Postgres que por default vem desabilitado, para isso editar o arquivo e modificar as permissões no final do arquivo, neste exemplo foi dada permissão para todos na sub-rede local acessarem: host all all 192.168.0.0/16 md5, deve-se comentar as outras entradas existentes no arquivo que no meu caso ficou assim:

Reinicie novamente o Postgres e pronto, isso deve ser suficiente para conectar o cliente pgAdmin e começar a desenvolver com o Postgresql.

21 de jan. de 2013

Como instalar Maven no CentOS 6

Primeiro vá ao site do Apache Maven e baixe a última versão disponível.
Se preferir pode usar o wget de um console shell para baixá-lo:
wget http://apache.mirror.pop-sc.rnp.br/apache/maven/maven-3/3.0.4/binaries/apache-maven-3.0.4-bin.tar.gz

No exemplo do wget acima usei o primeiro mirror disponível que apareceu na minha lista de download do site, você pode usar qualquer mirror que achar necessário bastando substituir a url. O wget irá baixar o pacote para o diretório onde o shell estiver no momento que você utilizar o comando.

Depois disso descompacte o pacote do maven no diretório de sua preferência, você pode usar o Nautilus visualmente ou usar o comando tar.
tar -xvf apache-maven-3.0.4-bin.tar.gz

Depois de descompactado adicione algumas variáveis de ambiente no seu usuário para deixar o Maven sempre disponível do shell, para isso edite o ${USER_HOME}/.bashrc
cd /home/mmaia
vi .bashrc

Adicione as seguintes variáveis de ambiente: MAVEN_HOME apontando para o diretório do maven onde você descompactou, MAVEN apontando para o diretório bin e por último export o PATH do S.O para sempre encontrar o comando mvn no seu shell, lembre-se de apontar para onde está localizado o Maven no seu disco:

É isso, basta agora abrir um novo shell e de qualquer local verificar a instalação com o comando:
mvn -version

Você deverá ver uma saída como essa:

4 de dez. de 2012

Como mudar o nome de um NodeAgent no WebSphere

Outro dia me deparei com a necessidade de mudar o nome do Host Name de um Node Agent do WebSphere isso pode ocorrer por vários motivos, como por exemplo: para corrigir a propagação do plugin do IBM HTTP Server ou simplesmente porque a máquina irá mesmo ser migrada para um outro nome ou ainda para migrar um profile de máquina, dentre outras possibilidades.
Para visualizar, navegue no Admin console do WebSphere(Domain Manager - DMGR):
System Administration > Nodes
Você deve então visualizar o Host Name do Node desejado conforme ilustrado na imagem abaixo:


Neste caso vou mudar o Host Name do NodeAgent para ao invés de ser localhost passar a ser mmaia.ibm

Para fazer isso o primeiro passo é baixar todos os processos de WebSphere rodando neste ambiente e então fazer um backup do profile que será atualizado para caso seja necessário restaurar posteriormente. Veja este link para fazê-lo.
Feito o backup vamos agora executar o utilitário do WebSphere wsadmin, isso deve ser feito no diretório bin do profile do Domain Manager(Dmgr) ou não funcionará corretamente. Execute o comando:
./wsadmin.sh -conntype NONE -lang jython

Isso irá colocar o shell no modo jython, conforme mostrado na imagem abaixo, se for primeira execução do wasadmin no seu ambiente você deverá ver o processamento de várias libs antes de entrar no modo de execução do wasadmin:

Execute agora a função jython AdminTask.changeHostName no modo iterativo, o que irá fazer com que os parâmetros da função sejam solicitados no console wsadmin, e salve as configurações, conforme ilustrado abaixo:

AdminTask.changeHostName('[-interactive]')



Preencha com os novos valores e coloque F no final para salvar a alteração, depois salve a alteração executando a função AdminConfig.save().
Pronto, saia do modo wasadmin digitando exit e reinicie seu profile(node e servers).
O novo valor deve aparecer no NodeAgent agora:

Como fazer back-up de um Profile do WebSphere

Constantemente é necessário fazer alguma alteração em um ambiente WebSphere e para ambientes críticos onde não pode haver erros ou indisponibilidade do ambiente é importante que seja feito um backup do Profile para que, emergencialmente, caso seja necessário façamos o rollback das alterações para um estado estabilizado.

Para fazer este backup utilizando a ferramenta que acompanha o WebSphere basta executar o script backupConfig.sh de um profile e passar o arquivo de destino que você quer salvar, por exemplo:
./backupConfig.sh AppSrv_1_mutual_authentication_profile_bkp.zip


Executando o comando acima o utilitário de backup irá parar todos os processos relacionados ao profile e irá fazer o backup, resultando em um arquivo chamado AppSrv_1_mutual_authentication_profile_bkp.zip neste mesmo diretório. Este Profile poderá posteriormente ser restaurados utilizando o script manageprofiles.sh:
./manageprofiles.sh  -restoreProfile -backupFile AppSrv_1_mutual_authentication_profile_bkp.zip

30 de nov. de 2012

Como liberar uma porta pelo iptables - Linux CentOS, Fedora, Red Hat

É bastante comum eu me deparar com um cenário onde preciso liberar porta de entrada para acessar algum servidor em um ambiente linux. Então segue a dica para liberar as portas desejadas no IPTables.

Para liberar portas usando o iptables edite o arquivo:
/etc/sysconfig/iptables

Se você quer liberar a porta 8080 no protocolo tcp, adicione a seguinte linha:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

Feito isso basta reiniciar o iptables(se estiver logado como root não precisa do comando sudo):
sudo service iptables restart

Como descobrir um PID pela porta - Linux, Solaris

Já me deparei mais de uma vez com a necessidade de descobrir o PID de um processo que está ocupando uma porta do S.O mas não consigo liberar a porta por não ter o id do processo podendo assim forçar que ele pare de executar.

Então segue a dica de como fazê-lo:

Linux:
netstat -tulpn


Você deverá ver uma saída como a imagem abaixo, perceba que o PID aparece na última coluna(PID/Program name) e a porta na quarta coluna (Local Address):



Se você quiser ver somente uma porta específica utilize o grep:

netstat -tulpn |grep ${NUMERO_DA_PORTA}
A saída será conforme a imagem abaixo:



Uma outra opção no Linux e outros unix like O.S é usar o lsof:
lsof |grep ${NUMERO_DA_PORTA}


Solaris:
No solaris siga a dica e execute os scripts que o Fabio Morais postou neste link.

12 de abr. de 2011

Debug do Classloader no Weblogic

É comum ao tentarmos fazer o deploy de uma aplicação recebermos um erro de ClassNotFoundException. Este é o tipo de erro bem chato de descobrir e algumas vezes temos certeza que a classe está presente no lib do domínio ou disponível para aplicação de alguma forma, seja como shared lib ou no classpath do servidor direto. E então o que fazer, como pode estar acontecendo de a classe COM CERTEZA estar disponível e mesmo assim a exceção de ClassNotFound estar ocorrendo? Bem, nesse caso é bastante útil fazer o classloader ficar em modo verbose para vermos direitinho quais as classes e em que ordem o weblogic está carregando-as.

Para fazer isso basta adicionarmos como parâmetro de JVM do servidor desejado o seguinte:

-Dweblogic.utils.classloaders.FilteringClassLoader.Verbose


Feito isso ao reiniciarmos o servidor iremos ver o classloader aparecendo para cada classe que for procurada, neste formato:

...
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) weblogic.jndi.WLInitialContextFactory
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) weblogic.jndi.factories.java.javaURLContextFactory
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) com.bea.common.security.store.data.String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) com.bea.common.security.store.data.String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) com.bea.common.security.store.data.String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) String
...


Com o debug do classloader fica bem mais fácil entender e descobrir a causa do ClassNotFoundException e com isso solucionar o problema.
Fica também uma dica, caso seja necessário pode-se inverter o classloader da aplicação web para que o weblogic utilize como preferenciais os .jar empacotados no lib do seu .war, para isso basta colocar a seguinte configuração no weblogic.xml da sua aplicação:

...
    
        true
    
...


[]s

7 de abr. de 2011

Migração do Projeto Seam para rodar no Weblogic 10.X - Parte 2

Este post dá continuidade a uma série de posts que estou escrevendo sobre a migração de um projeto que utilize JBoss Seam para rodar em weblogic, estou usando neste caso o Weblogic 10.3.3

O que me motivou a fazer este post é que a documentação oficial do JBoss Seam tem um capítulo sobre o Weblogic mas em todas as vezes que tentei seguí-la não obtive sucesso. Então segue o que fiz com as devidas alterações para que funcionasse.

A primeira parte deste post que cobre a criação do projeto com JBoss Seam pode ser encontrada neste link:

http://mmaiacupofcoffee.blogspot.com/2010/05/jboss-seam-criacao-de-projeto.html

Seguindo os passos do projeto criado no link acima temos então um projeto do Seam padrão, o próximo passo é importá-lo no eclipse para alterarmos o que for necessário. Eu utilizei uma versão do Eclipse Helios com JBoss Tools, se precisar de uma referência veja este post.

1) Criação do arquivo weblogic.xml - para este primeiro passo basta criar um arquivo chamado weblogic.xml no mesmo diretório onde está o web.xml


    10.3.3
    seam_weblogic



2) Mudar os arquivos persistence-prod.xml e persistence-dev.xml para funcionar com o weblogic, segue o meu persistence-dev.xml, para o prod fazer as alterações normais necessárias relativas ao banco de dados, criação de tabelas, etc..


             
   
      org.hibernate.ejb.HibernatePersistence
      seam_weblogic_ds
      
         
         
         
         
         
         
         
         
      
   
    



3) No web.xml registrar o seguinte listener:

  com.sun.faces.config.ConfigureListener



4) Mudar no build.xml o default target para archive e complementar as libs a serem copiadas pro pacote conforme fragmento abaixo:


...

    
        
        
        
        
        
         
        
        
        
        
        
        
        
        
             
        
        
        
             
        
        
        
        
        
        
        
    
 



Feito isso basta navegar em um console para a raiz do projeto e executar o ant default mesmo:
ant

Isso irá criar o war compatível com weblogic no diretório dist do seu projeto. Este .war é compatível com weblogic e vc pode fazer o deploy pelo console normalmente ou se o seu weblogic estiver no modo de desenvolvimento simplesmente copiar este arquivo para o diretório autodeploy do seu domínio.

Em alguns casos percebi a necessidade de inverter o classloader do weblogic, se no passo acima vc ainda não conseguir rodar vc pode tentar inverter o classloader do weblogic.

Este é o procedimento que funcionou no meu caso com .war gerado no seam. Não tentei e não recomendo utilização do Seam com EJBs no weblogic até este momento, por questões de estabilidade e aderência às especificações. Recomendo somente utilização do seam com pojos de camada web se for utilizá-lo com weblogic, mas se este for o seu caso vc encontra informações de como fazer isso na doc. oficial do Seam.

[]s

6 de set. de 2010

Weblogic - Persistência de sessão em Banco de Dados

Apesar de raramente ser necessário ou mesmo recomendado, já passei por situações onde a persistência de sessão(HttpSession) do usuário tivesse como requisito de arquitetura a necessidade de ser persistida em base de dados quando normalmente o recomendado é fazer em memória por motivos de performance. Quando for necessário fazer isso com utilização de weblogic é bem simples.

Primeiro precisamos da base de dados, neste exemplo vou usar o postgresql, que é free e fácil de usar e instalar. Fiz, a algum tempo, um quickstart em um outro post que sempre me é útil.
Bem, uma vez instalado o postgres basta criar uma base de dados, que nesse exmplo tem as configurações:

-Nome da Base: wl_session
-Usuário: weblogic
-Senha: weblogic


Feito isso deve-se criar a base de dados para persistência de sessão conforme script disponibilizado, perceba que existem scripts específicos para diversos banco de dados como Oracle, DB2, etc.

Bem, neste caso utilizo o script que adaptei para o Postgres:
create table wl_servlet_sessions
  ( wl_id VARCHAR(100) NOT NULL,
    wl_context_path VARCHAR(100) NOT NULL,
    wl_is_new CHAR(1),
    wl_create_time BIGINT,
    wl_is_valid CHAR(1),
    wl_session_values bytea,
    wl_access_time BIGINT,
    wl_max_inactive_interval INTEGER,
   PRIMARY KEY (wl_id, wl_context_path) );


Após a criação da tabela na base baixar o driver e criar um pool de conexões no weblogic apontando para esta base. Neste exemplo utilizei os atributos de pool:
- Nome do Pool: PostgresDS
- jndi name do pool: jdbc/Postgres

Com o pool feito, é só configurar no weblogic.xml da sua aplicação web para utilizar o pool configurado, conforme no exemplo abaixo:


    10.3.2
    sessaodb
    
        JDBC
        PostgresDS
        jdbc/Postgres
    


Pronto, agora ao acessar uma página da aplicação uma nova sessão será criada na base de dados e o weblogic irá persistir as sessões de usuário nesta tabela, enquanto as mesmas estiverem ativas, conforme a imagem abaixo ilustra.


Lembre-se que esta não é uma opção que melhor se adeque se sua aplicação precisar de foco em performance e escalabilidade e normalmente deve ser utilizada somente se for uma necessidade específica do projeto. []s

12 de jul. de 2010

Weblogic, um Message Driven Bean Simples

Escrevi em outras oportunidades sobre criação de filas ou tópicos JMS no Weblogic e de como este recurso é importante em um ambiente distribuído e corporativo. Para ilustrar vou postar aqui um exemplo simples de um MDB que consome de um tópico JMS simples. Não vou comentar sobre os elementos do MDB detalhadamente, vou focar na implementação. Para ilustrar vou utilizar para o exemplo uma página JSF que posta uma mensagem em um tópico e um MDB com annotations para consumir a mensagem.

Primeiro, para o exemplo funcionar deve-se criar no weblogic um topico simples com as seguintes configurações:

Nome: Exemplo MDB
Nome JNDI: jms.distributed.Topic

Se quiser ver detalhadamente como criar este tópico, fiz um tópico sobre esse assunto no link: http://mmaiacupofcoffee.blogspot.com/2010/02/weblogic-jms-parte-iii-criacao-de-fila.html. Bastando adaptar e criar um tópico(Topic) ao invés de uma fila(Queue).



Os trechos de código relevantes para o exemplo explico à seguir. A parte JSF do exemplo deve ser "empacotada" em um .war e o ejb em um .jar, conforme definido pela especificação.

O cliente de exemplo que publica no tópico é escrito com JSF, composto por uma página e uma Action.
Abaixo posto detalhes relevantes da página que publica a mensagem e define-se quantas vezes será postada. O ActionBean é registrado com o nome mensagemBean no deployment descriptor. O exemplo usa notação JSF simples e por isso não vou detalhar aqui:


    Texto da Mensagem:
Quantidade:


A segunda parte do cliente que publica a mensagem é o ActionBean que recebe os parâmetros dos campos da página e efetivamente posta a mensagem no tópico utilizando JMS. Perceba que um loop é criado para postar várias mensagens se desejado. Para o exemplo ficar mais claro não estou utilizando anottations para fazer injection de dependência de contexto.
package exemplo.action;

import java.util.logging.Logger;

import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class PublicaTopicoAction {
 
 private Logger log = Logger.getLogger(PublicaTopicoAction.class.getName());

 private String mensagem;
 private int quantidadeMensagens;
 
 protected Context ctx;
 protected TopicPublisher tpublisher;
 protected Topic topic;
 protected TextMessage msg;
 protected TopicConnection tcon;
 protected TopicSession tsession;
 
 public final static String JMS_FACTORY = "weblogic.jms.ConnectionFactory";
 
 public final static String TOPIC = "jms.distributed.Topic";

 protected TopicConnectionFactory tconFactory;
 
 public PublicaTopicoAction()
 {
  log.info("Construtor PublicaTopicoAction");
  try {
   ctx = new InitialContext();
   tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
   tcon = tconFactory.createTopicConnection();
   tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
   topic = (Topic) ctx.lookup(TOPIC);
   tpublisher = tsession.createPublisher(topic);
   tcon.start();
  } catch (NamingException e) {
   log.severe("Erro ao recuperar o contexto para fazer lookup");
   e.printStackTrace();
  } catch (JMSException e) {
   log.severe("Ocorreu um erro ao conectar no topico: " + e.getMessage());
   e.printStackTrace();
  }
 }
 
 public String enviaMensagem()
 {
  log.info("Entrou PublicaTopicoAction.publicaMensagem");
  for (int i = 0; i < quantidadeMensagens; i++) {
   publicaMensagemTopic(mensagem + "_" + i); 
  }
  log.info("Executou PublicaTopicoAction.publicaMensagem");
  return "OK";
 }
 
 private void publicaMensagemTopic(String mensagem) {
  try {
   log.info("Entrou PublicaTopicoAction.publicaMensagemTopic");
   msg = tsession.createTextMessage();
   msg.setText(mensagem);
      tpublisher.publish(msg);
   log.info("Executou PublicaTopicoAction.publicaMensagemTopic");
  } catch (Exception e) {
   log.severe("Ocorreu um erro ao postar mensagem na fila");
   e.printStackTrace();
  }
 }
 
 public String getMensagem() {
  return mensagem;
 }

 public void setMensagem(String mensagem) {
  this.mensagem = mensagem;
 }

 public int getQuantidadeMensagens() {
  return quantidadeMensagens;
 }

 public void setQuantidadeMensagens(int quantidadeMensagens) {
  this.quantidadeMensagens = quantidadeMensagens;
 }
 
}


Finalmente o código do Message Driven Bean que é bem simples e assim que uma mensagem chega no tópico ele consome a mesma executando o método onMessage, conforme definido pela especificação. Perceba que o link com o Tópico é feito através de anottations no MDB e que para exemplos simples como este não é necessário a criação de arquivos xml de configuração, o deployment descriptor para EJBs é opcional na versão de EJB 3.0 ou posteriores.

package exemplo.mdb;

import java.util.logging.Logger;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic") }, mappedName = "jms.distributed.Topic")
public class TopicConsumerMDB implements MessageListener {

 Logger log = Logger.getLogger(TopicConsumerMDB.class.getName());

 public TopicConsumerMDB() {
  log.info("Construtor TopicConsumerMDB");
 }

 /**
  * @see MessageListener#onMessage(Message)
  */
 public void onMessage(Message message) {
  log.info("Entrou onMessage");
  try {
   TextMessage textMessage = (TextMessage) message;
   String messageID = textMessage.getJMSMessageID();
   log.info("ID da mensagem recuperada ==>> " + messageID);
   String mensagem = textMessage.getText();
   log.info("Mensagem recebida ==>> " + mensagem);
  } catch (JMSException e) {
   log.severe("Ocorreu um erro ao recuperar informacoes da mensagem ==>> "
       + e.getMessage());
   e.printStackTrace();
  }
  log.info("Executou onMessage");
 }
}


[]s

30 de jun. de 2010

Weblogic, configuração de domínios.

Este é um post simples, o intuito é mostrar como fazer um backup de um domínio já configurado e poder restaurá-lo posteriormente. Isto é muito útil em diversas situações do dia a dia em uma empresa que utilize o weblogic server.

Para este exemplo vou utilizar um domínio já criado com um servidor chamado Server-1 com uma configuração de fila JMS atribuída a este servidor.

Para fazer um template deste domíno basta utilizar a ferramenta "Domain Template Builder" do weblogic.

Para executar o domain template builder execute o script: ${WL_HOME}/commmom/bin/config_builder.sh, é importante lembrar que esta versão precisa de ambiente gráfico para executar. Se não tiver suporte a ambiente gráfico no servidor que deseja criar o template pode-se utilizar os comandos pack e unpack conforme descrito em detalhes na documentação oficial do weblogic.

Para fazer o template do domínio, que será um .jar, executar o config_builder.sh para unix e derivados ou config_builder.cmd no caso de windows.

Depois é só selecionar a opção "Create a Domain Template" e depois seguir o passo a passo que é auto-explicativo. No final será criado um arquivo com a extensão .jar que poderá ser utilizado na criação de novos domínios como explico à seguir.

Criei um template chamado dominio_exemplo_weblogic-v10.3.2.0.jar, agora para recriar este domínio em qualquer outro servidor basta levar este .jar para o novo servidor com os binários de weblogic já instalados e executar o wizard de configuração de domínios do weblogic em ${WL_HOME}/commom/config.sh

No wizard selecionar "Create a New Weblogic Domain" e no segundo passo selecionar a opção "Base this domain on an existing template" e apontar para o .jar gerado com a ferramenta "configuration builder", ver imagem abaixo.



Depois é só seguir o restante do passo a passo que é auto-explicativo e o domínio será criado com as configurações recuperadas do template.

Iniciar os servidores do domínio criado e verificar que estes terão as configurações idênticas ao domínio original. []s

23 de jun. de 2010

Weblogic Store and Forward e Distributed Destinations - Parte 1 Definições

Analisando uma arquitetura inicial para uma aplicação distribuída que consistia em um servidor que recebe mensagens, este deveria distribuir as mensagens para um cluster onde haveriam milhares de clientes conectados consumindo as mesmas. O principal requisito desta aplicação que foco neste post é que a procura pelos serviços deveria ser transparente de localização nos servidores, ou seja, o lookup do cliente para encontrar o serviço deveria ser local e transparente para aplicação, sendo que a mensagem original em si estaria em outro servidor.

Após alguma análise cheguamos a um modelo inicial de arquitetura utilizando uma feature de infra do weblogic que é o mecanismo de Store and Forward e também o serviço de JMS Distributed Destinations. A imagem abaixo ilustra um primeiro brainstorm da arquitetura do ambiente desejado.



Nesta arquitetura definimos a utilização de dois serviços de JMS do Weblogic Server bastante interessantes que comento à seguir. 1) Store and Forward: O serviço de Store and Forward (SAF) permite que uma instância de weblogic server entregue mensagens entre aplicações que estão distribuídas entre outras instâncias de servidores de forma transparente para o cliente. Este serviço possibilita que uma aplicação que esteja rodando em qualquer instância do weblogic server em um ambiente distribuído, consuma ou envie mensagens para outros servidores de forma transparente de localização para a aplicação, além de garantir a qualidade de serviço.

2) Distributed Destinations: Este serviço pode ser utilizado em um cluster com o objetivo de tornar transparente para produtores e consumidores JMS um ambiente de tolerância à falhas onde o serviço parece único mas está disponível em todo um cluster de servidores, o Weblogic Server abstrai a complexidade, possibilitando assim grande capacidade de tolerância à falhas no ambiente.

Estes são os conceitos básicos de 2 excelentes serviços suportados pelo weblogic server que tornam as aplicações muito mais estáveis e tolerante a falhas para os clientes, serviços fundamentais para a internet de grandes corporações pois aumentam a disponibilidade da aplicação. Em um próximo post irei efetivamente criar o ambiente mencionado acima e mostrar na prática como o serviço pode ser utilizado.

Para mais informações sobre estes serviços, recomendo a utilização da documentação oficial da Oracle para o Weblogic Server nos links(Weblogic v10.3.2): Store and Forward e Distributed Destinations.

[]s

4 de mai. de 2010

JBoss Seam - Criação de Projeto. Migração para Weblogic - Parte 1

Este post é o primeiro de uma série baseada na documentação do Seam e mostra um passo a passo detalhado de como fazer uma aplicação com extensão .war com jboss seam rodar no próprio JBoss e na sequência de posts irei mostrar a migração deste projeto para o Weblogic Server 10 em Ubuntu 10.04 com Mysql. Não entro em detalhes sobre download e da configuração do Seam, Jboss, Weblogic ou MySQL neste post e pressuponho que o ambiente utilizado já tenha estes produtos instalados.

Vamos ao passo a passo:

O primeiro passo é gerar um novo setup de projeto do Seam abrindo um console shell e navegando para o diretório raiz do seam no seu ambiente e então executar o comando:

./seam setup

Dica: Para o comando executar corretamente coloquei a seguinte entrada apontando para uma instalação válida de JDK no meu ambiente bem no início do arquivo seam antes do comentário "# Validate the JDK installation".

JAVA_HOME=/home/mmaia/Oracle/Middleware_wl10.3.3/jdk160_18 export JAVA_HOME

Na execução do setup basta responder aos questionamentos conforme seu ambiente local.

Segue abaixo a saída do comando seam setup que utilizei no meu computador para este exemplo abaixo, favor adaptar ao seu ambiente conforme necessidade:


mmaia@mmaia-laptop:~/tools/jboss-seam-2.2.0.GA$ ./seam setup
SEAM_HOME: /home/mmaia/tools/jboss-seam-2.2.0.GA
Using seam-gen sources from: /home/mmaia/tools/jboss-seam-2.2.0.GA/seam-gen
Buildfile: /home/mmaia/tools/jboss-seam-2.2.0.GA/seam-gen/build.xml

init:

setup:
[echo] Welcome to seam-gen 2.2.0.GA :-)
[echo] Answer each question or hit ENTER to accept the default (in brackets)
[echo]
[input] Enter the directory where you want the project to be created (should not contain spaces) [/home/mmaia/projects] [/home/mmaia/projects]
/home/mmaia/workspaceGalileoJBossSeam
[input] Enter your JBoss AS home directory [C:/Program Files/jboss-5.1.0.GA] [C:/Program Files/jboss-5.1.0.GA]
/home/mmaia/tools/jboss-5.1.0.GA
[input] Enter your JBoss AS domain [default] [default]
seamWeblogic
[input] Enter your GlassFish V2 or V3 home directory (Ignore if you aren't deploying to GlassFish) [C:/Program Files/glassfish-v2.1] [C:/Program Files/glassfish-v2.1]

[input] Enter your GlassFish domain (Ignore if you aren't deploying to GlassFish) [domain1] [domain1]

[input] Enter the project name [myproject] [myproject]
seam_weblogic
[echo] Accepted project name as: seam_weblogic
[input] Do you want to use ICEfaces instead of RichFaces? [n] (y, [n])
n
[input] skipping input as property icefaces.home.new has already been set.
[input] Select a RichFaces skin [glassX] (blueSky, classic, darkX, deepMarine, DEFAULT, emeraldTown, [glassX], japanCherry, laguna, ruby, wine)
wine
[input] Is this project deployed as an EAR (with EJB components) or a WAR (with no EJB support)? [war] (ear, [war])
war
[input] Enter the base package name for your Java classes [com.mydomain.seam_weblogic] [com.mydomain.seam_weblogic]
seamweblogic     
[input] Enter the Java package name for your session beans [seamweblogic.action] [seamweblogic.action]
[input] Enter the Java package name for your entity beans [seamweblogic.model] [seamweblogic.model]

[input] Enter the Java package name for your test cases [seamweblogic.test] [seamweblogic.test]

[input] What kind of database are you using? [hsql] ([hsql], mysql, derby, oracle, postgres, mssql, db2, sybase, enterprisedb, h2)
mysql
[input] Enter the filesystem path to the JDBC driver jar [] []
/home/mmaia/Oracle/Middleware_wl10.3.3/wlserver_10.3/server/lib/mysql-connector-java-commercial-5.0.3-bin.jar
[input] skipping input as property driver.license.jar.new has already been set.
[input] Enter the Hibernate dialect for your database [org.hibernate.dialect.MySQLDialect] [org.hibernate.dialect.MySQLDialect]

[input] Enter the JDBC driver class for your database [com.mysql.jdbc.Driver] [com.mysql.jdbc.Driver]

[input] Enter the JDBC DataSource class for your database [com.mysql.jdbc.jdbc2.optional.MysqlDataSource] [com.mysql.jdbc.jdbc2.optional.MysqlDataSource]

[input] Enter the JDBC URL for your database [jdbc:mysql:///test] [jdbc:mysql:///test]
seamweblogic
[input] Enter the database username [sa] [sa]
seamweblogic
[input] Enter the database password [] []
seamweblogic
[input] skipping input as property hibernate.default_schema.entered has already been set.
[input] Enter the database catalog name (Enter '-' to clear previous value) [] []
seamweblogic
[input] Are you working with tables that already exist in the database? [n] (y, [n])
n
[input] Do you want to recreate the database tables and execute import.sql each time you deploy? [n] (y, [n])
y
[propertyfile] Creating new property file: /home/mmaia/tools/jboss-seam-2.2.0.GA/seam-gen/build.properties
[echo] Installing JDBC driver jar to JBoss AS
[copy] Copying 1 file to /home/mmaia/tools/jboss-5.1.0.GA/server/seamWeblogic/lib

init:

init-properties:
[echo] /home/mmaia/tools/jboss-5.1.0.GA

validate-workspace:

validate-project:

settings:
[echo] JBoss AS home: /home/mmaia/tools/jboss-5.1.0.GA
[echo] GlassFish home: C:/Program Files/glassfish-v2.1
[echo] Project name: seam_weblogic
[echo] Project location: /home/mmaia/workspaceGalileoJBossSeam/seam_weblogic
[echo] Project type: war
[echo] IceFaces: n
[echo] Action package: mmaia@mmaia-laptop:~/tools/jboss-seam-2.2.0.GA$ ./seam.sh setup
[echo] Model package: seamweblogic.model
[echo] Test package: seamweblogic.test
[echo] JDBC driver class: com.mysql.jdbc.Driver
[echo] JDBC DataSource class: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
[echo] Hibernate dialect: org.hibernate.dialect.MySQLDialect
[echo] JDBC URL: seamweblogic
[echo] Database username: seamweblogic
[echo] Database password: seamweblogic
[echo]
[echo] Type './seam create-project' to create the new project

BUILD SUCCESSFUL




O próximo passo é gerar o projeto de fato, para isso executar o comando:

./seam new-project

Agora vamos testar primeiro o projeto no jboss. Nesse momento vou começar a utilizar comandos ant navegando para a raiz do projeto criado, na verdade os comandos poderiam ser dados utilizando a chamada ./seam do diretório do seam onde estava, mas como o setup do projeto no seam pode mudar e ele só armazenda os dados do último, sugiro que se acostumem com os comandos ant sempre navegando para a raiz do projeto que o sem criou, é assim que vou continuar aqui.

Com o projeto gerado, navegar então para a raiz do projeto criado e digitar o comando para fazer o deploy expandido no jboss. Nesse momento certifique-se que o servidor e a base de dados que vc especificou no setup do seam acima existem no mysql e na sua instalação de jboss respectivamente digite então o comando no shell:

ant explode

Este comando irá fazer o deploy expandido em modo de desenvolvimento no servidor jboss especificado no setup. Para testar a aplicação inicialize a isntância do jboss e navegue no browser:

http://localhost:8080/seamweblogic

Se tudo for bem deve aparecer uma página do Seam com a mensagem: Welcome to Seam

Bom isso é tudo no que diz respeito à criação do projeto. No próximo post sobre esse assunto iremos migrar o .war do jboss para rodar no weblogic.

[]s

23 de fev. de 2010

Weblogic JMS - Parte III - Criação de fila JMS

Neste post mostro a configuração de uma fila JMS(Queue) simples no Oracle Weblogic Server 11g(10.3.2).

Para configurar o ambiente inicial que é pré-requisito para este exemplo veja os posts do link: http://mmaiacupofcoffee.blogspot.com/search?q=Oracle+Fusion+Middleware+11g

Para ver a documentação oficial da Oracle sobre a parte administrativa de JMS no weblogic visite o link:
http://download.oracle.com/docs/cd/E15523_01/web.1111/e13738/toc.htm

No exemplo mostrado no vídeo abaixo são configurados todos os elementos JMS necessários para criação de uma fila simples. Existem outras formas de se configurar uma fila no Oracle Weblogic.



[]s

20 de fev. de 2010

Oracle Fusion Middleware 11g - Oracle Enterprise Pack for Eclipse (OEPE)

Após a instalação e configuração de domínio do weblogic vou mostrar a integração da ferramenta de desenvolvimento da Oracle OEPE que pode ser baixada no link: http://www.oracle.com/technology/software/products/oepe/index.html.

Após baixar e descompactar a ferramenta, basta entrar na pasta eclipse e utilizar o atalho "eclipse" existente neste diretório para executá-la. O vídeo abaixo mostra a integração da ferramenta com um domínio local de weblogic server na versão 11g(10.3.2).


[]s

Oracle Fusion Middleware 11g - Criação de domínio Weblogic 11g (10.3.2) no Ubuntu

Após a instalação o próximo passo é a criação de um domínio do weblogic para podermos rodar aplicações. Um domínio no weblogic significa um conjunto de servidores gerenciados por um admin server. Se quiser se aprofundar pode ver a documentação oficial sobre domínios do Oracle Weblogic 11g e também a documentação sobre criação de domínios utilizando o configuration wizard que é mostrado no vídeo deste post, é importante ressaltar que existem outras formas de criar domínios que não cubro neste post. Neste vídeo mostro a criação de um domínio em modo de desenvolvimento e então rodo o servidor de administração e acesso o seu console.


[]s

13 de fev. de 2010

Oracle Fusion Middleware 11g - Instalação Weblogic 11g (10.3.2) no Ubuntu

O pacote de instalação está disponível para download no site da Oracle no endereço http://www.oracle.com/technology/software/products/middleware/index.html , selecione "See All" e depois "All available platforms" escolha então o pacote correto para o seu sistema operacional. As versões linux e Windows já vem com uma versão de java compatível para rodar o Weblogic com um JDK indicado para modo de desenvolvimento e o JRockit, recomendado para ambiente de produção, as demais versões exigem o download de uma JVM separada. O pacote utilizado nesta instação é a última versão disponível atualmente para linux. O procedimento é bem simples utilizando um ambiente com suporte a interface gráfica. Neste vídeo faço a instalação no Ubuntu 9.10.

Para ver a documentação oficial de instalação do produto visite o site de documentação oficial na Oracle: http://download.oracle.com/docs/cd/E15523_01/doc.1111/e14142/toc.htm


[]s

27 de jan. de 2010

Weblogic WLST - Erro ao inicializar servidores via nodemanager.

Um erro recorrente e chato que acontece comumente quando utilizamos um script para controlar o ciclo de vida(para, pausar, reiniciar) dos servidores gerenciados no domínio do weblogic utilizando conexão via nodemanager é um erro de acesso com a mensagem similar a esta:

Connecting to Node Manager ... This Exception occurred at Wed Jan 27 11:31:34 BRST 2010. weblogic.nodemanager.NMException: Access to domain 'testescripts' for user 'weblogic' denied at weblogic.nodemanager.client.NMServerClient.checkResponse(NMServerClient.java:298) at weblogic.nodemanager.client.NMServerClient.checkResponse(NMServerClient.java:311) at weblogic.nodemanager.client.NMServerClient.connect(NMServerClient.java:253) at weblogic.nodemanager.client.NMServerClient.checkConnected(NMServerClient.java:196) at weblogic.nodemanager.client.NMServerClient.checkConnected(NMServerClient.java:202) ...... WLSTException: Error occured while performing nmConnect : Cannot connect to Node Manager.Access to domain 'testescripts' for user 'weblogic' denied Use dumpStack() to view the full stacktrace

Este problema ocorre porque a senha definida pelo nodemanager no domínio está diferente da senha de administração do domínio. A solução para o problema é alterar a senha do nodemanager no Console de Administração do Weblogic e colocá-la igual a senha utilizada para gerenciar o domínio.

Para fazer isso no console de administração do weblogic altere a senha do nodemanger navegando em:

Na árvore de navegação (Domain Structure) clique no nome do domínio > Security > Advanced

Procure por "NodeManager Username", "NodeManager Password" e "Confirm NodeManager Password" e altere a senha para ser igual à senha de administração do domínio. Salve e ative as configurações. Reinicie o nodemanager.

Pronto o script deve funcionar corretamente. Se o problema persistir, verifique no nodemanager.domains se o domínio onde está o servidor que deve ser controlado está registrado corretamente.

[]s

25 de jan. de 2010

JBoss Seam - Configuração de ambiente

Estou começando alguns estudos sobre JBoss Seam. Já a alguns anos utilizo struts2 e previamente webwork, que é muito parecido com struts2 e no qual ele foi inspirado e utilizado como base. Ultimamente tenho visto muitos desenvolvedores que considero de alta qualificação falarem muito bem do JBoss Seam e por isso resolvi fazer alguns estudos e o primeiro desafio nestes casos é reunir tudo o que precisamos para configurar o ambiente de desenvolvimento para poder fazer alguns testes e aprofundar nos estudos. Neste post eu coloco os links de downloads que efetuei para deixar o ambiente pronto para trabalhar com o Seam.

Os softwares que utilizo para esta configuração são:
*Eclipse Galileo.
*JBoss 5.1.
*JBossTools para eclipse galileo. Utilizei o site configurado no eclipse galileo. A configuração que funcionou melhor no meu caso foi a Development. O update site é: http://download.jboss.org/jbosstools/updates/development/
*Seam 2.0.2.SP1 - Estou usando o 2.0 pois a maioria da documentação, atualmente, cobre essa versão.
*Mysql 5.1. - Baixei com o gerenciador de pacotes do Ubuntu.Foi necessário baixar também o driver JDBC do Mysql para configurar no JBoss Tools no eclipse.

Depois de baixar todos os softwares basta abrir o eclipse e criar um novo projeto do Seam. Alguns wizards irão aparecer para configurar os ambientes do JBoss App Server,JBoss Seam e Base de dados o driver do banco utilizado será necessário e a criação de uma base de dados com usuário e senha para utilizar durante os estudos. Com isso em mãos não tem segredo e depois é só começar a conhecer as ferramentas do JBoss Tools para começar os estudos.

Minha primeira impressão com o Seam foi bastante encorajadora. O ambiente do JBoss Tools parece bem amigável e fornece alguns wizards interessantes que facilitam e agilizam o desenvolvimento.
[]s