2017-03-01 2 views
0

Ich habe den folgenden Code, der Nachrichten an einen Remote-JMS-Provider (Tibco) sendet, in diesem Fall suche ich nach einer Lösung, den sendenden Code in eine Bean-gesteuerte Transaktion oder die Usertransaction, aber nicht sicher, wie das geht.Veröffentlichen Nachrichten an Remote-TIBCO JMS-Provider in Transaktion

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(); 
      } 
     } 
    } 
} 

Tech Stapel/Hintergrund:

Wildfly, CDI, Tibco EMS 8.2 JMS-Provider, Java8, Am Standalone-full.xml, hinzugefügt genericra.rar Ressourcenadapter Datei für Nachrichten raubend und dass Werke . Message-driven Beans für den Nachrichtenkonsum.

+0

Sind Sie mit aktuellem Java EE-Server oder nur einen servet Container (wie Tomcat zum Beispiel). Die Antwort ist einfach für die ehemalige und schwer für die letztere –

+0

@SteveC Ich benutze es in Wildfly Container, es ist j2ee – Zeus

+0

@SteveC Ich habe die Frage mit dem Tech-Stack aktualisiert. Bitte schau es dir an. Danke. – Zeus

Antwort

1

Ich fand die Lösung. Zum Glück hatte ich bereits die genericra.rar auf der Wildfliege installiert. Also, das war ein Stück Kuchen für mich. Der Name des GenericJmsXA-Jndi steht in den Einstellungen für den Ressourcenadapter.

Wildfly Ressourcenadaptereinstellungen. Die meisten Schritte sind genau hier: https://github.com/jms-ra/generic-jms-ra folgen Sie ihnen einfach und Sie werden es zur Arbeit bringen können.

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

Dank Justin für mich auf diese helfen: https://developer.jboss.org/thread/274204

Verwandte Themen