JBoss AS 7 : org.omg.CORBA (SUN)

JBoss AS 7 est fourni avec un module nommé JacORB qui est une librairie standard repackagée par JBoss afin d’exploiter les services CORBA. Ce module possède sa propre implémentation du client CORBA mais rédéfini aussi les interfaces de cette implémentation à savoir le package org.omg.CORBA.* présent au sein de la JRE.

Le problème se pose quand (comme dans mon cas) il faut pouvoir exploiter l’implémentation CORBA d’origine de la part de SUN, par incompabilité par exemple. Normalement il faut, pour cela, définir une propriété système ayant pour clé « org.omg.CORBA.ORBClass » et pour valeur la classe implémentant CORBA (et qui doit étendre la classe org.omg.CORBA.ORB).

A priori, avec JBoss AS 7, tant que le module JacORB n’est pas défini comme dépendance par une application (par exemple via un fichier jboss-deployment-structure.xml) les classes de ce module ne sont pas chargée (pour l’application). Cela est vrai pour les classes org.jacorb.* MAIS cela n’est pas vrai pour les classes org.omg.CORBA.* qui sont quand même chargée pour l’application et cela même en excluant explicitement le module org.jacorb.

Ainsi en effectuant le code suivant :

org.omg.CORBA.ORB.init(null, null)

La classe ORB possède un classLoader de type « ModuleClassLoader » issu … du module JacORB. OK … Je n’ai pas réussi à faire en sorte que la classe ORB soit bien celle du Sun (par exemple en excluant le mode « org.omg.api » au sein de mon application). La seule solution qui s’avère fonctionner (parmi tout ce que j’ai essayé) c’est de changer le classloader utilisé dans un nouveau thread : ce nouveau Thread va instancier la classe ORB (avec la bonne instanciation) rendant ensuite disponible la bonne classe aux autres Thread (?).

Voici le bout de code :

public class MyBusiness {
    private static boolean jboss7Init = false;

    /*
     * Initialisation du système PCRE pour JBoss AS 7
     */
    private static void initPCREforJBossAS7(final String serverName) throws Exception {
        final Exception[] threadException = new Exception[1];

        logger.info("Initialisation du système PCRE (CORBA) pour JBoss AS 7 (Serveur : "
            + serverName + ")");

        Thread t = new Thread() {
            public void run() {
                try {

                    ClassLoader cL = this.getContextClassLoader();
                    String cLName = cL.getClass().getName();

                    try {
                        if (cLName.equals("org.jboss.modules.ModuleClassLoader")) {
                            // C'est un class loader de JBoss AS 7 qui peut, pour la classe
                            // omg.org.CORBA.ORB, l'instancier vis à vis de son propre module
                            // org.jacorb. Pour éviter cela on utilise un classLoader supérieur
                            // à celui du module
                            Thread.currentThread().setContextClassLoader(cL.getParent());
                        }

                        PCREApplicationClient client = new PCREApplicationClient("SILVERPROD02");

                        client.Connect();

                        logger.info("Connecté au serveur PCRE (" + serverName +
                            ") : version = " + client.getServer().GetVersion());

                        client.Disconnect();

                    }
                    finally {
                        Thread.currentThread().setContextClassLoader(cL);
                    }
                } catch (Exception e) {
                    threadException[0] = e;
                }
            }
        };

        t.start();
        t.join();

        if (threadException[0] != null)
            throw threadException[0];
    }

    private void openClient() throws PCREClientError {
        if (this.getClass().getClassLoader().getClass().getName().equals(
            "org.jboss.modules.ModuleClassLoader")) {
            if (!jboss7Init) {
                jboss7Init = true;
                try {
                    initPCREforJBossAS7(serverName);
                } catch (Exception e) {
                    e.printStackTrace();

                    throw new PCREClientError(e.getMessage());
                }
            }
        }

        client = new PCREApplicationClient(serverName);
    }

    public void doBusiness() {
        openClient();

        ...
    }
}

Evidemment ce code est absolument affreux mais est, pour l’instant, une solution de secours pour avoir au moins UNE solution qui fonctionne.

A noter que dans le cas ci-dessus il s’agit d’une librairie « PCRE » qui est utilisé pour se connecter à un serveur Parallel Crystal (aka Crystal Report 7). La librairie « PCRE » effectue un ORB.init(null, null) et est configurée en tant que module :

 <?xml version="1.0" encoding="UTF-8"?>


<module xmlns="urn:jboss:module:1.1" name="com.dynalivery.pcre">
    <properties>
        <property name="jboss.api" value="private"/>
    </properties>

    <resources>
        <resource-root path="PCREJavaClient.jar"/>
        <resource-root path="PCREJavaClient_SunStubs.jar" />
    </resources>

    <dependencies>
        <system>
            <paths>
                <path name="com/sun/corba/se/impl/orb" />
                <path name="org/omg/CORBA" />
                <path name="org/omg/CORBA/ContainedPackage" />
                <path name="org/omg/CORBA/ContainerPackage" />
                <path name="org/omg/CORBA/InterfaceDefPackage" />
                <path name="org/omg/CORBA/ORBPackage" />
                <path name="org/omg/CORBA/portable" />
                <path name="org/omg/CORBA/TypeCodePackage" />
                <path name="org/omg/CORBA/ValueDefPackage" />
                <path name="org/omg/CORBA/ValueDefPackage" />
                <path name="org/omg/CORBA_2_3" />
                <path name="org/omg/CORBA_2_3/portable" />
                <path name="javax/rmi/CORBA" />
            </paths>
        </system>
    </dependencies>
</module>

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s