Mostrando postagens com marcador Administração Weblogic. Mostrar todas as postagens
Mostrando postagens com marcador Administração Weblogic. Mostrar todas as postagens

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

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

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

15 de set. de 2009

Gzip no Weblogic

Outro dia precisei que as aplicações rodando em weblogic server utilizassem recursos de compactação Gzip para conteúdos de texto, html, css e javascript. O Gzip compacta estes recursos para transimtir pela internet e posteriormente o browser descompacta o que pode aumentar sensivelmente a performance percebida pelo usuário final da aplicação em diversos casos.

No ambiente em questão o weblogic está configurado para servir também o conteúdo estático e neste caso a solução padrão no mundo java é utilizar a configuração por Filtros.

Felizmente já existe um filtro Open Source disponibilizado para o weblogic para este fim e por isso basta configurarmos o pacote para utilizá-lo. Segue um passo-a-passo.

1) Baixar o .jar com as classes do filtro Gzip que vc preferir ou então escrever e gerar seu .jar com o filtro. Se preferir utilizar um filtro já escrito seguem links com posts e código fonte para tal. Links em inglês. blog do Markus Eisele ou blog do Nagesh Susarla. Se você preferir desenvolver o seu filtro de compactação Gzip pode se basear em artigos já escritos a respeito filtros, gzip e performance no On Java, no JavaWorld ou no Java Boutique, dentre outros.

2) O segundo passo é configurar o seu filtro no web.xml da apliação web que irá utilizar o Gzip, essa configuração deve variar um pouco depedendo do filtro que for ser utilizado conforme mencionado no passo 1, portanto segue um exemplo meramente ilustrativo abaixo:


  

    GZIPFilter

    weblogicx.servlet.gzip.filter.GZIPFilter

  



  

  

    GZIPFilter

    /*.html

  



  

    GZIPFilter

    /*.htm

  



  

    GZIPFilter

    /*.log

  

  

  

    GZIPFilter

    /*.txt

  



Finalmente, para checar a compactação utilizo o web developer toolbar do firefox em Information > View Document Size mostra a compactação de cada recurso carregado em uma página. Ver exemplo nas 2 imagens abaixo(ilustrativo).

Outra possibilidade é utilizar o plugin do Apache para Weblogic Server e habilitar a configuração de compactação do Apache para recursos estáticos. []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

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

29 de mar. de 2009

Monitoração de domínio e gravação de thread dump automático com WLST

Outro dia me deparei com um questionamento no fórum de discussão sobre como conseguir retirar os thread dumps do Servidor de aplicações, Oracle Weblogic, em momento oportuno, ou seja, quando o ambiente estiver passando por um momento de contingência. A discussão do problema pode ser vista detalhadamente no fórum do javaranch no link: http://www.coderanch.com/t/427054/BEA-Weblogic/Issue-with-WeblogicServer

Devido a este problema decidi escrever um artigo mostrando como podemos utilizar a linguagem de scripts do Weblogic Server, Weblogic Scripting Tool(WLST), para fazer monitoramento de servidores. Um ponto importante nestes script é que ele permite inclusive que este monitoramente seja feito de forma independente do Admin Server, pois neste caso, o script mostra conexão direta com servidores gerenciados de um domínio. Para escrevê-lo estou utilizando WLST que por sua vez utiliza linguagem Jython e é padrão para configuração do Oracle Weblogic.

O script:

O script demonstrado aqui é bem simples e o que ele faz basicamente é:

1) Carregar informações de um arquivo de propriedades.

2) Tenta conectar com cada um dos servidores da lista de servidores configurada no arquivo de propriedades.

3) Verifica status do servidor e caso o servidor estiver com um número maior que o definido de threads com delay na resposta gera um thread dump do servidor para posterior análise.

Abaixo segue o código do script comentado e logo em seguida um exemplo de arquivo de propriedades que pode ser utilizado como template.

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

#============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
    localizacaoArquivoPropriedadesConfiguracao = nomeArquivo    
    myProps = Properties()
    #carrega arquivo de propriedades
    myProps.load(FileInputStream(File(localizacaoArquivoPropriedadesConfiguracao)))
    return myProps

#funcao que retorna lista de todos os servidores configurados para este domínio.
def getServidoresDominio():
    print 'executando funcao getServidoresDominio']
    domainConfig()
    servidores = cmo.getServers()
    return servidores

#funcao que pega lista de servidores como parametro e verifica o status de cada um deles.
def mostraStatusServidores(servidores): 
    print '=======================STATUS dos servidores do domínio==============='
    domainRuntime()
    for servidor in servidores:
        try:
            cd('/ServerRuntimes/' + servidor.getName())
            #ls()
            print servidor.getName() + ': ' + get('State')
        except WLSTException,e:
            servidoresNaoAcessiveis.append(servidor)
    servidoresAlerta = []
    #testa novamente servidores que não estava acessíveis para ter certeza
    for servidor in servidoresNaoAcessiveis : 
        try:
            cd('/ServerRuntimes/' + servidor.getName())
            #ls()
            print servidor.getName() + ': ' + get('State')
        except WLSTException,e:
            servidoresAlerta.append(servidor)
    if len(servidoresAlerta) > 0 :
        print 'ALERTA == ALERTA == ALERTA == ALERTA == ALERTA == ALERTA =='
        print 'Os seguintes servidores estão inacessíveis para monitoração, favor checar!'
        for servidor in servidoresAlerta :
            print servidor.getName()
            
#faz checagem de memória nos servidores do domínio especificado.
def listaConfiguracoesMemoriaServidoresDomino():
    servidoresComBaixoHeapMemoria = []
    for servidor in servidores:
        try:
            cd("domainRuntime:/ServerRuntimes/" + servidor.getName() + "/JVMRuntime/" +servidor.getName())
            heapSizeMax = cmo.getHeapSizeMax()/1048576
            heapMemoriaLivre = cmo.getHeapFreeCurrent()/1048576
            heapMemoriaLivrePercentagem = cmo.getHeapFreePercent()
            #adiciona na lista de servidores com pouca memoria se servidor tiver menos de 2% de memória livre
            if heapMemoriaLivrePercentagem < 2 :
                servidoresComBaixoHeapMemoria.append(servidor)
            #memoriaMB = memoria/1048576 #transforma os bytes em MB para mostrar
            print '\n================================================================='
            print "O servidor " + servidor.getName() + " esta com :"
            print 'Memoria total alocada(MB): ' + str(heapSizeMax)
            print 'Memoria total disponivel(MB): ' + str(heapMemoriaLivre)
            print 'Memoria livre(%): ' + str(heapMemoriaLivrePercentagem)
        except WLSTException,e:
            print 'AVISO: O servidor ' + servidor.getName() + ' nao esta acessivel atraves do admin server'
    #faz novo teste de heap de memória e caso continuem com pouca memória disponível, mostra ALERTA para observação do servidor.
    for servidor in servidoresComBaixoHeapMemoria :
        try:
            cd("domainRuntime:/ServerRuntimes/" + servidor.getName() + "/JVMRuntime/" +servidor.getName())
        except WLSTException,e:
            print 'AVISO: O servidor ' + servidor.getName() + ' nao esta acessivel atraves do admin server'
            heapMemoriaLivrePercentagem = cmo.getHeapFreePercent()
            #adiciona na lista de servidores com pouca memoria se servidor tiver menos de 2% de memória livre
            if heapMemoriaLivrePercentagem < 2 :
                print 'ALERTA == ALERTA == ALERTA == ALERTA == ALE RTA == ALERTA =='
                print 'O servidor ' + servidor.getName() + ' está com heap de memória < que 2% e deve ser observado!'
#faz checagem de threads dos servidores do domínio
def checaThreadsServidoresDominio() :
    servidoresComThreadsProblematicas = []
    for servidor in servidores :
        try:
            cd("domainRuntime:/ServerRuntimes/" + servidor.getName() + "/ServerChannelRuntimes/DefaultSecure[https]")
            numeroConexoes = cmo.getConnectionsCount()
            print '==============================================='
            print 'Dados do servidor ' + servidor.getName() + ': '
            print 'Conexoes https: ' + str(numeroConexoes)
            cd('domainRuntime:/ServerRuntimes/' + servidor.getName() + '/ExecuteQueueRuntimes/weblogic.socket.Muxer')
            fila = cmo.getPendingRequestCurrentCount()
            print 'Requisicoes de usuarios pendentes: ' + str(fila)
            cd('domainRuntime:/ServerRuntimes/' + servidor.getName() + '/ThreadPoolRuntime/ThreadPoolRuntime')
            hoggingThread = cmo.getHoggingThreadCount()
            print 'Quantidade de threads com status hogging: ' + str(hoggingThread)
            print '===============================================\n'
        except WLSTException,e:
           print 'Erro servidor não acessivel para ServerRuntimes ==>> ' + servidor.getName()

#faz health check nos pools de conexao do ambiente.
def checaPoolsConexoes() :
    domainConfig()
    #recupera lista de pools de conexões configuradas no domínio.
    connectionPools = cmo.getJDBCSystemResources()
    for pool in connectionPools : 
        print pool.getName()
        cd('domainConfig:/JDBCSystemResources/' +pool.getName()+ '/JDBCResource/' +pool.getName()+ '/JDBCConnectionPoolParams/' + pool.getName())
        print '==============================================='
        print 'Dados do pool: ' + pool.getName()
        capacidadeInicialPool = cmo.getInitialCapacity()
        capacidadeMaximaPool = cmo.getMaxCapacity()
        print 'Capacidade maxima do pool: ' + str(capacidadeMaximaPool)
        cd('domainConfig:/JDBCSystemResources/' + pool.getName())
        targetServers = cmo.getTargets()
        print 'targets do pool'
        for targetServer in targetServers :
            print targetServer.getName()
#=================FIM DEFINICAO DE FUNCOES======================
propriedades = carregaArquivoPropriedades('config.properties')
username = propriedades.get('username')
password = propriedades.get('password')
url = propriedades.get('url')
connect(username, password, url)
#lista para armazenar servidores não acessíveis através do admin server.
servidoresNaoAcessiveis = []
servidores = getServidoresDominio()
mostraStatusServidores(servidores)
listaConfiguracoesMemoriaServidoresDomino()
checaThreadsServidoresDominio()
checaPoolsConexoes()
disconnect()
exit()


E o arquivo de propriedades de exemplo:
#este arquivo de propriedades é utilizado para configurar os   
#servidores em um ambiente. Todas as chaves devem ter o formato  
#do nome utilizando sempre _ (underscore) pois é o que define a   
#busca dos nomes dos elementos e separa durante a configuarção   
#no script criaInstancias.py  
USUARIO_ADMIN=user  
SENHA_ADMIN=pwd  
   
PORTA_HTTPS_SERVIDORES=443  
   
#parametro que configura com que quantidade de threads com delay o thread dump deve ser tirado para o servidor.  
PARAMETRO_THREAD_DUMP=10  
   
#Dados dos servidores a serem monitorados pelo script  
SERVIDOR_1=server1  
IP_SERVIDOR_1=xxxxxx  
  
SERVIDOR_2=server2  
IP_SERVIDOR_2=xxxxxxx  
   
SERVIDOR_3=server3  
IP_SERVIDOR_3=xxxxxx  
   
SERVIDOR_4=server4  
IP_SERVIDOR_4=xxxxxx  
   
# .... you may add as many servers as you want here...  


Para este script ficar realmente funcional eu programaria para que ele ficasse conectado com os servidores por um período definido em ciclos e que verificasse o status de cada um de tempos em tempos(3 em 3min por exemplo). E caso o servidor apresentasse algum problema considerável dispararia uma rotina que seria responsável por tirar thread dumps com intervalo de cerca de 20s entre um e outro por um período de 2 min. Os thread dumps retirados seriam de extrema utilidade para definir qual o real problema com o ambiente.

[]s

19 de mar. de 2009

Oracle Weblogic Server Tutorial. Parte 1 - Instalação Windows

A instalação do weblogic server é bem simples, a idéia deste post é fazer um quick start bastante resumido. O link para a documentação oficial de instalação da versão Weblogic 10.3, que é a mais recente  e completa, é: http://download.oracle.com/docs/cd/E12840_01/wls/docs103/sitemap.html

A primeira coisa é baixar o pacote compatível com o sistema operacional que estiver utilizando, para baixar os pacotes veja o link:  http://www.oracle.com/technology/software/products/ias/bea_main.html

Nesta série sobre configurações básicas no weblogic que estou iniciando irei fazer tutoriais em vídeo. A ferramente é o Jing conforme descrevi em outro post: http://mmaiacupofcoffee.blogspot.com/2009/03/documentacao-de-sistemas-demonstracao.html

Vou demonstrar instalação em um ambiente windows. Vou mostrar o modo de console gráfico para todas as configurações deste tutorial, posteriormente pretendo fazer o mesmo tutorial sem utilizar o modo gráfico no linux.
No windows o processo de instalação é todo gráfico com wizards o que torna tudo bem intuitivo para o usuário. O windows que estou utilizando para estas demonstrações é Windows XP.

Para ver o vídeo da primeira parte deste tutorial que mostra a instalação do Oracle Weblogic Server 10.3 acesse o link abaixo(O instalador já deve ter sido baixado!): 


[]s

10 de mar. de 2009

Weblogic - Travamento ao clicar no Activate do Admin Console

Hoje foi um dia muito corrido no trabalho, trabalhei bastante e não deu tempo de implementar a API de persistência e nem trabalhar no módulo Struts. Começei a escrever um tópico sobre upload no struts 2 que devo terminar amanhã.

Vou então deixar uma dica rápida relativa ao weblogic 10.X. No admin console depois de clicar em Lock & Edit e editar as altarações que deseja e voltar em clicar em Activate o console trava, fica processando e nada acontece. É um erro que infelizmente vem ocorrendo com certa frequência no trabalho do dia a dia com weblogic. 
São 2 as principais e mais usuais causas deste tipo de problema: 

1) Quando o domínio do weblogic é distribuído em mais de um hardware e está configurado para conectar no nodemanager e este não está funcionando corretamente.

2) Quando alguma permissão no diretório de instalação do weblogic ou do domínio perderam a permissão de escrita ou direito de apagar arquivos, renomear etc... Isso é comum quando, por exemplo, em qualquer ambiente unix ou derivado é criado um usuário e um grupo para o weblogic como: weblogic:weblogic e alguém editou ou manipulou algum arquivo como root retirando a permissão do usuário. Isso faz com que o console tenha o mesmo comportamento de impossibilidade de ativar as alterações.

As situações acima são as que mais comumente causam o problema do aparente "travamento" ao clicar em Activate, na verdade não trava o console mas o activate nunca consegue completar. O chato desta situação é que o console não mostar nenhuma mensagem e também nada sai no log do Admin console informando o que está causando o problema, o que dificulta muito descobrir o que está acontecendo.
Fica esta dica e lembrete sobre o problema. 
[]s

16 de fev. de 2009

Certificação Weblogic 10

A Oracle liberou a nova certificação de weblogic 10 a algum tempo, vou iniciar uma revisão geral dos itens e pretendo fazer a prova em breve.

Documentos de estudos, resumos e outros materiais que utilizo para síntese dos assuntos pretendo postar aqui neste site.
O nome oficial da certificação é "Oracle WebLogic Server 10g System Administrator Certified Expert".

O link para o site oficial da oracle é: http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=283

Detalhamento dos itens cobrados nas provas, cursos recomendados e outras informações mais detalhadas veja no link: http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=41&p_exam_id=1Z0_108

Comecei a fazer um mapa mental com os tópicos do exame, postarei em breve. []s

12 de ago. de 2008

Como definir uma função com WLST?

Para definir uma função com WLST basta utilizar a instrução def que tem o formato:
def nomeFuncao(Parametros)
como no exemplo a seguir:
def carregaPropriedades(nomeArquivo):
  #carrega arquivo de propriedades
  myProps.load(FileInputStream(File(nomeArquivo)))
A função chamada carregaPropriedades é definida recebendo como parâmetro o nome do arquivo a ser carregado. Depois para chamar a função:
#chama a função definida acima
carregaPropriedades('exemplo.properties')

no exemplo acima um arquivo de propriedades chamado exemplo.properties é carregado e deve existir no mesmo diretório do script.

Segue exemplo completo, lembre-se de criar no mesmo diretório do arquivo .py um arquivo chamado exemplo.properties com chave valor no padrão .properties de java.
from java.util  import Properties
from java.io  import FileInputStream
from java.io  import File
from java.util  import Enumeration

myProps = Properties()

def carregaPropriedades(nomeArquivo):
  #carrega arquivo de propriedades
  myProps.load(FileInputStream(File(nomeArquivo)))

#chama a função definida acima
carregaPropriedades('exemplo.properties')

propertyNames = myProps.propertyNames()
while propertyNames.hasMoreElements():
  #imprime on nomes de todas as chaves carregadas do arquivo de propriedades
  chave = propertyNames.nextElement()
  print str(chave)
  print '' + myProps.getProperty(chave)


É isso, em outro artigo mostrarei como fazer herança utilizando WLST e portanto como pode-se definir funções reutilizáveis em seus scripts WLST.
[]s

5 de ago. de 2008

Configuração de log dos servidores com WLST

Para fazer a configuração de log padrão e http de um servidor utilizando WLST utilizo os seguintes comandos:

username='weblogic'
password='weblogic'
adminurl='t3://localhost:7001'

SERVIDOR='managedServer1'

DIRETORIO_LOG='/var/logs'

NOME_ARQUIVO_LOG='server.log'

# Conecta com Admin server do domínio
connect(username, password, adminurl)

edit()
startEdit()

print 'INICIANDO CONFIGURACAO DE LOG DO SERVIDOR ...'
cd('Servers/' + SERVIDOR + '/Log/' + SERVIDOR)
cmo.setFileName(DIRETORIO_LOG+ '/' + SERVIDOR + '/' + NOME_ARQUIVO_LOG)
cmo.setRotationType('byTime')
cmo.setFileTimeSpan(6)
cd('/')
#====CONFIGURANDO LOG HTTP====
cd('Servers/' + SERVIDOR + '/WebServer/' + SERVIDOR + '/WebServerLog/' + SERVIDOR)
cmo.setFileName(DIRETORIO_LOG + '/' + SERVIDOR + '/access.log')
cmo.setRotationType('byTime')
cmo.setFileTimeSpan(6)
print 'LOG DO SERVIDOR CONFIGURADO\n\n'
cd('/')
activate()


Neste caso será feita uma conexão com o Admin server rodando em localhost na porta 7001, depois no primeiro bloco navega para o MBean de log da instância passada na variável SERVIDOR e finalmente seta o arquivo de log para, neste caso, diretório /var/logs/managedServer1/server.log usando o setFileName finalmente configura o arquivo de log para rotacionar por tempo e seta o tempo para 6 horas. Depois inicia configuração do log http para isso navega para local de configuração do WebServer do servidor em questão e configura a saída para /var/logs/managedServer1/access.log, configura para rotacionar por tempo de 6 em 6 horas ativa as configurações e termina o script.

[]s

Como rodar um script WLST

Este post mostra como executar um script WLST do Oracle BEA Weblogic Server 10.

Para executar o script recomendo utilizar a JVM da BEA que vem com o Weblogic server. Para isso neste exemplo como modelo didádito irei passar o caminho completo da JVM utilizada assim como o classpath completo. No seu ambiente vc pode setar o Path e Classpath para simplificar este comando.

O Script WLST tem a extensão python .py portanto o script terá o formato xxxxx.py onde xxxxx pode ser qualquer nome de arquivo válido no sistema operacional.

Para executar o script chamado criaDominioWeblogic.py de um console DOS no windows o comando, pressupondo que vc esteja no mesmo nível do diretório onde se encontra o script mencionado, seria:

C:\bea\jrockit_150_11\bin\java -cp C:\bea\wlserver_10.0\server\lib\weblogic.jar weblogic.WLST criaDominioWeblogic.py

[]s