在事务中将消息发布到远程 TIBCO JMS 提供程序

Publish messages to remote TIBCO JMS provider in transaction

在这种情况下,我有以下代码将消息发送到远程 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();
            }
        }
    }
}

技术 stack/background:

Wildfly、CDI、Tibco ems 8.2 JMS 提供程序,Java8,使用 Standalone-full.xml,添加了 genericra.rar 资源适配器文件以使用消息并且有效。用于消费消息的消息驱动 bean。

我找到了解决方案。幸运的是,我已经在 wildfly 上安装了 genericra.rar。所以,这对我来说是小菜一碟。 GenericJmsXA jndi 名称在资源适配器设置上。

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

        }

}

Wildfly 资源适配器设置。此处的大多数步骤都是准确的:https://github.com/jms-ra/generic-jms-ra 只需按照这些步骤进行操作,您就可以使它正常工作。

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

感谢贾斯汀帮我解决这个问题:https://developer.jboss.org/thread/274204