如何使用oracle.tip.adapter.jms.JmsConnectionFactory;

问题描述

有人为我提供了正确使用oracle.tip.adapter.jms.JmsConnectionFactory代码示例。 这是用于通过Weblogic 12C中的JMSAdapter使用JMS的连接工厂。 Weblogic12С通过JMSAdapter连接到独立的ActiveMQ服务器。在JMSAdapter中,我使用oracle.tip.adapter.jms.IJmsConnectionFactory(接口)下的jndi eis / ext / open创建了新的出站连接,具有以下属性

AckNowledgeMode = AUTO_ACKNowLEDGE
ConnectionFactoryLocation = org.apache.activemq.ActiveMQConnectionFactory
FactoryProperties = brockerURL=tcp://host:port;ThirdPartyJMSProvider=true
public class CustomJMSSelector {

    private final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";
    private final static String JMS_FACTORY="eis/ext/open";
    private static JmsConnectionFactory jmsConnectionFactory;


    public static byte[] customSelectorConsumer(String correlationId) throws NamingException,ResourceException {

        Hashtable env = new Hashtable();

        env.put(Context.INITIAL_CONTEXT_FACTORY,JNDI_FACTORY);
        Context ctx = new InitialContext(env);

        jmsConnectionFactory = (JmsConnectionFactory) ctx.lookup(JMS_FACTORY);

我需要使用oracle.tip.adapter.jms.JmsConnectionFactory从队列中创建会话,消费者和消费消息。

不幸的是,oracle.tip.adapter.jms.JmsConnectionFactory没有实现javax.jms.ConnectionFactory。它实现了扩展了oracle.tip.adapter.api.OracleConnectionFactory的oracle.tip.adapter.jms.IJmsConnectionFactory。我尝试将其强制转换为javax.jms.Connection或org.apache.activemq.ActiveMQConnectionFactory,但遇到类强制转换异常。此连接由osb使用(代理服务,业务服务)

解决方法

假设oracle.tip.adapter.jms.JmsConnectionFactory实现了javax.jms.ConnectionFactory,您可以像这样简单地创建连接,会话和使用者:

import javax.jms.Connection;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
...

public class CustomJMSSelector {

    private final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";
    private final static String JMS_FACTORY="eis/ext/open";
    private final static String QUEUE_JNDI_NAME="queue/jndi/name";  // the JNDI name of the queue
    private static ConnectionFactory jmsConnectionFactory;


    public static byte[] customSelectorConsumer(String correlationId) throws NamingException,ResourceException {
        Hashtable env = new Hashtable();

        env.put(Context.INITIAL_CONTEXT_FACTORY,JNDI_FACTORY);
        Context ctx = new InitialContext(env);

        jmsConnectionFactory = (JmsConnectionFactory) ctx.lookup(JMS_FACTORY);
        Queue queue = (Queue) ctx.lookup(QUEUE_JNDI_NAME);

        Connection connection = jmsConnectionFactory.createConnection();
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        MessageConsumer consumer = session.createConsumer(queue);
        Message message = consumer.receive();
        // do something with the message
        connection.close();
    }
}

这是非常的简单代码,没有真正的资源管理。在生产用例中,您希望使用池化连接工厂,这样就不会真正为收到的每条消息创建和关闭物理连接。