【发布时间】:2017-03-01 14:49:19
【问题描述】:
在这种情况下,我有以下代码将消息发送到远程 jms 提供程序(Tibco),我正在寻找将发送代码放入 Bean 托管事务或用户事务的解决方案,但不知道该怎么做.
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();
}
}
}
}
技术栈/背景:
Wildfly、CDI、Tibco ems 8.2 JMS 提供程序、Java8、使用 Standalone-full.xml,添加了用于消费消息的 genericra.rar 资源适配器文件,并且可以正常工作。用于消费消息的消息驱动 bean。
【问题讨论】:
-
您是在实际的 Java EE 服务器中运行,还是只是在一个服务容器(例如 Tomcat)中运行。前者容易,后者难
-
@SteveC 我在wildfly容器中使用它,它是j2ee
-
@SteveC 我已经用技术堆栈更新了这个问题。请看一下。谢谢。
标签: java jakarta-ee transactions jta