Translate

Mostrando entradas con la etiqueta jboss. Mostrar todas las entradas
Mostrando entradas con la etiqueta jboss. Mostrar todas las entradas

miércoles, 18 de enero de 2017

Jboss datasources: how to set autocommit to false by default with example

Como cambiar el valor de autocommit  en los data sources de JBOSS  EAP 6.4 con ejemplo práctico:

In this post i´m going to resolve a problem with the jboss datasources, when you open a connection and get it throught a jboss datasource the autocommit mode is setted to true by default.

When you develop a new application where you can control all your code it is not a problem, but when you have  inherited code that you cant change it, for example in a migration from a weblogic to a jboss server it could be a real problem


In my case I had java code inherited from weblogic and in some place of the code i was suffering problems with the autocommit state of my jdbc connection. I could not do commit or rollback becasuse the autocommit was setted to true, and it throw the next exception

java.slq.SQLException: you cannot rollback with autocommit set!

This is because in weblogic 10.3 the jdbc connections have a extrange behavior because if you try to do a rollback with autocommit = true it has no effect butit doesn´t thow an exception. When you migrate this code to Jboss is a real problem that you have to handle.

In order to find a solution I have debugged the inherited code to looking for the classes that has been used to get the datasource connection. I found that the datasource class is WrapperDataSource 



In my case the solution was to create a Wrapper of the class WrapperDataSource in order to add the code to setAutoCommit(false) in the  getConnetion methods, in order to get the connection with autocommit setted to false by default, when the application instace a jdbc connection from Jboss server.


To do this we need to create a java project with the sources and the compiled classes of the this jar: ironjacamar-jdbc-1.0.31.Final-redhat-1.jar in order to modify and compile the WrapperDataSource class. This is the class that Jboss uses to create a new JDBC connection.

You can find this sources in the nex  link or in my github repository in the lib folder.

https://maven.repository.redhat.com/techpreview/all/org/jboss/ironjacamar/ironjacamar-jdbc/1.0.31.Final-redhat-1/

Also we need some jars in order to compile the WrapperDataSource class, the jars are those:

  • ironjacamar-core-api-1.0.31.Final-redhat-1.jar
  • ironjacamar-jdbc-1.0.31.Final-redhat-1.jar
  • jboss-connector-api_1.6_spec-1.0.1.Final-redhat-3.jar
  • jboss-logging-3.1.4.GA-redhat-2.jar
  • jboss-transaction-api_1.1_spec-1.0.1.Final-redhat-3.jar


All jars are in the Jbos EAP 6.4 distribution or in my github repository code too.

https://developers.redhat.com/products/eap/download/



Now in the java project with all the jars (added to the poject build path) and the source files we can make the modification that we need. We only need to create the package org.jboss.jca.adapters.jdbc and copy the class WrapperDataSource.java from the source files into it. If you need to modify more classes take it from the source code, copy in the project and modify it.



Next step is to look up the getConnection Methods and add the setAutocommit(false), after the connection creation,


Be carefull because in this version exists two getConnection methods and i have to modify both.

In next step you have to compile this class and mix with the original classes and create the new jar with my changes. In order to do this i have create an ant script (buidl.xml) into the ant folder which unzip the orginal, jar, compile the modified class and add to the new jar.

--

<?xml version="1.0"?>

<project name="WrapperDataSource" default="build" basedir=".">

 <property file="build.properties"/>
 
 
 <target name="clean" description="Deletes compiled and generated code">
         <delete dir="${build.dir}" />
 </target>
 
 <target name="build" depends="clean" description="build Wrapper">
  <mkdir dir="${build.dir}" />
  <unzip src="${build.dir}/../lib/ironjacamar-jdbc-1.0.31.Final-redhat-1.jar" dest="${build.dir}"/>
  <path id="lib.path.ref">
      <fileset dir="${lib.path.ref}" includes="*.jar"/>
  </path> 
  <javac srcdir="${source.dir}" destdir="${build.dir}" classpathref="lib.path.ref" target="1.6" 
 source="1.6" debug="true"/> <jar   destfile="${jar.dir}/${jar.name}"
         basedir="${build.dir}"         
  />
 </target></project>
--

To build the JAR with the new modified class, be sure to have Apache Ant installed, go to ant directory and execute the "ant" command.

The result shoud be:


The result is in the target/dist foder where you can find the new MyJbossWrapperDataSource.jar



Finally the last step consists in change the original ironjacamar-jdbc-1.0.31.Final-redhat-1.jar by the new MyJbossWrapperDataSource.jar modifiying the Jboss libray module.

To do this action you have to go to your JBOSS EAP6 installation and locate the next path:

[JBOSS_HOME]\modules\system\layers\base\org\jboss\ironjacamar\jdbcadapters\main\

Copy the new MyJbossWrapperDataSource.jar to this location



and modify the module.xml commenting the old jar file and adding the new MyJbossWrapperDataSource.jar

--
<module xmlns="urn:jboss:module:1.1" name="org.jboss.ironjacamar.jdbcadapters">
    <properties>
        <property name="jboss.api" value="private"/>
    </properties>

    <resources>
        <!--resource-root path="ironjacamar-jdbc-1.0.31.Final-redhat-1.jar"/>-->
        <resource-root path="MyJbossWrapperDataSource.jar"/>
        <!-- Insert resources here -->
    </resources>

    <dependencies>
        <module name="javax.api"/>
        <module name="javax.resource.api"/>
        <module name="javax.validation.api"/>
        <module name="org.hibernate.validator"/>
        <module name="org.jboss.as.naming"/>
        <module name="org.jboss.as.transactions"/>
        <module name="org.jboss.common-core"/>
        <module name="org.jboss.jboss-transaction-spi"/>
        <module name="org.jboss.ironjacamar.api"/>
        <module name="org.jboss.logging"/>
        <module name="org.jboss.threads"/>
        <module name="javax.xml.stream.api"/>
    </dependencies>
</module>

--

You can download my eclipse project from github in the next link, if you want to get the code with this change appied, or make more changes in your jboss datasource.

https://github.com/antuansoft/MyJbossWrapperDataSource

Happy Wrapping!!!


jueves, 15 de diciembre de 2016

Weblogic Jboss Migration issue 1: javax.naming.NameNotFoundException: env/jmx/runtime



Migración Weblogic - Jboss problema 1: obtener el Servidor MBeans


I my new job, we have to migrate original web applications deployed in a Weblogic 10.6.3 Application Server to Jboss EAP6 (Jboss AS7).

This post is about the first problem that i have found. The problem is how to instantate the MBeanServer object that containts all my beans.


The slice of code that instantate a the MBeanServer in weblogic is like that:

//Weblogic way
InitialContext ctx = new InitialContext();
this.mbs = ((MBeanServer)ctx.lookup("java:comp/env/jmx/runtime"));

If you deploy this code in a JBoss, the common error that appears in log is the next one:
javax.naming.NameNotFoundException: env/jmx/runtime

The way to solve this issue is change the context lookup for a FactoryManager 
to get the right MBeanServer.

//JBoss way
import java.lang.management.ManagementFactory;
//another code
//another code
//.....
this.mbs=ManagementFactory.getPlatformMBeanServer();

The good news is that this way works both in Jboss and Weblogic.


viernes, 24 de julio de 2015

X11 connection rejected because of wrong authentication

Esta vez me está tocando trabajar con sistemas un poco antiguos, aquí estamos utilizando un aplicación que WEB que está compilada con JDK1.5, y realizada con Spring y iBatis.

El servidor de aplicaciones es un JBOSS (jboss-4.2.3.GA) donde se carga el war de la aplicación, todo el frontal está hecho con jsf y richfaces. La aplicación está corriendo sobre Linux.¡

El problema que me ha pasado es que una vez delplegada la aplicación en el servidor JBOSS, todo ha ido perfectamente pero al poner en el navegador la URL de acceso a la aplicación esta no cargaba porque de repente el proceso java asociado al servidor de aplicaciones desaparecía.

El proceso de repente no estaba en el listado de procesos activos, y he intentado arreglarlo en principio comprobado que la memoria del proceso no era excesiva, y después ampliándola pero el proceso seguía igual.

Revisando los LOGS la única traza visible era:


18:51:15,521 INFO  [STDOUT] 16/07/2015 18:51:15 DEBUG (es.mi.sd.xxxxx.aspect.ServiceLoggerAspect)  - <<<<<<<<<<<<<<<<<
X11 connection rejected because of wrong authentication.

X connection to localhost:11.0 broken (explicit kill or server shutdown).


La manera de solucionarlo ha sido poner esta línea en los parámetros de arranque de JBOSS,

-Djava.awt.headless=true

Nuestro arranque ha quedado así:

JAVA_OPTS="-Xms512m -Xmx512m -XX:MaxPermSize=1024m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.awt.headless=true"


Ahora el procedimiento sigue vivo y no muere al cargar la primera página de la aplicación.

Referencias:

- Referencia 1