Overview
* Setup Oracle AQ in Oracle database.
* Setup data source in data-sources.xml file.
* Setup resource provider in orion-application.xml.
* Setup logical JNDI names for JMS connection factories and destinations in web.xml file.
– Use <resource-ref> for connection factories.
– Use <resource-env-ref> for destinations.
* Map logical JNDI names to actual JNDI names in orion-web.xml file.
* Package into EAR file and deploy to OC4J.
Setup Oracle AQ
* See this post for details.
Setup data source
* Add to EAR data-sources.xml
<managed-data-source login-timeout='-1' connection-pool-name='MyAQUserDSPool' jndi-name='jdbc/xa/MyAQUserDS' name='MyAQUserDS' tx-level='global' manage-local-transactions='false'/> <connection-pool name='MyAQUserDSPool'> <connection-factory factory-class='oracle.jdbc.pool.OracleDataSource' user='MyAQUser' password='MyAQUserPass' url='jdbc:oracle:thin:@localhost:1521:orcl'> <proxy-interface sql-object='Connection' interface='oracle.jdbc.internal.OracleConnection'/> <proxy-interface sql-object='Statement' interface='oracle.jdbc.OracleStatement'/> <proxy-interface sql-object='CallableStatement' interface='oracle.jdbc.OracleCallableStatement'/> <proxy-interface sql-object='PreparedStatement' interface='oracle.jdbc.OraclePreparedStatement'/> <proxy-interface sql-object='ResultSet' interface='oracle.jdbc.OracleResultSet'/> </connection-factory> </connection-pool>
Setup Resource Provider
* Add to EAR orion-application.xml
<data-sources path="./data-sources.xml"/> <resource-provider class="oracle.jms.OjmsContext" name="MyAQJMSResourceProvider"> <property name="datasource" value="jdbc/xa/MyAQUserDS"/> </resource-provider>
Setup Logical JNDI Names
* Add to WAR web.xml. Make sure to use resource-ref for connection factories and resource-env-ref for destinations.
<resource-ref> <res-ref-name>jms/TopicConnectionFactory</res-ref-name> <res-type>javax.jms.TopicConnectionFactory</res-type> <res-auth>Container</res-auth> </resource-ref> <resource-env-ref> <resource-env-ref-name>jms/sensorConfigTopic</resource-env-ref-name> <resource-env-ref-type>javax.jms.Topic</resource-env-ref-type> </resource-env-ref>
Map Logical JNDI Names
* Add to orion-web.xml. Make sure to use resource-ref-mapping for connection factories and resource-env-ref-mapping for destinations.
<resource-ref-mapping name="jms/TopicConnectionFactory" location="java:comp/resource/MyAQJMSResourceProvider/TopicConnectionFactories/MyTCF"/> <resource-env-ref-mapping name="jms/sensorConfigTopic" location="java:comp/resource/MyAQJMSResourceProvider/Topics/MyAQUser.TEST_TOPIC"/>
Package into EAR File and Deploy to OC4J Container
Sample Code
* Sample code to receive message from an AQ topic.
import javax.jms.JMSException;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.log4j.Logger;
public class JMSUtil {
static Logger log = Logger.getLogger(JMSUtil.class.getName());
private static final String TOPIC_CONN_FACTORY =
"java:comp/env/jms/TopicConnectionFactory";
private static final String TEST_TOPIC =
"java:comp/env/jms/TestTopic";
public static void main(String[] args) {
JMSUtil util = new JMSUtil();
TextMessage tm;
try {
tm = util.receiveTest("testId");
} catch (JMSException e) {
log.error(e);
} catch (NamingException e) {
log.error(e);
}
}
public TextMessage receiveTest(String subscriberID)
throws NamingException, JMSException {
log.debug("============================");
log.debug("Start receiveTest...");
log.debug("============================");
Context ctx = null;
TopicConnectionFactory tcf = null;
TopicConnection conn = null;
Topic topic = null;
TextMessage msg = null;
TopicSession session = null;
TopicSubscriber sub = null;
try {
ctx = new InitialContext();
log.debug("got InitialContext.");
tcf =
(TopicConnectionFactory)ctx.lookup(TOPIC_CONN_FACTORY);
log.debug("got TopicConnectionFactory.");
conn = tcf.createTopicConnection();
log.debug("got conn.");
topic = (Topic)ctx.lookup(TEST_TOPIC);
log.debug("got topic.");
session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
conn.start();
log.debug("strated conn.");
sub = session.createDurableSubscriber(topic, subscriberID);
msg = (TextMessage)sub.receive(5000);
if (msg != null){
log.debug(msg.getText());
} else {
log.debug("No message");
}
} finally {
if (sub != null)
sub.close();
if (session != null)
session.close();
if (conn != null)
conn.close();
}
log.debug("done.");
return msg;
}
}