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.
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 –
@SteveC Ich benutze es in Wildfly Container, es ist j2ee – Zeus
@SteveC Ich habe die Frage mit dem Tech-Stack aktualisiert. Bitte schau es dir an. Danke. – Zeus