2 Replies Latest reply on Oct 12, 2013 8:48 AM by lnoton

    JTDS deployment into Fuse.

    lnoton

      Hi,

       

      I'm having some difficulty registering a JDBC driver, JTDS into FUSE.

       

      routes.xml

       

        <bean id="myDS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

          <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"/>

          <property name="url" value="jdbc:jtds:sqlserver://?????;databaseName=?????;tds=8.0;lastupdatecount=true" />

          <property name="username" value="fuser" />

          <property name="password" value="fuser" />

        </bean>

       

      pom.xml

       

      <build>

          <plugins>

            <plugin>

              <groupId>org.apache.felix</groupId>

              <artifactId>maven-bundle-plugin</artifactId>

              <version>2.3.4</version>

              <extensions>true</extensions>

              <configuration>

                <instructions>

                  <Bundle-SymbolicName>rest.proxy</Bundle-SymbolicName>

                  <Require-Bundle>org.apache.cxf.bundle,org.apache.camel.camel-cxf,org.springframework.beans</Require-Bundle>

                  <Import-Package>net.sourceforge.jtds.jdbc,*</Import-Package>

                </instructions>

              </configuration>

            </plugin>

          </plugins>

        </build>

       

       

      Fuse commands run to install drivers;

       

      osgi:install -s wrap:mvn:net.sourceforge/jtds/1.3.1

       

      osgi:install -s wrap:mvn:jcifs/jcifs/1.3.17

       

      If I show exports for jtds I get:

       

      JBossFuse:karaf@root> osgi:headers 278

       

       

      wrap_mvn_net.sourceforge_jtds_1.3.1 (278)

      -----------------------------------------

      Main-Class = net.sourceforge.jtds.jdbc.Driver

      Specification-Title = JDBC

      Tool = Bnd-0.0.357

      Specification-Version = 3.0

      Implementation-Version = 1.3.1

      Generated-By-Ops4j-Pax-From = wrap:mvn:net.sourceforge/jtds/1.3.1

      Created-By = 1.7.0_25 (Oracle Corporation)

      Implementation-Title = jTDS JDBC Driver

      Manifest-Version = 1.0

      Bnd-LastModified = 1381480171800

      Implementation-URL = http://jtds.sourceforge.net

      Originally-Created-By = 1.7.0_21-b11 (Oracle Corporation)

      Ant-Version = Apache Ant 1.8.2

       

       

      Bundle-Name = wrap_mvn_net.sourceforge_jtds_1.3.1

      Bundle-SymbolicName = wrap_mvn_net.sourceforge_jtds_1.3.1

      Bundle-Version = 0

      Bundle-ManifestVersion = 2

       

       

      Import-Package =

              javax.crypto;resolution:=optional,

              javax.crypto.spec;resolution:=optional,

              javax.naming;resolution:=optional,

              javax.naming.spi;resolution:=optional,

              javax.net;resolution:=optional,

              javax.net.ssl;resolution:=optional,

              javax.sql;resolution:=optional,

              javax.transaction.xa;resolution:=optional,

              jcifs;resolution:=optional,

              jcifs.smb;resolution:=optional,

              net.sourceforge.jtds.jdbc;resolution:=optional,

              net.sourceforge.jtds.jdbc.cache;resolution:=optional,

              net.sourceforge.jtds.jdbcx;resolution:=optional,

              net.sourceforge.jtds.jdbcx.proxy;resolution:=optional,

              net.sourceforge.jtds.ssl;resolution:=optional,

              net.sourceforge.jtds.util;resolution:=optional,

              org.ietf.jgss;resolution:=optional

      Export-Package =

              net.sourceforge.jtds.jdbc;

                      uses:="net.sourceforge.jtds.util,

                              net.sourceforge.jtds.jdbc.cache,

                              jcifs.smb,

                              jcifs,

                              javax.net,

                              net.sourceforge.jtds.ssl,

                              org.ietf.jgss,

                              net.sourceforge.jtds.jdbcx,

                              javax.transaction.xa",

              net.sourceforge.jtds.jdbc.cache;uses:=net.sourceforge.jtds.jdbc,

              net.sourceforge.jtds.jdbcx;

                      uses:="javax.naming,

                              javax.sql,

                              net.sourceforge.jtds.util,

                              net.sourceforge.jtds.jdbc,

                              javax.naming.spi,

                              javax.transaction.xa,

                              net.sourceforge.jtds.jdbcx.proxy",

              net.sourceforge.jtds.jdbcx.proxy;uses:="net.sourceforge.jtds.jdbc,net.sourceforge.jtds.jdbcx",

              net.sourceforge.jtds.ssl;uses:="javax.net.ssl,javax.net,net.sourceforge.jtds.util",

              net.sourceforge.jtds.util;uses:="net.sourceforge.jtds.jdbc,javax.crypto.spec,javax.crypto"

       

      And for JCIFS, which is required by JTDS

       

      JBossFuse:karaf@root> osgi:headers 283

       

       

      wrap_mvn_jcifs_jcifs_1.3.17 (283)

      ---------------------------------

      Manifest-Version = 1.0

      Bnd-LastModified = 1381486791455

      Archiver-Version = Plexus Archiver

      Tool = Bnd-0.0.357

      Originally-Created-By = Apache Maven

      Built-By = ajvanerp

      Generated-By-Ops4j-Pax-From = wrap:mvn:jcifs/jcifs/1.3.17

      Build-Jdk = 1.6.0_29

      Created-By = 1.7.0_25 (Oracle Corporation)

       

       

      Bundle-Name = wrap_mvn_jcifs_jcifs_1.3.17

      Bundle-SymbolicName = wrap_mvn_jcifs_jcifs_1.3.17

      Bundle-Version = 0

      Bundle-ManifestVersion = 2

       

       

      Import-Package =

              javax.servlet;resolution:=optional,

              javax.servlet.http;resolution:=optional,

              jcifs;resolution:=optional,

              jcifs.dcerpc;resolution:=optional,

              jcifs.dcerpc.msrpc;resolution:=optional,

              jcifs.dcerpc.ndr;resolution:=optional,

              jcifs.http;resolution:=optional,

              jcifs.https;resolution:=optional,

              jcifs.netbios;resolution:=optional,

              jcifs.ntlmssp;resolution:=optional,

              jcifs.smb;resolution:=optional,

              jcifs.util;resolution:=optional,

              jcifs.util.transport;resolution:=optional

      Export-Package =

              jcifs;uses:="jcifs.util,jcifs.netbios",

              jcifs.dcerpc;uses:="jcifs.util,jcifs.dcerpc.ndr,jcifs.dcerpc.msrpc,jcifs.smb",

              jcifs.dcerpc.msrpc;uses:="jcifs.smb,jcifs.dcerpc,jcifs.dcerpc.ndr",

              jcifs.dcerpc.ndr;uses:=jcifs.util,

              jcifs.http;uses:="javax.servlet,jcifs.util,jcifs.smb,jcifs,jcifs.netbios,javax.servlet.http,jcifs.ntlmssp",

              jcifs.https;uses:=jcifs.http,

              jcifs.netbios;uses:="jcifs.util,jcifs.smb,jcifs",

              jcifs.ntlmssp;uses:="jcifs,jcifs.util,jcifs.netbios,jcifs.smb",

              jcifs.smb;uses:="jcifs.util,jcifs,jcifs.ntlmssp,jcifs.dcerpc.msrpc,jcifs.dcerpc.ndr,jcifs.dcerpc,jcifs.util.transport,jcifs.netbios",

              jcifs.util,

              jcifs.util.transport;uses:=jcifs.util

       

       

      Now, for my bundle that I have deployed I have listed the imports, (I've hightlighted the import of JTDS, so, this has come from the POM setting):

       

       

      JBossFuse:karaf@root> packages:imports 282

      System Bundle (0): javax.xml.bind.annotation; version=2.2.1

      Spring Beans (105): org.springframework.beans; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.annotation; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.factory; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.factory.access; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.factory.access.el; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.factory.annotation; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.factory.config; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.factory.parsing; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.factory.serviceloader; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.factory.support; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.factory.wiring; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.factory.xml; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.propertyeditors; version=3.1.3.RELEASE

      Spring Beans (105): org.springframework.beans.support; version=3.1.3.RELEASE

      activemq-osgi (114): org.apache.activemq.camel.component; version=5.8.0.redhat-60024

      camel-core (130): org.apache.camel; version=2.10.0.redhat-60024

      Apache ServiceMix :: Specs :: JSR-311 API 1.1.1 (145): javax.ws.rs; version=1.1.1

      camel-cxf (194): org.apache.camel.component.cxf; version=2.10.0.redhat-60024

      camel-cxf (194): org.apache.camel.component.cxf.blueprint; version=2.10.0.redhat-60024

      camel-cxf (194): org.apache.camel.component.cxf.converter; version=2.10.0.redhat-60024

      camel-cxf (194): org.apache.camel.component.cxf.cxfbean; version=2.10.0.redhat-60024

      camel-cxf (194): org.apache.camel.component.cxf.feature; version=2.10.0.redhat-60024

      camel-cxf (194): org.apache.camel.component.cxf.interceptors; version=2.10.0.redhat-60024

      camel-cxf (194): org.apache.camel.component.cxf.jaxrs; version=2.10.0.redhat-60024

      camel-cxf (194): org.apache.camel.component.cxf.spring; version=2.10.0.redhat-60024

      camel-cxf (194): org.apache.camel.component.cxf.util; version=2.10.0.redhat-60024

      Spring JDBC (244): org.springframework.jdbc.datasource; version=3.1.3.RELEASE

      camel-sql (245): org.apache.camel.component.sql; version=2.10.0.redhat-60024

      wrap_mvn_net.sourceforge_jtds_1.3.1 (278): net.sourceforge.jtds.jdbc; version=0.0.0

       

       

       

      My bundle deploys fine:

      [ 282] [Active     ] [            ] [Started] [   60] rest.proxy (0.0.1.SNAPSHOT)

       

       

      But when I hit the rest proxy exposed by Camel (JAX-RS consumer) it has to make a a database lookup.  I get this error:

       

      Caused by: java.sql.SQLException: No suitable driver found for jdbc:jtds:sqlserver://?????;databaseName=?????;tds=8.0;lastupdatecount=true

       

       

      Now, I'm no expert on OSGI, having used it in the past a little for not for a while.  I cannot see anything obvious to what I'm doing wrong.

       

      I've gone through some earlier errors and fixed them by making sure the JARs export the right packages, and the Import package is put in on my Bundle.

       

      Any help much appreciated.

        • 1. Re: JTDS deployment into Fuse.
          ffang

          Hi,

           

          This culprit  the Class.forName doesn't work well in OSGi container, unfortunately Class.forName is popularly used when load JDBC drivers, please take a look at my blog[1] to get more details and find the solution there.

           

          [1]http://freemanfang.blogspot.com/2012/03/how-to-use-jdbc-driver-in-osgi.html

           

          Freeman

          1 of 1 people found this helpful
          • 2. Re: JTDS deployment into Fuse.
            lnoton

            I had a break through about an hour after posting.

             

            Direct JDBC code within my bundle worked fine.  So that was promising, something can see the osgi wrapped JDBC sql server JAR.

             

            What I realised, was that it was the Spring JDBC included within Fuse that couldn't see the SQL Server JDBC jar.

             

            So, to try and get Spring talking to the driver, I deployed a Fragmented Host bundle with the following in the POM:

             

            <Fragment-Host>org.springframework.jdbc</Fragment-Host>

            <Import-Package>com.microsoft.sqlserver.jdbc</Import-Package>

             

            Deploying that took a while actually.  It is basically updating the spring-jdbc host to be aware of the new import available so it can use the driver.

             

            Doing that solved everything.

             

            I redeployed my bundle and away it went and worked.

             

            I guess the important learning for me here is how to make implementation libraries (such as JDBC) available to libraries already shipped within Fuse.  JDBC maybe just one of many in the future I guess.