Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

22.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

Avant d'utiliser l'adaptateur de ressources JMS générique, vous devez d'abord vérifier auprès du fournisseur JMS pour savoir si ils ont leur propre adaptateur de ressources qui puisse être utilisé avec JBoss EAP 6. L'adaptateur de ressources JCA JMS ne doit être utilisé que lorsqu'un fournisseur JMS ne procure pas l'adptateur qui lui est propre.

Conditions préalables

  • Le serveur de l'adaptateur JMS est déjà configuré et prêt à l'utilisation. Il nous faudra tous les binaires utile à l'implémentation JMS du fournisseur.
  • Vous devrez également connaître les valeurs des propriétés suivantes du fournisseur JMS pour pouvoir chercher ses ressources JMS (usines de connexion, files d'attente, et topics)
    • java.naming.factory.initial
    • java.naming.provider.url
    • java.naming.factory.url.pkgs
    Dans l'exemple XML utilisé dans cette procédure, ces paramètres sont notés PROVIDER_FACTORY_INITIAL, PROVIDER_URL, and PROVIDER_CONNECTION_FACTORY respectivement. Remplir ces espaces réservés avec les valeurs du fournisseur JMS pour votre environnement.

Procédure 22.10. Configurer un adaptateur de ressources JMS standard à utiliser avec un fournisseur JMS de tierce partie

  1. Créer le module JBoss pour le fournisseur JMS

    Créer un module JBoss qui puisse contenir toutes les bibliothèques requises pour se connecter et communiquer avec le fournisseur JMS. Ce module sera nommé org.jboss.genericjms.provider.
    1. Créer la structure de répertoire suivante : EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main
    2. Copier les binaires requis pour l'implémentation JMS du fournisseur dans EAP_HOME/modules/system/layers/base/org/jboss/genericjms/provider/main.

      Note

      Pour Tibco EMS, les binaires requis sont tibjms.jar et tibcrypt.jar du répertoire lib de l'installation Tibco.
    3. 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> 
          <!-- all jars required by the JMS provider, in this case Tibco -->
          <resource-root path="tibjms.jar"/> 
          <resource-root path="tibcrypt.jar"/>
        </resources> 
        <dependencies> 
          <module name="javax.api"/> 
          <module name="javax.jms.api"/> 
        </dependencies> 
      </module>
  2. Configurer un contexte externe JNDI pour le fournisseur JMS

    Les ressources JMS (usines de connexion et destinations) sont vérifiées par le fournisseur JMS. Nous ajouterons un contexte externe dans l'instance JBoss EAP 6 pour que toute recherche locale de cette ressource puisse être conduite automatiquement dans le fournisseur JMS distant.

    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:naming:1.4">, ajouter :
    <bindings>
      <external-context name="java:global/remoteJMS/"
        module="org.jboss.genericjms.provider" 
        class="javax.naming.InitialContext">
        <environment>
          <property name="java.naming.factory.initial" value="${PROVIDER_FACTORY_INITIAL}"/>
          <property name="java.naming.provider.url" value="${PROVIDER_URL}"/>
          <property name="java.naming.factory.url.pkgs" value="${PROVIDER_URL_PKGS}"/>
        </environment>
      </external-context>
    </bindings>
    Les valeurs de ces trois propriétés doivent être remplacées par la bonne valeur pour pouvoir se connecter au fournisseur JMS distant. Veillez bien à garder ${} intact quand vous remplissez l'espace réservé.
  3. Activer la recherche par chaîne

    Il y a des fournisseurs JMS (comme EMS Tibco) qui ne prennent pas la méthode lookup(Name) de JNDI. Dans ces cas, ajouter à la propriété org.jboss.as.naming.lookup.by.string la valeur true pour régler ce problème.

    Exemple 22.2. Activer la recherche par chaîne dans EMS Tibco

    Voici une définition complète d'un contexte externe dans EMS Tibco.
    <bindings>
      <external-context name="java:global/remoteJMS/"
          module="org.jboss.genericjms.provider"
          class="javax.naming.InitialContext">
        <environment>
          <property name="java.naming.factory.initial" value="com.tibco.tibjms.naming.TibjmsInitialContextFactory"/>
          <property name="java.naming.provider.url" value="TIBCO_EMS_SERVER_HOST_NAME:PORT"/>
          <property name="java.naming.factory.url.pkgs" value="com.tibco.tibjms.naming"/>
          <property name="org.jboss.as.naming.lookup.by.string" value="true"/>
        </environment>
      </external-context>
    </bindings>
    Dans ce contexte externe, toute recherche JNDI vers une ressource commençant par java:global/remoteJMS/ sera effectuée sur le fournisseur JMS distant (après avoir supprimé le suffixe) java:global/remoteJMS/Queue1, le contexte externe se connectera au fournisseur JMS distant, et engagera la recherche pour la ressource Queue1.
  4. Configuration d'un adaptateur de ressources générique JMS

    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">.

    Exemple 22.3. Configuration de l'adaptateur de ressources EMS Tibco

    Voici une définition complète d'un adaptateur de ressource dans EMS Tibco.
    <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/XAQCF"
          pool-name="XAQCF">
          <config-property name="ConnectionFactory">
            XAQCF
          </config-property>
          <config-property name="JndiParameters">
      java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory;java.naming.provider.url=TIBCO_EMS_SERVER_HOST_NAME:PORT
          </config-property>
          <security>
            <application/>
          </security>
        </connection-definition>
      </connection-definitions>
    </resource-adapter>
  5. Configurer le pool de beans basés-messages par l'adaptateur de ressource standard.

    Dans EAP_HOME/standalone/configuration/standalone-full.xml, de <subsystem xmlns="urn:jboss:domain:ejb3:1.4">, mettez la configuration <mdb> à jour avec :
    <mdb>
      <resource-adapter-ref resource-adapter-name="org.jboss.genericjms"/>
      <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
    </mdb>
Résultat

L'adaptateur de ressources JMS standard est maintenant configuré et prêt à l'utilisation. Quand on crée un bean basé-message, utiliser un code qui ressemble à ceci pour pouvoir utiliser l'adaptateur de ressources.

@MessageDriven(name = "HelloWorldQueueMDB", activationConfig = {
      // The generic JMS resource adapter requires the JNDI bindings
      // for the actual remote connection factory and destination
      @ActivationConfigProperty(propertyName = "connectionFactory", propertyValue = "java:global/remoteJMS/XAQCF"),
      @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:global/remoteJMS/Queue1"),
      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
  public class HelloWorldQueueMDB implements MessageListener {
      public void onMessage(Message message) {
         // called every time a message is received from the `Queue1` queue on the JMS provider.
      }
  }
Vous pouvez également utiliser l'usine de connexions groupées de l'adaptateur de ressources.
@Resource(lookup = "java:/jms/XAQCF")
private ConnectionFactory cf;
Il n'est pas possible d'injecter directement une ressource d'un contexte externe, mais il est possible d'injecter un contexte externe, puis de faire une recherche. Par exemple, voici à quoi ressemble une recherche de file d'attente déployée dans un broker EMS Tibco.
@Resource(lookup = "java:global/remoteJMS")
private Context context;

...

Queue queue = (Queue) context.lookup("Queue1")