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.
Ê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 –
@SteveC Je l'utilise dans un conteneur wildfly, c'est j2ee – Zeus
@SteveC J'ai mis à jour la question avec la pile tech. S'il vous plaît, jetez un oeil. Je vous remercie. – Zeus