Mostrando postagens com marcador Oracle Weblogic. Mostrar todas as postagens
Mostrando postagens com marcador Oracle Weblogic. Mostrar todas as postagens

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

19 de jan. de 2010

Weblogic JMS - Parte II - Arquitetura JMS

Neste post, faço um resumo da arquitetura de JMS, que é definido pelo item 2 da especificação JMS 1.1.

O item 2.2 define os possíveis participantes de uma aplicação JMS:
Cliente JMS - Cliente JMS que utiliza linguagem java.
Cliente não-JMS - Possíveis clientes JMS de uma aplicação escritos utilizando uma linguagem proprietária do provider. Como exemplo pode-se citar um cliente do IBM MQ escrito utilizando uma API proprietária do produto.
Mensagens - Estas são as mensagens postadas e consumidas no MOM(Message Oriented Middleware).
Provider JMS - Este é o MOM em si que pode fornecer serviços adicionais à especificação para seus clientes, como é o caso da maioria dos providers.
Objetos Administrativos - São objetos pré-configurados no provider para facilitar a vida dos clientes, usualmente os objetos são ConnectionFactory e Destinations, estes objetos são registrados na árvore JNDI do servidor por default ou pelos administradores do MOM utilizado.

O modelo de Administração definido é o que proporciona interoperabilidade das aplicações escritas em JMS, isso porque os objetos ConnectionFactory e Destinations são padronizados e as APIs de acesso a estes recursos, fornecidas usualmente pelos providers, disponibilizam interfaces padrão para sua utilização.
ConnectionFactory - Objeto utilizado por clientes para criar uma conexão com o provider utilizado.
Destination - Objeto que o cliente usa para especificar o destino de envio ou recebimento de mensagens.
Estes objetos devem ser disponibilizados na árvore JNDI(Java Naming and Directory Interface) do servidor(JNDI Namespace), possibilitando acesso padronizado através da API padrão de java. Conforme imagem abaixo tirada da especificação JMS 1.1.


Conforme mencionado anteriormente existem dois tipos de mensagens que podem ser utilizadas conforme a especificação: Point-to-Point ou Publish/Subscriber Messages.

A especificação define então algumas APIs que possibilitam a utilização do tipo de mensagem desejado e ainda um conjunto de interfaces que abstrai essa implementação, conforme o quadro abaixo, retirado da especificação, ilustra.



Segue uma breve definição dos objetos da interface comum:

ConnectionFactory - Objeto administrativo utilizado pelo cliente para criar uma conexão com o provider.
Connection - uma conexão estabelecida com o provider.
Destination - um destino de envio ou recebimento de mensagens.
Session - um contexto criado com o provider para envio ou recebimento de mensagens.
MessageProducer - Um objeto criado por uma sessão que efetivamente é utilizado apra envio de mensagens ao destino.
MessageConsumer - Um objeto criado por uma sessão que é utilizado para consumir mensagens de um destino.

Conforme já foi mencionado, outros serviços não definidos pela especificação podem ser adicionados pelo fornecedor do provider e portanto, os modos de Administração, segurança, timers, dentre outros serviços, podem ser proprietários e definidos através de APIs de cada fornecedor do MOM(provider).


Na questão de acesso concorrente, a tabela mostrada abaixo, retirada da especificação, ilustra bem o modelo utilizado.



A especificação prevê ainda um modelo de Request/Reply para as mensagens poderem definir um estado de conversação. Para isso, é definido no header das mensagens um campo denominado JMSCorrelationID que pode ser utilizado para este fim.


[]s

13 de jan. de 2010

Weblogic JMS - Parte I - Overview de JMS

Comecei a revisar os conceitos de JMS do weblogic e por isso irei fazer uma série de postagens resumindo estes conceitos. A fonte principal de consulta para estes artigos será a especificação oficial da sun para JMS 1.1 e a documentação oficial de JMS do Oracle Weblogic Server 10.3.

JMS provê uma maneira padronizada para programas java criarem, enviarem, receberem e lerem mensagens de sistemas coorporativos de mensageria como Weblogic JMS Server, IBM MQ Series, Apache Active MQ dentre vários outros. A especificação provê então uma forma para comunicar com qualquer destes ambientes abstraídos de seu fornecedor, bastando, para isso, que o "Message Oriented Middleware" - Middleware orientado a mensagens escolhido implemente a especificação JMS 1.1 que é a abordada neste artigo.

JMS provê um conjunto de interfaces e padrões que definem como um cliente acessa os recursos de um Produto Orientado a Mensagens.

JMS prevê dois tipos básicos de mensagens "point-to-point" e "publish-subscribers". As mensagens point-to-point são mensagens enviadas para uma fila onde apenas um cliente irá publicar e somente um cliente irá receber e processar a mensagem, no modelo publish-subscriber é utilizado um tópico onde vários clientes podem se registrar para publicar e receber as mensagens. Para melhor ilustrar estes modelos basta pensarmos em um ambiente de call center por exemplo que é similar ao modelo point-to-point pois quando um atendente pega a ligação do usuário é feita uma ligação entre dois pontos. Já no modelo publish-subscriber é um modelo parecido com uma lista de discussão ou grupo da internet, onde um ou vários clientes podem postar uma mensagem que será recebida por todos os clientes que estiverem associados aquela lista. Posteriormente entrarei em mais detalhes e exemplos dos dois modelos.

O item 1.2.4 da especificação JMS 1.1 detalha um item bastante importante, listando os itens que não são definidos na especificação e que, portanto, cada fornecedor de produtos de mensageria implementam de forma proprietária ou em muitos casos nem fornece o serviço. Este itens incluem: Serviços de balanceamento de carga e tolerância à falhas, Notificação ou aviso de erros e problemas, Administração, Monitoramento, Segurança e Protocolo de comunicação. O Weblogic Server 10 possui todos estes serviços que podem ser considerados adicionais à especificação, mas que são fundamentais em um produto com qualide de serviços aceitáveis para grandes corporações.

O item 1.4 da especificação define que algumas APIs tem que ser compatíveis e possível de serem utilizadas em uma implementação JMS, e portanto todos os produtos que forem compatíveis com a especificação devem suportar os padrões: JDBC, componentes JavaBeans, EJB, JTA, JTS, JNDI e Java EE.

Neste primeiro artigo fiz um resumo do item 1 da especificação JMS 1.1 destacando seus principais pontos. No próximo irei tratar do modelo de arquitetura do JMS 1.1 que é definido no item 2 da especificação.

[]s

24 de jun. de 2009

Weblogic WLST - Inicializando servidores via Node Manager

O weblogic server possibilita a administração de um domínio mesmo quando o servidor de administração estiver fora do ar através do Node Manager que já deve ter sido devidamente configurado para gerenciar o domínio que será administrado.

O Node Manager é um serviço do weblogic server que possibilita a adminsitração de vários servidores configurados em vários hardwares diferentes através de um único console de administração ou de scripts WLST.

Neste post vou mostrar um script que pode ser utilizado para conectar no nodemanager de uma máquina e enviar comandos para inicializar servidores previamente configurados em um determinado domínio administrado por este nodemanager. O script assim como o arquivo de propriedades está comentado e seu código segue abaixo com comentários em seguida:

from java.util  import Properties
from java.io  import FileInputStream
from java.io  import File

#import thread
from string import split

#============DEFINICAO DE FUNCOES============
#funcao que carrega dados de arquivo de propriedades
def carregaArquivoPropriedades(nomeArquivo) :
    print 'carregando propriedades do arquivo: ' + nomeArquivo
    #arquivo de propriedades a ser carregado 
    myProps = Properties()
    #carrega arquivo de propriedades
    myProps.load(FileInputStream(File(nomeArquivo)))
    return myProps

#função que recupera servidores especificados no arquivo de propriedades.
def listaServidores(arquivoPropriedades):
    print 'selecionando servidores da lista de propriedades'
    servidores = []
    propriedades = arquivoPropriedades.propertyNames()
    while propriedades.hasMoreElements():
        #carrega os nomes de todas as chaves carregadas do arquivo de propriedades
        chave = propriedades.nextElement()
        #recupera tipo da chave para verificar se é um servidor se for adiciona no array de servidores.
        elemento = split(chave, '_')
        #checa se elemento carregado do arquivo de properties é um servidor e adiciona na lista de servidores
        if elemento[0] == 'SERVIDOR':
            servidores.append(chave)
    #while que imprime lista de servidores recuperada
    print '=======================AVISO================================================================'
    print'LISTA DOS SERVIDORES A SEREM INICIALIZADOS'
    for servidor in servidores:
        print 'Servidor ==>> ' + arquivoPropriedades.get(servidor)
    print '=======================AVISO================================================================'
    return servidores
            
    
def inicializaInstancias():
    usuario = arquivoPropriedades.get('USUARIO_ADM')
    senha = arquivoPropriedades.get('USUARIO_ADM_SENHA')
    ipNodeManager = arquivoPropriedades.get('NODEMANAGER_IP')
    portaNodeManager = arquivoPropriedades.get('NODEMANAGER_PORT')
    nomeDominio = arquivoPropriedades.get('DOMINIO_NOME')
    diretorioDominio = arquivoPropriedades.get('DOMINIO_DIRETORIO')
    print '\n================================================================================================'
    print 'tentando conexao com o nodemanager...'
    print 'usuario: ' + usuario
    print 'ip Node Manager: ' + ipNodeManager
    print 'porta Node Manager: ' + portaNodeManager
    print 'Nome do dominio: ' + nomeDominio
    print 'Diretorio do dominio no servidor: ' + diretorioDominio
    print '================================================================================================'
    nmConnect(usuario,senha, ipNodeManager, portaNodeManager, nomeDominio, diretorioDominio, 'plain', 'true')
    for servidor in servidores:
        print 'solicitando inicializacao do servidor ' + arquivoPropriedades.get(servidor)
        nmStart(arquivoPropriedades.get(servidor), diretorioDominio)
        
#==========execucao (Main)========

arquivoPropriedades = carregaArquivoPropriedades('servidores.properties')

servidores = listaServidores(arquivoPropriedades)

inicializaInstancias()


O script carrega a lista de servidores de um arquivo de propriedades e inicializa cada um dos servidores declarados no arquivo. Abaixo um arquivo de propriedades de exmplo que pode ser utilizado com este script.

#colocar o IP e porta do nodemanger onde os servidores estão configurados. Caso houver
#necessidade de inicializar ou parar serviores em mais de um hardware o script deverá ser
#executado 1 vez para cada configuração de nodemanager e após feitos os devidos ajustes de ip e
#porta onde o nodemanager se encontra em execução.
NODEMANAGER_IP=localhost
NODEMANAGER_PORT=5559

#colocar o nome do diretório do domínio que será gerenciado pelo script.
DOMINIO_NOME=testescripts
#colocar o caminho completo do domínio que será gerenciado pelo script.
DOMINIO_DIRETORIO=/home/mmaia/weblogic10/domains/testescripts

#usuário e senha de administração deste domínio. Devem ser iguais aos do nodemanager configurados 
#para gerenciamento deste domínio e armazenados no arquivo nm_password.properties do domínio.
USUARIO_ADM=weblogic
USUARIO_ADM_SENHA=weblogic


#lista de nomes das instancias a serem inicializadas ou paradas, deve seguir o padrao SERVIDOR_X=
#pode-se registrar quantas instânciasforem necessárias. As instâncias listadas devem estar
#configuradas no ambiente onde o nodemanager configurado está.
SERVIDOR_1=teste-1
SERVIDOR_2=teste-2
SERVIDOR_ADMIN=AdminServer


[]s

20 de mai. de 2009

Oracle Weblogic Server - Singleton Services

Este post foi baseado na documentação oficial do Oracle Weblogic Server 10.3 em inglês.

O cluster de servidores de aplicação nos dá um certo conforto em relação à disponibilidade de nossas aplicações corporativas hoje em dia. O ambiente de tolerância a falhas e redundância proporcionado pelos clusters possibilita, dentre outras coisas: manutenção de ambiente de produção em tempo real, agregar poder de processamento a uma aplicação crítica, certa estabilidade em caso de falhas de aplicação, dentre várias outras funcionalidades extremamente importantes nos ambientes corporativos e competitivos da internet de hoje em dia.

Uma das exceções neste ambiente é quando a arquitetura de uma aplicação foi construída utilizando como base um Singleton que neste caso não pode ser distribuído para todo o cluster pois traria inconsistência no funcionamento da aplicação.

No weblogic server utilizando o serviço de migração automática de um cluster conseguimos ter uma boa opção para este tipo de serviço implementando o que é chamado de Serviço de Singleton(Singleton Services). Esta implementação nos garante a migração automática do serviço disponibilizado para um outro nó(servidor) do cluster em caso de falhas no servidor onde o Sigleton está sendo executado.

Como funciona?
No weblogic existe um componente chamado "Singleton Master" que é um componente que monitora os serviços que podem ser migrados automaticamente em caso de falha do nó do cluster onde um Singleton esteja atendendo requisições dos clientes e então ele controla o serviço de singloton para inicializar em um outro nó disponível do cluster. Por padrão o Singleton Master considera todos os servidores disponíveis em um cluster como candidatos para migração de um Singleton Service que venha a falhar, entretando uma lista pode ser especificada se for o caso. Se o Singleton Master tentar ativar o serviço que falhou em todos os nós da lista ou do cluster e falhar, o serviço ficará desativado.

Como é a implementação de um Singleton Service no Weblogic?
Para implementar a classe do Singleton deve implementar uma interface do Weblogic chamada weblogic.cluster.singleton.SingletonService e prover a implementação de 2 métodos para alocar e desalocar os recursos necessários ao Singleton respectivamente: activate() e deactivate() .
Feito isso basta escolher uma forma de registrar seu Singleton service com o Singleton Master do cluster que pode ser feito via Admin Console ou configurando no weblogic-application.xml o Singleton service(tem que ser um componente .ear).


...
   
      bb.com.br.seupacote.ImplementacaoSingletonService
      MeuSingletonService
   
...



Para configurar via Admin console, selecione o cluster e depois clique em Singleton Services, lá pode-se registrar a classe do Singleton Services diretamente. Para que isso funcione esta classe deverá ter sido disponibilizada no classpath dos servidores candidatos a rodarem o serviço.

Bem, é isso, o gerenciamento da disponibilização do serviço é feita então automaticamente pelo cluster do Oracle Weblogic Server que estiver sendo utilizado.

[]s

18 de mai. de 2009

Monitorando status e "Health" de uma Aplicação no Weblogic

Motivado por um post no javaranch fiz este script simples que checa status e saúde de uma aplicação em um servidor weblogic.

O script é bem simples e por isso estou omitindo maiores explicações. Segue o script.

#variable definitions================
username='weblogic'
password='weblogic'
urladmin='t3://localhost:7001'
appName='applicationName'
serverName='serverName'
#end variable definitions============



#connects to admin server
connect(username, password, urladmin)

cd('domainRuntime:/AppRuntimeStateRuntime/AppRuntimeStateRuntime')
#get intended state for application
intendedState = cmo.getIntendedState(appName)

print 'Intended state for app ' + intendedState

#get current real state for app in specific server
currentState = cmo.getCurrentState(appName, serverName)

print 'Current state in server '+ serverName + ' ==>> ' + currentState

cd('domainRuntime:/ServerRuntimes/'+ serverName +'/ApplicationRuntimes/'+appName)

#shows app attributes including current health.
print 'Current information for app ' + appName + ' in server ' + serverName + ' ==>> ' + ls('a')


[]s

11 de abr. de 2009

Oracle Weblogic Server Tutorial. Parte 3 - Criação de cluster Multicast

Este post mostra a criação e configuração de machine, servidores e um cluster utilizando o console de administração do domínio criado na parte 2 do tutorial. Par ver todos os posts relacionados a este tutorial clique no Título deste post!

O link do vídeo com o tutorial é: http://screencast.com/t/UBN4Zd3BixX

[]s

6 de abr. de 2009

Weblogic - Como acessar arquivos em disco

Esta é uma questão frequente nos fórums de weblogic e por isso estou postando aqui.

É comum que uma aplicação web precise acessar conteúdo estático existente em algum diretório compartilhado em servidor, disco de storage externo ou até mesmo em um diretório no Sistema operacional em ambientes não clusterizados.

No weblogic tem uma maneira bem simples de resolver este problema para isso utiliza-se uma tag no arquivo weblogic.xml que irá apontar para um diretório especificado e criará um url-pattern de acesso ao conteúdo desejado.

Para ilustrar o exemplo, suponhamos que seja desejado compartilhar o conteúdo estático que está disponível no caminho: /var/docs/weblogic/estatico no servidor onde o weblogic está instalado. Imagine que exista um arquivo chamado meuPdf.pdf que está diretamente neste diretório, para acessar este arquivo queremos que uma url direta aponte para o pdf em questão. Para isso deve-se configurar a tag virtual-directory-mapping, local-path e url-pattern no weblogic.xml:


  /var/docs/weblogic
  /estatico/*



Isso irá permitir que uma url como: http://seudominio.com/estatico/meuPdf.pdf encontre corretamente o arquivo desejado. Se houver pastas no diretório basta apendar a pasta depois do url-pattern definido para acessar corretamente o conteúdo.

Esta dica possibilita também que conteúdo estático seja disponibilizado e acessado corretamente fora do pacote dinâmico no weblogic, tornando o pacote dinâmico bem menor facilitando as atualizações.

Simples assim. Fica aí a dica.

[]s

4 de abr. de 2009

Oracle Weblogic Server Tutorial. Parte 2 - Criação de domínio

Na primeira parte deste tutorial mostrei a instalação do Oracle Weblogic Server no windows. Neste post irei mostrar a criação de um domínio que será utilizado para criação de um cluster nos próximos posts deste tutorial.

Um domínio no weblogic server é utilizado para controlar um conjunto de servidores realcionados. Tipicamente um domínio tem 1 Administration server e N servidores gerenciados por ele. Tenha em mente que um domínio do weblogic server pode se extender por vários hardwares e não tem relaçao com o conceito de domínio utilizado por sistemas operacionais. A definição direta é: Um domínio é um conjunto de servidores gerenciados por um Administration Server. Inicialmente irei utilizar apenas o meu desktop no tutorial mas este domínio pode posteriormente ser facilmente adequado para outros hardwares(Escalabilidade Horizontal).

Para entender melhor o conceito de domínios no Oracle Weblogic Server veja o site:
http://download.oracle.com/docs/cd/E12840_01/wls/docs103/domain_config/understand_domains.html

Para ver o vídeo-tutorial de configuração de domínio veja o link abaixo(5 minutos):
http://screencast.com/t/841WKSRfBUp

[]s