问题描述
有人为我提供了正确使用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();
}
}
这是非常的简单代码,没有真正的资源管理。在生产用例中,您希望使用池化连接工厂,这样就不会真正为收到的每条消息创建和关闭物理连接。