Wednesday, March 27, 2013

Configurar o DataSource do MySQL no JBoss AS 7

Nesse post descrevo os passos para realizar a configuração do DataSource do MySQL no JBoss Application Server 7.

Sobre o JBoss AS

O JBoss AS 7 é a versão mais recente do container Java EE mantindo pela Red Hat, trata-se da versão open source do projeto. A Red Hat também disponibiliza  o JBoss EAP 6, como um produto (suporte e treinamento). Ambas as versões 6 e 7, na teoria, contam com a mesma base de código e features.

O JBoss sofreu uma grande reestruturação, se compararmos com versões anteriores (4 e 5). Um novo mecanismo para definir e utilizar módulos, melhorias consideráveis na performance e na administração do servidor são algumas características do JBoss AS 7. As mudanças afetam a forma de administrar o servidor, um exemplo disso é a própria configuração do DataSource.

O JBoss AS pode ser operado em dois modos: managed domain aonde múltiplas instâncias ativas são orquestradas (controladas) por um ponto (host) central; a outra é a standalone aonde uma única instância do servidor é utilizada (parecido com as versões antigas). Nesse post eu utilizo o JBoss no modo standalone.

Instalar o driver do MySQL

Depois de baixar o driver JDBC do MySQL, é necessário instalar o driver como um módulo do JBoss. No diretório do JBoss, na pasta modules crie a estrutura de sub-pastas  \com\mysql\main, e copie o jar do driver dentro dessa pasta.


Nessa pasta, crie o arquivo module.xml, com o conteúdo a seguir:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-5.1.24-bin.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

Note a definição do nome do módulo com.mysql, na tag module de acordo com a estrutura de diretórios criada. A pasta main não é considerada, ela indica ao JBoss que essa é a versão principal do módulo. O JBoss permite a configuração de diferentes versões do mesmo módulo! Na tag resource-root indicamos o jar do MySQL contido no diretório main, que é justamente quem implementa o módulo. Outro detalhe são as dependências do módulo, definidas na tag dependencies.


Definir o DataSource

Uma vez que o módulo foi instalado, a próxima etapa é configurar o DataSource. Acesse o arquivo jboss7.../standalone/configuration/standalone.xml e adicione o conteúdo da tag datasource e driver, como a seguir:

<?xml version='1.0' encoding='UTF-8'?>
<server xmlns="urn:jboss:domain:1.2">
  ...
  <subsystem xmlns="urn:jboss:domain:datasources:1.0">
    <datasources>
      ...
      <datasource jndi-name="java:jboss/datasources/MysqlDS" 
        pool-name="MySqlDS" enabled="true" use-java-context="true">
        <!-- url jdbc -->
        <connection-url>jdbc:mysql://localhost:3306/db</connection-url>
        <!-- identificador do driver -->
        <driver>com.mysql</driver>

        <transaction-isolation>
          TRANSACTION_READ_COMMITTED
        </transaction-isolation>
        <pool>
          <min-pool-size>10</min-pool-size>
          <max-pool-size>100</max-pool-size>
          <prefill>true</prefill>
        </pool>

        <security>
          <user-name>root</user-name> <!-- usuario mysql -->
          <password>root</password> <!-- senha -->
        </security>
      </datasource>

      <drivers>
        ...
        <!-- definicao do driver -->
        <driver name="com.mysql" module="com.mysql">
          <xa-datasource-class>com.mysql.jdbc.Driver</xa-datasource-class>
        </driver>
      </drivers>
    </datasources>
  </subsystem>
  ...
</server>

Importante: Não remova nenhum conteúdo desse arquivo. Provalvemente já existe a configuração do driver e do datasource para o Hypersonic, um exemplo do JBoss. Mantenha essas configurações.

A tag driver indica que o módulo que nós acabamos de instalar, deve ser utilizado como um driver JDBC. Nela, indicamos qual é o nome do driver. Na outra tag driver, que fica dentro da definição do datasource, colocamos o nome do driver deve ser utilizado. O restante das tags indicam as informações de conexão com o MySQL e informações para criação do datasource (pool e transação).

Coloque o JBoss AS no ar, execute o arquivo jboss...\bin\standalone.sh (Windows standalone.bat). Verifique as informações do DataSource no log:

yaw@m21:/opt/jboss-as-7.1.1.Final/bin$./standalone.sh
=================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /opt/jboss-as-7.1.1.Final

  JAVA: /usr/lib/jvm/java-7-oracle/bin/java

  JAVA_OPTS:  -server -XX:+TieredCompilation -Xms64m -Xmx512m ...
=================================================================
00:30:55,948 INFO  [org.jboss.modules] JBoss Modules version 1.1.1.GA
00:30:56,105 INFO  [org.jboss.msc] JBoss MSC version 1.0.2.GA
00:30:56,149 INFO  [org.jboss.as] JBoss AS 7.1.1.Final "Brontes" starting
...

00:30:57,184 INFO  [org.jboss.as.connector.subsystems.datasources]
(ServerService Thread Pool -- 27) JBAS010404: Deploying non-JDBC-compliant 
driver class com.mysql.jdbc.Driver (version 5.1)

...

00:30:57,667 INFO  [org.jboss.as.connector.subsystems.datasources] 
(MSC service thread 1-4) JBAS010400: 
Bound data source [java:jboss/datasources/MysqlDS]

...

Agora você pode desenvolver aplicações Java EE com JBoss e MySQL, através desse DataSource. Veja como seria o persistence.xml (JPA) para utilizar esse datasource:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="appUnit">
    <!-- jndi-name -->
    <jta-data-source>java:jboss/datasources/MysqlDS</jta-data-source>
    <properties>
      <property name="hibernate.dialect" 
        value="org.hibernate.dialect.MySQLDialect"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="hibernate.connection.charSet" value="UTF-8"/>
    </properties>
  </persistence-unit>
</persistence>


http://twitter.com/edermag
http://www.yaw.com.br


Saturday, March 09, 2013

Configurar um projeto web c/ JSF 2 no Maven

Mais um post relacionado a Maven, agora para quem pretende desenvolver um aplicação JSF.


A seguir um pedaço (principal) do pom.xml que define as dependências necessárias para utilizar o JSF 2.1:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>br.com.yaw</groupId>
  <artifactId>exemplo-jsf-maven</artifactId>
  <packaging>war</packaging>
  <version>1.0</version>
  <name>exemplo-jsf-maven</name>

  <dependencies>
    <!-- JSF 2 -->
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-api</artifactId>
      <version>2.1.11</version>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-impl</artifactId>
      <version>2.1.11</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>

    <!-- EL -->
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>el-impl</artifactId>
      <version>2.2</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Pronto!

http://twitter.com/edermag
http://www.yaw.com.br