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

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

18 de jan de 2010

Postgres SQL no Linux - Dicas úteis

Neste artigo estou reunindo informações úteis para um quickstart de Postgres com Linux, se vc estiver usando uma versão que use o yum ao invés do apt-get basta substituir o comando. As versões utilizadas nestes comandos são Postgres 8.4 e Ubuntu 9.10.

Os comandos devem ser dados utilizando um terminal do ubuntu.

Instalação da base de dados Postgres:
sudo apt-get install postgresql


Instalação da ferramenta de administração pgAdmin III:
sudo apt-get install pgadmin3


Iniciar o postgresql
sudo service postgresql start


Para cadastrar uma senha default do usuário postgres ou resetar a senha deste usuário que é o superusuário da base de dados utilizar:
sudo su postgres
Com o usuário do postgres no terminal execute o psql para conectar na base de dados de senhas do postgres e modificá-la:
psql -d template1
O terminal irá mostrar o console postgres:
#template1
Dê um alter table no terminal modificando a senha:
ALTER USER postgres WITH PASSWORD '${SUA_NOVA_SENHA}';

Para sair do console do postgres utilize \q no terminal conectado.

Caso seja necessário alterar permissão de acesso para a base criada deve-se editar o arquivo de configuração do postgres que por default fica no caminho: /etc/postgresql/8.4/main/pg_hba.conf no ubuntu e no red hat usualmente no /var/lib/pgsql

Reiniciar o postgres:
sudo /etc/init.d/postgresql-8.4 restart



Se quiser parar o postgresql:
sudo service postgresql stop

[]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