JBoss AS 6

Encrypt Keystore Password no JBoss AS 6.1 / 5.1

Postado em Atualizado em

Olá a todos 😀

Hoje vamos aprender como encriptar a senha do keystore/certificado que fica configurado no connector HTTPs no server.xml do JBoss. Em configurações normais quando habilitamos o HTTPs configuramos a caminho e password dos certificados em texto puro no connector mas essa não é um boa pŕatica, veja abaixo:

<Connector protocol="HTTP/1.1" SSLEnabled="true"
    port="${jboss.web.https.port}" address="${jboss.bind.address}"
    scheme="https" secure="true" clientAuth="false"
    keystoreFile="${jboss.server.home.dir}/conf/example.keystore"
    keystorePass="changeit" sslProtocol = "TLS" />

Se você quiser encriptar a senha da keystore então a sintaxe acima não é necessária. A sintaxe correta seria:

<Connector port="${jboss.web.https.port}" address="${jboss.bind.address}"
   maxThreads="100" minSpareThreads="5" maxSpareThreads="15"
   scheme="https" secure="true" clientAuth="false"
   sslProtocol="TLS"
   securityDomain="java:/jaas/encrypt-keystore-password"
   SSLImplementation="org.jboss.net.ssl.JBossImplementation" >
</Connector>

O próximo passo é configurar MBean JaasSecurityDomain. Você precisa criar o arquivo JBOSS_HOME/server//deploy/security-service.xml e adicionar o conteúdo abaixo:

<server>
   <mbean code="org.jboss.security.plugins.JaasSecurityDomain"
      name="jboss.security:service=PBESecurityDomain">
      <constructor>
         <arg type="java.lang.String" value="encrypt-keystore-password"></arg>
      </constructor>
      <attribute name="KeyStoreURL">resource:example.keystore</attribute>
      <attribute name="KeyStorePass">{CLASS}org.jboss.security.plugins.FilePassword:${jboss.server.home.dir}/conf/keystore.password</attribute>
      <attribute name="Salt">mysaltmagnani</attribute>
      <attribute name="IterationCount">13</attribute>
      <!--
        <attribute name="KeyStoreType">pkcs12</attribute>
       -->
   </mbean>
</server>

Você pode alterar o valor de salt e iterationCount conforme a sua necessidade.

O próximo passo é criar o arquivo de senha. Execute o seguinte comando:

[mmagnani@dhcp-32 conf]$ pwd
/home/mmagnani/WorkSpace/jboss-org/jboss-6.1.0.Final/server/blog/conf
[mmagnani@dhcp-32 conf]$ java -cp ../../../lib/jbosssx.jar org.jboss.security.plugins.FilePassword mysaltmagnani 13 password keystore.password

O arquivo keystore.password foi criado.

Agora para finalizar temos que dizer ao container web para iniciar serviço PBESecurityDomain(security-service.xml) que havíamos criado.

Edite o arquivo JBOSS_HOME/server//deploy/jbossweb.sar/META-INF/jboss-beans.xml e adicione PBESecurityDomain abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="urn:jboss:bean-deployer:2.0">

   <bean name="WebServer"
         class="org.jboss.web.tomcat.service.deployers.TomcatService">

     ....

       <depends>jboss.security:service=PBESecurityDomain</depends>

     ....

  </bean>
</deployment>

Inicie o JBoss e verifique se o HTTPs está funcionando corretamente. Para gerar o certificado eu utilizei o comando abaixo:

keytool -genkeypair -keystore example.keystore -storepass password -keypass password -keyalg RSA -validity 180 -alias example -dname "cn=Mauricio Magnani,o=Home,c=BR"

Espero que tenha ajudado, Abraços.

Limitando o Número de Sessões no JBoss AS 6.1

Postado em Atualizado em

Existe uma maneira bem simples de limitar o número de sessões ( entenda-se usuários ) no JBoss. Para essa finalidade existe o atributo maxActiveSessions  que deve ser adicionado ao context.xml do jbossweb.sar. Siga os passos abaixo:

Edite o arquivo context.xml:

jboss-6.1.0.Final\server\default\deploy\jbossweb.sar\context.xml

Adicione o atributo maxActiveSessions:

<Context cookies="true" crossContext="true">

<Manager pathname="" />

<InstanceListener>org.jboss.web.tomcat.service.NamingListener</InstanceListener>

<Manager maxActiveSessions="2"/>

</Context>

Configuramos o JBoss para ter no máximos dois usuário conectados, quando o terceiro usuário se conectar a exceção “Exception initializing page context java.lang.IllegalStateException: createSession: Too many active sessions” será lançada  gerando o código HTTP 500.

Para realizar os testes tente realizar o login no jmx-console em três navegadores diferente.  Veja abaixo:

  • Google Chrome

  • Mozilla Firefox

  • Internet Explorer

Perceba que com o Google Chrome e Mozilla Firefox o JBoss já possui dois usuários conectados ao tentarmos acessar pelo Interner Explorer a página fica em branco pois o número máximo de sessões foi atingindo.

Caso seja necessário customizar a página de erro, os atributos abaixo devem ser adicionados no web.xml da aplicação desejada:

<error-page>
  <error-code>500</error-code>
  <location>error_500.jsp</location>
</error-page>

<error-page>
  <exception-type>java.lang.IllegalStateException</exception-type>
  <location>error_exception.jsp</location>
</error-page>

Veja abaixo a página customizada:

Espero que tenha ajudado.

Abraços

Melhorando a Performance da Conexão JDBC no JBoss AS 6.1

Postado em Atualizado em

A alguns meses atrás fiquei curioso sobre como melhorar a performance de conexões JDBC que utilizam o data source no JBoss. Pesquisando a documentação acabei encontrando alguns parâmetros (tcpSndBuf, tcpRcvBuf, tcpNoDelay) que ajudam a “tunar” as conexões JDBC.

Uma conexão JDBC por baixo dos panos, nada mais é que um soquete, portanto podemos aplicar os mesmos conceitos de performance aplicados aos sockets do sistema operacional, como por exemplo quando manipulamos o tamanho do buffer TCP para que seja maior que o padrão (32 KB). Podemos dizer as nossas conexões que utilizem valores superiores, veja como isso pode ser utilizado no data source do JBoss:

<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/test</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>123456</password>

    <connection-property name="tcpSndBuf">64000</connection-property>
    <connection-property name="tcpRcvBuf">64000</connection-property>
    <connection-property name="tcpNoDelay">true</connection-property>

<metadata>
     <type-mapping>mySQL</type-mapping>
</metadata>
  </local-tx-datasource>
</datasources>
Uma ressalva é de que algumas propriedades como essas dependem dos providers dos drivers JDBC.
Abraços

Cluster no JBoss AS 6.1 utilizando TCP

Postado em Atualizado em

Olá, hoje vamos aprender como criar um cluster básico de duas instâncias no JBoss AS 6 utilizando TCP.
Por default todas as instâncias no JBoss AS 6 utiliza o protocolo UDP, para comunicação e descobrimento de novos nós.
Caso o administrador queira mudar esse comportamento e passar a utilizar TCP, será preciso passar explicitamente um parâmetro na inicialização do JBoss. Esse parâmetro pode ser passado da seguinte maneira: -Djboss.default.jgroups.stack=tcp

Também será preciso editar o arquivo jgroups-channelfactory-stacks.xml, que fica em:

Node 1

vim /opt/jboss-6.1.0.Final/server/node1/deploy/cluster/jgroups-channelfactory.sar/META-INF/jgroups-channelfactory-stacks.xml

Node 2

vim /opt/jboss-6.1.0.Final/server/node2/deploy/cluster/jgroups-channelfactory.sar/META-INF/jgroups-channelfactory-stacks.xml

Deve-se comentar o bloco abaixo:

<!-- Alternative 1: multicast-based automatic discovery.
<MPING timeout="3000"
num_initial_members="3"
mcast_addr="${jboss.jgroups.tcp.mping_mcast_addr,jboss.partition.udpGroup:230.11.11.11}"
mcast_port="${jboss.jgroups.tcp.mping_mcast_port:45700}"
ip_ttl="${jgroups.udp.ip_ttl:2}"/> -->

E  retirar o comentário do bloco:

<!-- Alternative 2: non multicast-based replacement for MPING. Requires a static configuration
of *all* possible cluster members. -->
<TCPPING timeout="3000"
initial_hosts="${jboss.jgroups.tcp.tcpping.initial_hosts:localhost[7600],localhost[7601]}"
port_range="1"
num_initial_members="3"/>

Agora na inicialização do JBoss AS 6, passa os parâmetros da seguinte forma:

Node 1

./run.sh -c node1 -Djboss.service.binding.set=ports-default -Djboss.messaging.ServerPeerID=01 -Djboss.default.jgroups.stack=tcp -Djboss.jgroups.tcp.tcpping.initial_hosts="localhost[7600],localhost[7601]" -Djgroups.bind_addr=0.0.0.0
 -g MyCluster

Node 2

./run.sh -c node2 -Djboss.service.binding.set=ports-01 -Djboss.messaging.ServerPeerID=02 -Djboss.default.jgroups.stack=tcp -Djboss.jgroups.tcp.tcpping.initial_hosts="localhost[7600],localhost[7601]" -Djgroups.bind_addr=0.0.0.0 -g MyCluster

Agora o JBoss AS 6 deverá já estar funcionando utilizando o protocolo TCP. Lembrando que existem muitas outras configurações,  a serem realizadas para que realmente o cluster possa ser colocado em produção.

Espero que tenha ajudado

abraços!

Fonte: http://docs.jboss.org/jbossas/docs/Administration_And_Configuration_Guide/5/html_single/index.html

Implantando Sua Aplicação Web No Contexto Raiz no JBoss AS 6.1

Postado em Atualizado em

Olá,   Ano novo começando e surge o primeiro post do ano 🙂

Como implantar os aplicativos criados para que sejam acessados no contexto raiz ( localhost:8080 ) ?. Bom para fazer isso é bem simples \o/ , basta criar em sua aplicação web o arquivo jboss-web.xml , abaixo de WEB_INF, e inserir o conteúdo abaixo:

<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">

<jboss-web>
<context-root>/</context-root>
</jboss-web>

Agora devemos remover ou renomear a aplicação web ROOT.war do JBoss AS 6. Se desejar renomear utilize o comando abaixo:

mv /opt/jboss-6.1.0.Final/server/default/deploy/ROOT.war/ /opt/jboss-6.1.0.Final/server/default/deploy/ROOT_OLD.war

Agora faça o deploy da sua aplicação no JBoss AS 6:

cp /home/mmagnani/Desktop/minha_app.war /opt/jboss-6.1.0.Final/server/default/deploy/

Agora acesse a url http://localhost:8080 .  Sua aplicação deverá estar rodando no contexto raiz, como a imagem abaixo:


Até a Próxima, Abraços!

Balanceamento de Carga no JBoss AS 6.1 – Parte 1

Postado em Atualizado em

Para aplicações como muitas solicitações, geralmente ocorre a necessidade de melhorar a performance. Um dos meios mais utilizados atualmente é o Balanceamento de Carga, que consistem em distribuir a carga das solicitações em vários servidores ( nós ) visando equilibrar as solicitações, proporcionando um tempo de reposta mais rápido. Isso envolve o uso de algoritmos de distribuição de carga.
Para servidores JBoss AS existem atualmente duas soluções que são as mais utilizadas: Mod JK e Mod Cluster. Abaixo vou descrevê-las:

Mod JK: É o componente de balanceamento de carga mais utilizado atualmente, não só para instâncias JBoss, mas para outros servidores web e de aplicação. O mod-jk realiza a integração entre o Apache HTTPd e o Tomcat/JBoss, utilizando o protocolo AJP. Um dos grandes problemas do mod-jk são os arquivos de configuração que dificultam a manutenção em um grande parque de servidores, pois esses mesmos arquivos de configuração devem ser replicados.

Mod Cluster:  É um componente criado pela Red Hat para atender a mecanismos de balançeamento de carga alinhados ao conceito de  Cloud. O Mod Cluster vem com a promessa de algoritmos de balanceamento de carga mais avançados, que se baseiam na carga da aplicação, ou seja quantidades de sessões, conexôes abertas, etc. Ele pode ser customizado conforme a necessidade da aplicação visando um ambiente elástico. Um das vantagens é também o descobrimento automático de novas instâncias JBoss ( Utilizando Multicast ), não havendo a necessidade de configurações extras. Lembrando que o JBoss AS 6.1 já vem com o Mod Cluster nativamente.

Nesse post, vamos abordar as duas situações Mod JK e Mod Cluster utilizando JBoss AS 6.1.

Mod JK e JBoss AS 6.1

Eu presumo que você já possua o Apache HTTPd instalado, caso não basta apenas executar o comando abaixo para que ele seja instalado.

yum install httpd

Ao ver Is this ok [y/N]: , digite y. Pronto, o Apache HTTPd será instalado.

Para configurarmos o balançeamento de carga de forma adequada,  devemos realizar os seguintes passos:

  1.    Baixar e Compilar o Mod JK
  2.   Configurar o Apache HTTPd ( mod-jk.conf )
  3.   Configurar o arquivo worker.properties e uriworkermap.properties
  4.   Preparar o JBoss AS 6.1
  5.  Desenvolver uma aplicação Web simples  para testar o funcionamento

1 – Baixar e Compilar o Mod JK

O mod_jk pode ser baixado na seguinte url: http://tomcat.apache.org/download-connectors.cgi, o arquivo tomcat-connectors-1.2.32-src.tar.gz, deverá ser baixado.

Logo em seguida devemos descompactar o arquivo, e compilar utilizando o comando abaixo:

tar xvfz tomcat-connectors-1.2.32-src.tar.gz
 cd tomcat-connectors-1.2.32-src/native/
 ./configure –with-apxs=/usr/sbin/apxs

Execute os comandos abaixo:

yum install httpd-devel
 ./configure –with-apxs=yes
 make
 make install

Com os passos acima instalamos o Mod JK  no diretorio de modulos do Apache HTTPd.

  2 – Configurar o Apache HTTPd ( mod-jk.conf )

Agora vamos criar o arquivo de parametros do mod-jk, deve-se criar em /etc/httpd/conf/ o arquivo mod-jk.conf e configura-lo como abaixo:

LoadModule jk_module modules/mod_jk.so

JkWorkersFile conf/worker.properties

JkLogFile logs/mod_jk.log

# Nivel de log [debug/error/info]
JkLogLevel debug

# Formato da log
JkLogStampFormat  "[%a %b %d %H:%M:%S %Y]"

# SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat
JkRequestLogFormat "%w %V %T"

JkMount /application/* loadbalancer

# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties

# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm

# Add jkstatus for managing runtime data
<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>

Agora edite o arquivo  /etc/httpd/conf/httpd.conf , e adicione no final o seguinte contéudo:

Include conf/mod-jk.conf

Nós estamos simplesmente incluindo uma nova configuração ao httpd.conf para que Apache HTTPd reconheça.

A Configuração dos parametros do Mod JK está finalizada.

3 – Configurar o arquivo worker.properties e uriworkermap.properties

Agora o arquivo worker.properties deverá ser criado  no diretório /etc/httpd/conf/. No arquivo worker estão as informações relacionadas aos hosts envolvidos e  parametros como fator de balanceamento, protocolos, configurações de cache entre outros.

O arquivo worker.properties do nosso exemplo, deve ser configurado como abaixo:

worker.list=instance01, instance02, loadbalancer

#Instance01

worker.instance01.port=8009
worker.inttance01.host=localhost
worker.instance01.type=ajp13
worker.instance01.lbfactor=1

#Instance02

worker.instance02.port=8309
worker.inttance02.host=localhost
worker.instance02.type=ajp13
worker.instance02.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=instance01, instance02

Agora devemos configurar o arquivo uriworkermap.properties, que é o arquivo ao qual nós passamos os contextos que devem ser balanceados, siga o exemplo abaixo:

/jmx-console=loadbalancer
/jmx-console/*=loadbalancer
/admin-console=loadbalancer
/admin-console/*=loadbalancer
/loadBalance=loadbalancer
/loadBalance/*=loadbalancer

O contexto loadBalance, será a nossa aplicação de teste para verificarmos se o nosso balanceamento está funcionando. Essa app será criada no passo 5.

Essa parte está finalizada.

4 –   Preparar o JBoss AS 6.1

Inicialmente deve-se criar um perfil, baseando-se nos requisitos da aplicação ( All, Default …),  isso pode ser feito com os comando abaixo:

cd /opt/jboss/server/
cp -Rap all instance01
cp -Rap all instance02

Agora devemos adicionar o parametro jvmRoute ao JBoss, para que a comunicação com o Apache HTTPd seja realizada utilizando o protocolo AJP.

Edite o arquivo  /opt/jboss/server/instance01/deploy/jbossweb.sar/server.xml, e adicione o parametro jvmRoute como abaixo:

<Engine name="jboss.web" defaultHost="localhost" jvmRoute="instance01" >

Repita o processo para a segunda instância:

Edite o arquivo /opt/jboss/server/instance02/deploy/jbossweb.sar/server.xml, e adicione o parametro jvmRoute como abaixo:

<Engine name="jboss.web" defaultHost="localhost" jvmRoute="instance02" >

Agora devemos alterar a porta AJP. Esse passo é necessário pois estou utilizando as duas instâncias do JBoss AS, na mesma máquina.
A porta AJP deve ser a mesma que passamos no parametro worker.instance01.port e worker.instance02.port, no arquivo worker.properties.

Para editar esse arquivos no JBoss AS 6.1, faça como abaixo:

Edite o arquivo  /opt/jboss/server/instance01/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml

<bean>
<property name="serviceName">jboss.web:service=WebServer</property>
<property name="bindingName">AjpConnector</property>
<property name="port">8009</property>
<property name="description">JBoss Web AJP connector socket</property>
</bean>

Edite o arquivo /opt/jboss/server/instance02/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml

<bean>
<property name="serviceName">jboss.web:service=WebServer</property>
<property name="bindingName">AjpConnector</property>
<property name="port">8309</property>
<property name="description">JBoss Web AJP connector socket</property>
</bean>

Agora devemos iniciar as instâncias, com os comandos abaixo:

./run.sh -c instance01
./run.sh -c instance02 -Djboss.service.binding.set=ports-02

Verifique após a inicialização, se a porta AJP realmente é a mesmo que foi configurado no worker.properties.

5 – Desenvolver uma aplicação Web simples  para testar o Funcionamento do Balanceamento de Carga

Crie uma simples aplicação Web Como Abaixo, para realizarmos os testes. Altere o mesmo código  para ficar adequado a Instância 02.

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<img src="numero1.jpg" alt="Instance01" />
<%= request.getSession().getId() %>
<h1>Instance01</h1>
</center>
</body>
</html><strong>
</strong>


Agora crier um pacote chamado loadBalance.war para a primeira instância e loadBalance.war para a segunda instância.
Faça o deploy na pasta padrão  /opt/jboss/server/instance01/deploy/ e /opt/jboss/server/instance02/deploy/.
Acesse a primeira instância pelo FireFox ( ou qualquer outro browser ).

Acesse a seguinte url: http://localhost/loadBalance/test.jsp , você deverá ver a imagem abaixo:

Agora acesse a mesma url http://localhost/loadBalance/test.jsp, só que utilizando outro browser, se o balanceamento estiver funcionando você deverá ver a imagem abaixo:

Bom é isso ai galera, muitas coisas ainda podem ser melhoradas aqui, lembrando que não estamos utilizando o Cluster, tanto é que não fizemos o deploy no diretório farm, mas  sim no diretório padrão.

A Configuração do JBoss AS 6.1 como Mod JK Está Finalizada !

Continua ( Mod Cluster ) ….

JBoss AS / EAP: Peguntas Mais Frequentes

Postado em Atualizado em

1 –  Como Deixar o JBoss Acessível para rede Externa?

É preciso realizar o binding ao inicializar a instância, abaixo estão alguns exemplos:

JBoss 5

Windows:    run.bat -b 0.0.0.0
Linux:        ./run.sh -b 0.0.0.0

JBoss 6

Windows:    run.bat -b 0.0.0.0
Linux:         ./run.sh -b 0.0.0.0

JBoss 7 .0.2

Windows:  standalone.bat -b 0.0.0.0
Linux:       ./standalone.sh -b 0.0.0.0

2 – Como Gerar os Binários do JBoss a partir do Código Fonte?

https://jbossdivers.wordpress.com/2011/09/02/gerando-binarios-do-jboss-eap-5-1-a-partir-do-source/

3 – Onde Ficam os JSPs Compilados?

Os JSPs compilados ficam do diretório: JBOSS_HOME/server/<profile>/work

4 – Onde posso alterar as portas do JBoss?

JBoss 5               JBOSS_HOME/server/<profile>/deploy/jbossweb.sar/server.xml

JBoss 6               JBOSS_HOME/server/<profile>/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml

JBoss 7              JBOSS_HOME/standalone/configuration/standalone.xml

5 – Como Substituir o HSQLDB Por um Banco de Dados de Produção no JBoss?

JBoss 5     https://jbossdivers.wordpress.com/2011/09/14/substituindo-o-hsqldb-por-um-banco-de-dados-de-producao-no-jboss-eap-5-1/

JBoss 6   https://jbossdivers.wordpress.com/2011/09/30/substituindo-o-hsqldb-por-um-banco-de-dados-de-producao-no-jboss-as-6-1/

6 – Como Espeficar a Versão do JSF  no JBoss?

https://jbossdivers.wordpress.com/2011/09/01/jsf-da-aplicacao-ou-do-jboss-as/
https://jbossdivers.wordpress.com/2011/09/01/especificando-a-versao-do-jsf-no-jboss/

7 -Como  Habilitar SSL no JBoss?

https://jbossdivers.wordpress.com/2011/09/09/habilitando-ssl-no-jboss-as-6-1/

8 – Onde Ficam os Stateful Session Beans “passivated “?

JBOSS_HOME/server/<profile>/tmp/sessions

9 – Onde São Armazenados os WSDLs que estão publicados?

JBOSS_HOME/server/<profile>/data/wsdl

10 – Como Iniciar Instâncias do JBoss AS /EAP em Cluster? Windows/Windows ou Windows/Linux ou Linux / Linux?

./run.sh -c all -b 192.168.1.5 -u 230.10.20.203 -g JbossPartitionName
./run.sh -c all -b 192.168.1.6 -u 230.10.20.203 -g JbossPartitionName

Espero que tenha ajudado, se vocês tiverem mais perguntas deixem comentários que adiciono ai em cima.

Abraços!

Desenvolvendo e Consumindo Web Services no JBoss AS 6.1

Postado em Atualizado em

O JBoss AS 6.1, vem com  o Apache CXF como principal implementação. Então vamos utilizar tecnologia para disponibilizar os serviços através do JBoss.
Inicialmente devemos criar um Dynamic Web Project, no Eclipse e selecionar em Target Runtime o JBoss AS 6.1.

Devemos adicionar a nosso projeto uma Interface que será o ponto de entrada do nosso serviço:


package jbossdivers.ws.services;

import javax.jws.WebMethod;
import javax.jws.WebService;

 @WebService
 public interface CalculaIMCService {

  @WebMethod
  public String caculaIndiceCorporal(int peso, double altura);
}

Agora a interface criada deve ser implementada.

package jbossdivers.ws.services;

import javax.jws.WebService;

@WebService(endpointInterface = "jbossdivers.ws.services.CalculaIMCService", serviceName = "CalculaIMCService")
public class CalculaIMCServiceImpl implements CalculaIMCService {

@Override
public String caculaIndiceCorporal(int peso, double altura) {

/*
Abaixo do peso    Abaixo de 18.4
Peso normal    18.5 - 24.9
Sobrepeso    25.0 - 29.9
Obesidade Grau I    30.0 - 34.9
Obesidade Grau II    35.0 - 39.9
*/
double resultadoIMC = (peso) / (altura * altura);

  if (resultadoIMC > 35) {
       return "Obesidade Grau II - " + "IMC: " + resultadoIMC ;

  } else if (resultadoIMC > 30) {
       return "Obesidade Grau I - " + "IMC: " + resultadoIMC;

  } else if (resultadoIMC > 25) {
       return "Sobrepeso - " + "IMC: " + resultadoIMC;

  } else if (resultadoIMC > 18.5) {
       return "Peso normal - " + "IMC: " + resultadoIMC ;

  } else {
       return "Abaixo do peso normal - " + "IMC: " + resultadoIMC;
  }
 }
}

Agora o serviço deve ser registrado no web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<servlet>
   <servlet-name>CalculaIMCServiceImpl</servlet-name>
   <servlet-class>jbossdivers.ws.services.CalculaIMCServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>CalculaIMCServiceImpl</servlet-name>
   <url-pattern>/CalculaIMCServiceImpl/*</url-pattern>
</servlet-mapping>

</web-app>

Depois de criar a implementação do serviço  precisamos fornecer o nome da classe e uma  URL no arquivo jbossws-cxf.xml.


<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:beans="http://www.springframework.org/schema/beans" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<jaxws:endpoint id="CalculaIMCService" address="/CalculaIMCService" implementor="jbossdivers.ws.services.CalculaIMCServiceImpl">
<jaxws:invoker>
<bean class="org.jboss.wsf.stack.cxf.InvokerJSE"/>
</jaxws:invoker>
</jaxws:endpoint>

</beans>

A nossa web service está finalizada, agora o JBoss Deve ser iniciado para podermos visualizar o serviço e torna-lo disponivel.

Vamos consumir esse serviço utilizando um client Apache CXF. A implementação desse client está abaixo:

package jbossdivers.ws.util;

import jbossdivers.ws.services.CalculaIMCService;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

public class ClientWS {

public static void main(String args[]){

 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

 factory.getInInterceptors().add(new LoggingInInterceptor());
 factory.getOutInterceptors().add(new LoggingOutInterceptor());
 factory.setServiceClass(CalculaIMCService.class);
 factory.setAddress("http://192.168.1.5:8080/MyProjectWS/CalculaIMCServiceImpl");

 CalculaIMCService client = (CalculaIMCService) factory.create();

 System.out.println("Retorno: " + client.caculaIndiceCorporal(100, 1.80D) );

 }

}

O Retorno será: Obesidade Grau I – IMC: 30.864197530864196
Ps: Tenho que ir pra Academia 😛
Aqui abaixo  está um client onde pode ser passado um Bean  como Parâmetro e o WSDL em questão.

package ws.client;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

public class ClientFactory<T> {

 Class<T> klass;

 public ClientFactory(Class<T> klass){
  this.klass = klass;
 }

 @SuppressWarnings("unchecked")
 public T createFactory(String urlService){

   JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
   factory.getInInterceptors().add(new LoggingInInterceptor());
   factory.getOutInterceptors().add(new LoggingOutInterceptor());
   factory.setServiceClass(klass);
   //factory.setUsername(username);
   //factory.setPassword(password);
   factory.setAddress(urlService);
   T client = (T) factory.create();

   return client;
  }
}

Espero que tenha Ajudado!
Abraços!

Substituindo o HSQLDB Por um Banco de Dados de Produção no JBoss AS 6.1

Postado em Atualizado em


Inicialmente devemos remover os seguintes arquivos do JBoss AS 6.1:

 hsqldb.jar – jboss-6.1.0.Final/common/lib/hsqldb.jar
 hsqldb-plugin.jar -jboss-6.1.0.Final/common/lib/hsqldb-plugin.jar
 hsqldb-ds.xml –  jboss-6.1.0.Final/server/all/deploy/hsqldb-ds.xml

Vamos substituir o HSQLDB pelo MySQL 5, para isso devemos realizar o download do driver JDBC no seguinte endereço: http://www.mysql.com/downloads/connector/j/
Em seguida o driver JDBC deverá ser copiado para o diretório: jboss-6.1.0.Final/server/all/lib/

Agora o arquivo default-ds.xml deve ser criado com o conteúdo abaixo e  copiado para: jboss-6.1.0.Final/server/all/deploy

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
 <local-tx-datasource>
 <jndi-name>DefaultDS</jndi-name>
 <connection-url>jdbc:mysql://192.168.1.5:3306/authority</connection-url>
 <driver-class>com.mysql.jdbc.Driver</driver-class>
 <user-name>authority</user-name>
 <password>authsecret</password>
 <security-domain>DefaultDbRealm</security-domain>
 <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
 <metadata>
 <type-mapping>mySQL</type-mapping>
 </metadata>
 </local-tx-datasource>
</datasources>

Agora em jboss-6.1.0.Final/server/all/conf/login-config.xml, remover o application policy HsqlDbRealm e inserir:

<application-policy name="DefaultDbRealm">
<authentication>
 <login-module code="org.jboss.resource.security.ConfiguredIdentityLoginModule" flag="required">
 <module-option name="principal">authority</module-option>
 <module-option name="userName">authority</module-option>
 <module-option name="password">authsecret</module-option>
 <module-option name="managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
 </login-module>
</authentication>
</application-policy>

Ao inciar o JBoss, as tabelas HILOSEQUENCES, TIMERS, serão criadas no banco de dados configurado como Default.

Bom é isso, Abraços!

Fonte: http://community.jboss.org/wiki/RemoveHSQLDB