24.10. Configurer un adaptateur de ressources JMS standard à utiliser avec un fournisseur JMS de tierce partie

Résumé

JBoss EAP 6 peut être configuré pour fonctionner avec des fournisseurs tiers de JMS, cependant tous les fournisseurs JMS ne produisent pas un adaptateur de ressources JMS JCA pour l'intégration avec les plateformes d'applications Java. Cette procédure couvre les étapes requises pour configurer l'adaptateur de ressources JMS générique inclus dans JBoss EAP 6 pour se connecter à un fournisseur JMS. Dans cette procédure, Tibco EMS 6.3 est utilisé comme un exemple de fournisseur JMS, mais d'autres fournisseurs JMS peuvent avoir besoin d'une configuration différente.

Important

L'adaptateur de ressources JMS JCA générique ne devrait servir que lorsqu'un fournisseur JMS ne fournit pas son propre adaptateur de ressources. Avant d'utiliser l'adaptateur de ressources JMS générique, vous devez d'abord vérifier auprès du fournisseur JMS pour savoir s'il possède son propre adaptateur de ressources qui puisse être utilisé avec JBoss EAP 6.
Conditions préalables

Cette procédure suppose qu'un serveur de fournisseur JMS est déjà configuré et prêt à l'emploi. Les binaires nécessaires à l'implémentation du fournisseur JMS seront nécessaires. Vous devez également connaître les valeurs des propriétés de fournisseur JMS suivantes :

  • PROVIDER_HOST:PROVIDER_PORT: le nom d'hôte et le numéro de port du serveur de fournisseur JMS.
  • PROVIDER_CONNECTION_FACTORY: le nom de l'usine de connexion déployée sur le serveur de fournisseur JMS. Doit être XA.
  • PROVIDER_QUEUE, PROVIDER_TOPIC: les noms des files d'attente et des sujets qui se trouvent sur le serveur de fournisseurs JMS qui doivent être utilisés.

Procédure 24.10. Configuration d'un adaptateur de ressources générique JMS

  1. Créer une implémentation ObjectFactory pour la liaison de files d'attentes et de sujets JNDI :
    1. En utilisant le code ci-dessous comme modèle, remplacer les informations serveur par les valeurs de serveur du fournisseur JMS.
      import java.util.Hashtable;
      import java.util.Properties;
       
      public class RemoteJMSObjectFactory implements ObjectFactory {
       
        private Context context = null;
       
        public RemoteJMSObjectFactory() {
        }
       
        public Object getObjectInstance(Object obj, Name name, Context nameCtx,
            Hashtable<?, ?> environment) throws Exception {
          try {
            String jndi = (String) obj;
       
            final Properties env = new Properties();
            env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.tibco.tibjms.naming.TibjmsInitialContextFactory");
            env.put(Context.URL_PKG_PREFIXES, "com.tibco.tibjms.naming");
            env.put(Context.PROVIDER_URL, "tcp://TIBCO_HOST:TIBCO_PORT");
       
            context = new InitialContext(env);
            Object o = context.lookup(jndi);
       
            return o;
          } catch (NamingException e) {
            e.printStackTrace();
            throw e;
          }
        }
      }
      
    2. Compiler le code ci-dessus, et sauvegarder le fichier de classe résultant dans un fichier JAR nommé remoteJMSObjectFactory.jar
  2. Créer un module genericjms pour votre instance JBoss EAP 6 :
    1. Créer la structure de répertoire suivante : EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
    2. Copier le fichier remoteJMSObjectFactory.jar dans EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
    3. Copier les binaires requis pour l'implémentation JMS du fournisseur dans EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main. Pour Tibco EMS, les binaires requis sont tibjms.jar et tibcrypt.jar du répertoire /lib de l'installation Tibco.
    4. Créer un fichier module.xml dans EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main comme ci-dessous, en énumérant les fichiers JAR des étapes précédentes comme ressources :
      <module xmlns="urn:jboss:module:1.1" name="org.jboss.genericjms.provider"> 
        <resources> 
            <resource-root path="tibjms.jar"/> 
            <resource-root path="tibcrypt.jar"/>
            <resource-root path="remoteJMSObjectFactory.jar"/>
        </resources> 
      
         <dependencies> 
            <module name="javax.api"/> 
            <module name="javax.jms.api"/> 
        </dependencies> 
      </module>
  3. Ajouter le module JMS générique comme une dépendance pour tous les déploiements en tant que modules globaux.

    Note

    Dans cette procédure, EAP_HOME/standalone/configuration/standalone-full.xml est utilisé comme fichier de configuration JBoss EAP 6.
    Dans EAP_HOME/standalone/configuration/standalone-full.xml, sous <subsystem xmlns="urn:jboss:domain:ee:1.1">,ajouter:
    <global-modules>
      <module name="org.jboss.genericjms.provider" slot="main"/>
      <module name="org.jboss.common-core" slot="main"/>
    </global-modules>
  4. Remplacer l'adaptateur de ressources HornetQ par défaut par l'adaptateur de ressources générique.
    Dans EAP_HOME/standalone/configuration/standalone-full.xml, remplacer <subsystem xmlns="urn:jboss:domain:ejb3:1.4"> <mdb>, par:
    <mdb>
      <resource-adapter-ref resource-adapter-name="org.jboss.genericjms"/>
      <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
    </mdb>
  5. Ajouter les liaisons pour vos files d'attente et sujets JMS en tant qu'objets selon les besoins.
    Dans EAP_HOME/standalone/configuration/standalone-full.xml, sous <subsystem xmlns="urn:jboss:domain:naming:1.3">, ajouter les liaisons, remplaçant PROVIDER_QUEUE et PROVIDER_TOPIC selon les besoins :
    <bindings>
      <object-factory name="PROVIDER_QUEUE" module="org.jboss.genericjms.provider" class="org.jboss.qa.RemoteJMSObjectFactory"/>
      <object-factory name="PROVIDER_TOPIC" module="org.jboss.genericjms.provider" class="org.jboss.qa.RemoteJMSObjectFactory"/>
    </bindings>
  6. Dans EAP_HOME/standalone/configuration/standalone-full.xml, ajouter la configuration d'adaptateur de ressources générique dans <subsystem xmlns="urn:jboss:domain:resource-adapters:1.1">.
    Remplacer PROVIDER_CONNECTION_FACTORY, PROVIDER_HOST, et PROVIDER_PORT par les valeurs du fournisseur JMS.
    <resource-adapters>
      <resource-adapter id="org.jboss.genericjms">
        <module slot="main" id="org.jboss.genericjms"/>
        <transaction-support>NoTransaction</transaction-support>
        <connection-definitions>
          <connection-definition class-name="org.jboss.resource.adapter.jms.JmsManagedConnectionFactory" jndi-name="java:/jms/PROVIDER_CONNECTION_FACTORY" pool-name="PROVIDER_CONNECTION_FACTORY">
            <config-property name="JndiParameters">
              java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory;java.naming.provider.url=tcp://PROVIDER_HOST:PROVIDER_PORT
            </config-property>
            <config-property name="ConnectionFactory">
              PROVIDER_CONNECTION_FACTORY
            </config-property>
            <security>
              <application/>
            </security>
          </connection-definition>
        </connection-definitions>
      </resource-adapter>
    </resource-adapters>
Résultat

L'adaptateur de ressources JMS est maintenant configuré et prêt à l'utilisation.

Quand on crée un nouveau message MDB (Message Driven Bean), il faut un code (ci-dessous) similaire pour utiliser l'adaptateur de ressources. Remplacer PROVIDER_CONNECTION_FACTORY, PROVIDER_HOST, et PROVIDER_PORT par les valeurs du fournisseur JMS.
En option, l'exemple ci-dessous configure également une connexion sécurisée pour Tibco EMS en spécifiant les propriétés d'utilisateur user et de mot de passe password (remplacer les valeurs de propriété en fonction des besoins).
@MessageDriven(activationConfig = { 
  @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
  @ActivationConfigProperty(propertyName = "jndiParameters", propertyValue = "java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory;java.naming.provider.url=tcp://PROVIDER_HOST:PROVIDER_PORT")
  @ActivationConfigProperty(propertyName = "destination", propertyValue = "PROVIDER_QUEUE"), 
  @ActivationConfigProperty(propertyName = "connectionFactory", propertyValue = "PROVIDER_CONNECTION_FACTORY"),
  @ActivationConfigProperty(propertyName = "user", propertyValue = "USER"),
  @ActivationConfigProperty(propertyName = "password", propertyValue = "PASSWORD"),
})

@ResourceAdapter("org.jboss.genericjms")
public class SampleMdb implements MessageListener { 
  @Override

    public void onMessage(Message message) { 
    
    } 

}