2017-03-01 1 views
0

J'ai le code suivant qui envoie des messages à un fournisseur jms distant (Tibco) dans ce cas, je cherche une solution pour mettre le code d'envoi dans une transaction gérée par Bean ou le usertransaction, mais je ne sais pas comment faire cela.Publier des messages au fournisseur TIBCO JMS distant dans la transaction

import java.util.Hashtable; 

import javax.annotation.Resource; 
import javax.inject.Singleton; 
import javax.jms.Queue; 
import javax.jms.QueueConnection; 
import javax.jms.QueueConnectionFactory; 
import javax.jms.QueueSender; 
import javax.jms.QueueSession; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.transaction.Transactional; 
import javax.transaction.Transactional.TxType; 
import javax.transaction.UserTransaction; 

@Singleton 
public class ServiceLayer implements IServiceLayer{ 

    public final static String JNDI_FACTORY = "com.tibco.tibjms.naming.TibjmsInitialContextFactory"; 
    public final static String PROVIDER_URL = "tcp://serverurl:7225"; 

    public final static String JMS_FACTORY = "XAQueueConnectionFactory"; 
    public final static String QUEUE = "Queue"; 

    @Resource 
    public UserTransaction utx; 

    public void sendMessage(String message) throws Exception { 
     Hashtable env = new Hashtable(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); 
     env.put(Context.PROVIDER_URL, PROVIDER_URL); 
     for (int i = 0; i < 1; i++) { 
      // Define queue 
      QueueSender qsender = null; 
      QueueSession qsession = null; 
      QueueConnection qcon = null; 
      try { 
       utx.begin(); 
       InitialContext ctx = new InitialContext(env); 

       QueueConnectionFactory qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); 
       qcon = qconFactory.createQueueConnection(); 

       qsession = qcon.createQueueSession(true, -1); 
       Queue queue = (Queue) ctx.lookup(QUEUE); 

       TextMessage msg = qsession.createTextMessage(); 
       msg.setText(message); 

       qsender = qsession.createSender(queue); 
       qsender.send(msg); 
       System.out.println("sleep 5 secs.." + message.toString()); 
       Thread.sleep(5000); 

       System.out.println("Message [" + msg.getText() + "] sent to Queue: " + QUEUE); 
//    qsession.commit(); 
       utx.commit(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } finally { 
       if (qsender != null) 
        qsender.close(); 
       if (qsession != null) 
        qsession.close(); 
       if (qcon != null) 
        qcon.close(); 
      } 
     } 
    } 
} 

pile Tech/fond:

wildfly, CDI, Tibco sme 8.2 fournisseur JMS, Java8, autonome utilisant-full.xml, Ajout genericra.rar fichier adaptateur de ressources pour consommer des messages et des œuvres . Beans pilotés par message pour la consommation de messages.

+0

Êtes-vous en cours d'exécution dans le serveur réel Java EE ou juste un conteneur de Servet (comme Tomcat par exemple). La réponse est facile pour le premier et difficile pour le dernier –

+0

@SteveC Je l'utilise dans un conteneur wildfly, c'est j2ee – Zeus

+0

@SteveC J'ai mis à jour la question avec la pile tech. S'il vous plaît, jetez un oeil. Je vous remercie. – Zeus

Répondre

1

J'ai trouvé la solution. heureusement, j'avais déjà le genericra.rar installé sur la wildfly. Donc, c'était un morceau de gâteau pour moi. Le nom jndi GenericJmsXA se trouve dans les paramètres de l'adaptateur de ressources.

@Singleton 
@Transactional(value = TxType.REQUIRES_NEW) 
public class ServiceLayer implements IServiceLayer { 

    @Resource(mappedName="GenericJmsXA") 
    public ConnectionFactory queueFactory; 

    private String QUEUE = "Queue"; 


    public void sendMessage(String message) throws Exception { 

     MessageProducer qsender = null; 

     Session qsession = null; 

     Connection qcon = null; 

     try{  
      qcon = this.queueFactory.createConnection();  
      qsession = qcon.createSession(true, QueueSession.AUTO_ACKNOWLEDGE);  
      Queue q = qsession.createQueue(QUEUE);  
      qsender = qsession.createProducer(q);  
      TextMessage tm = qsession.createTextMessage(message);  
      System.out.println("Before sending to Queue: Waiting for 5 seconds. " + QUEUE);  
      qsender.send(tm);  
      Thread.sleep(5000);  
      System.out.println("Message [" + tm.getText() + "] sent to Queue: " + QUEUE); 
     }catch(Exception e){ 

      System.out.println("Exception : "+e.getMessage()); 

      e.printStackTrace(); 

     } 

} 

Paramètres de l'adaptateur de ressources Wildfly. La plupart des étapes sont précises ici: https://github.com/jms-ra/generic-jms-ra il suffit de les suivre et vous serez en mesure de faire fonctionner cela.

<subsystem xmlns="urn:jboss:domain:resource-adapters:4.0"> 
    <resource-adapters> 
     <resource-adapter> 
      <archive> 
       generic-jms-ra.rar 
      </archive> 
      <transaction-support>NoTransaction</transaction-support> 
      <connection-definitions> 
       <connection-definition class-name="org.jboss.resource.adapter.jms.JmsManagedConnectionFactory" jndi-name="java:/GenericJmsXA" enabled="true" use-java-context="true" pool-name="GenericJmsXA" use-ccm="true"> 
        <config-property name="JndiParameters"> 
         java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory;java.naming.provider.url=tcp://serverurl:7225 
        </config-property> 
        <config-property name="ConnectionFactory"> 
         XAQueueConnectionFactory 
        </config-property> 
        <pool> 
         <min-pool-size>0</min-pool-size> 
         <max-pool-size>10</max-pool-size> 
         <prefill>false</prefill> 
         <use-strict-min>false</use-strict-min> 
         <flush-strategy>FailingConnectionOnly</flush-strategy> 
        </pool> 
        <security> 
         <application></application> 
        </security> 
       </connection-definition> 
      </connection-definitions> 
     </resource-adapter> 
    </resource-adapters> 
</subsystem> 

Merci Justin pour me aider à ce sujet: https://developer.jboss.org/thread/274204