{"id":1734,"date":"2010-08-04T09:16:27","date_gmt":"2010-08-04T14:16:27","guid":{"rendered":"http:\/\/jianmingli.com\/wp\/?p=1734"},"modified":"2010-08-04T09:21:40","modified_gmt":"2010-08-04T14:21:40","slug":"access-aq-jms-destinations-from-oc4j-web-application","status":"publish","type":"post","link":"https:\/\/jianmingli.com\/wp\/?p=1734","title":{"rendered":"Access AQ JMS Destinations From OC4J Web Application"},"content":{"rendered":"<span id=\"Overview\"><h2>Overview<\/h2><\/span>\n<p>* Setup Oracle AQ in Oracle database.<br \/>\n* Setup data source in data-sources.xml file.<br \/>\n* Setup resource provider in orion-application.xml.<br \/>\n* Setup logical JNDI names for JMS connection factories and destinations in web.xml file.<br \/>\n&#8211; Use &lt;resource-ref&gt; for connection factories.<br \/>\n&#8211; Use &lt;resource-env-ref&gt; for destinations.<br \/>\n* Map logical JNDI names to actual JNDI names in orion-web.xml file.<br \/>\n* Package into EAR file and deploy to OC4J.<\/p>\n<span id=\"Setup_Oracle_AQ\"><h3>Setup Oracle AQ<\/h3><\/span>\n<p>* See <a href=\"?p=1591\">this post<\/a> for details.<\/p>\n<span id=\"Setup_data_source\"><h3>Setup data source<\/h3><\/span>\n<p>* Add to EAR data-sources.xml<\/p>\n<pre lang=\"xml\">\r\n<managed-data-source \r\n  login-timeout='-1'\r\n  connection-pool-name='MyAQUserDSPool'\r\n  jndi-name='jdbc\/xa\/MyAQUserDS'\r\n  name='MyAQUserDS'\r\n  tx-level='global'\r\n  manage-local-transactions='false'\/>\r\n\r\n<connection-pool name='MyAQUserDSPool'>\r\n  <connection-factory \r\n    factory-class='oracle.jdbc.pool.OracleDataSource'\r\n    user='MyAQUser'\r\n    password='MyAQUserPass'\r\n    url='jdbc:oracle:thin:@localhost:1521:orcl'>\r\n    <proxy-interface sql-object='Connection' \r\n      interface='oracle.jdbc.internal.OracleConnection'\/>\r\n    <proxy-interface sql-object='Statement' \r\n      interface='oracle.jdbc.OracleStatement'\/>\r\n    <proxy-interface sql-object='CallableStatement' \r\n      interface='oracle.jdbc.OracleCallableStatement'\/>\r\n    <proxy-interface sql-object='PreparedStatement' \r\n      interface='oracle.jdbc.OraclePreparedStatement'\/>\r\n    <proxy-interface sql-object='ResultSet' \r\n      interface='oracle.jdbc.OracleResultSet'\/>\r\n  <\/connection-factory>\r\n<\/connection-pool>\r\n<\/pre>\n<span id=\"Setup_Resource_Provider\"><h3>Setup Resource Provider<\/h3><\/span>\n<p>* Add to EAR orion-application.xml<\/p>\n<pre lang=\"xml\">\r\n<data-sources path=\".\/data-sources.xml\"\/>\r\n<resource-provider \r\n  class=\"oracle.jms.OjmsContext\" \r\n  name=\"MyAQJMSResourceProvider\">\r\n  <property name=\"datasource\" \r\n    value=\"jdbc\/xa\/MyAQUserDS\"\/>\r\n<\/resource-provider>\r\n<\/pre>\n<span id=\"Setup_Logical_JNDI_Names\"><h3>Setup Logical JNDI Names<\/h3><\/span>\n<p>* Add to WAR web.xml. Make sure to use resource-ref for connection factories and resource-env-ref for destinations.<\/p>\n<pre lang=\"xml\">\r\n<resource-ref>\r\n  <res-ref-name>jms\/TopicConnectionFactory<\/res-ref-name>\r\n  <res-type>javax.jms.TopicConnectionFactory<\/res-type>\r\n  <res-auth>Container<\/res-auth>\r\n<\/resource-ref>\r\n<resource-env-ref>\r\n  <resource-env-ref-name>jms\/sensorConfigTopic<\/resource-env-ref-name>\r\n  <resource-env-ref-type>javax.jms.Topic<\/resource-env-ref-type>\r\n<\/resource-env-ref>\r\n<\/pre>\n<span id=\"Map_Logical_JNDI_Names\"><h3>Map Logical JNDI Names<\/h3><\/span>\n<p>* Add to orion-web.xml. Make sure to use resource-ref-mapping for connection factories and resource-env-ref-mapping for destinations.<\/p>\n<pre lang=\"xml\">\r\n<resource-ref-mapping\r\n  name=\"jms\/TopicConnectionFactory\"\r\n  location=\"java:comp\/resource\/MyAQJMSResourceProvider\/TopicConnectionFactories\/MyTCF\"\/>\r\n\r\n<resource-env-ref-mapping\r\n  name=\"jms\/sensorConfigTopic\"\r\n  location=\"java:comp\/resource\/MyAQJMSResourceProvider\/Topics\/MyAQUser.TEST_TOPIC\"\/><\/pre>\n<span id=\"Package_into_EAR_File_and_Deploy_to_OC4J_Container\"><h3>Package into EAR File and Deploy to OC4J Container<\/h3><\/span>\n<span id=\"Sample_Code\"><h2>Sample Code<\/h2><\/span>\n<p>* Sample code to receive message from an AQ topic.<\/p>\n<pre lang=\"xml\">\r\nimport javax.jms.JMSException;\r\nimport javax.jms.TextMessage;\r\nimport javax.jms.Topic;\r\nimport javax.jms.TopicConnection;\r\nimport javax.jms.TopicConnectionFactory;\r\nimport javax.jms.TopicSession;\r\nimport javax.jms.TopicSubscriber;\r\n\r\nimport javax.naming.Context;\r\nimport javax.naming.InitialContext;\r\nimport javax.naming.NamingException;\r\n\r\nimport org.apache.log4j.Logger;\r\n\r\npublic class JMSUtil {\r\n  static Logger log = Logger.getLogger(JMSUtil.class.getName());\r\n  private static final String TOPIC_CONN_FACTORY =\r\n      \"java:comp\/env\/jms\/TopicConnectionFactory\";\r\n  private static final String TEST_TOPIC =\r\n      \"java:comp\/env\/jms\/TestTopic\";\r\n\r\n  public static void main(String[] args) {\r\n      JMSUtil util = new JMSUtil();\r\n\r\n      TextMessage tm;\r\n      try {\r\n          tm = util.receiveTest(\"testId\");\r\n      } catch (JMSException e) {\r\n          log.error(e);\r\n      } catch (NamingException e) {\r\n          log.error(e);\r\n      }\r\n  }\r\n\r\n  public TextMessage receiveTest(String subscriberID)\r\n      throws NamingException, JMSException {\r\n      log.debug(\"============================\");\r\n      log.debug(\"Start receiveTest...\");\r\n      log.debug(\"============================\");\r\n      Context ctx = null;\r\n      TopicConnectionFactory tcf = null;\r\n      TopicConnection conn = null;\r\n      Topic topic = null;\r\n      TextMessage msg = null;\r\n      TopicSession session = null;\r\n      TopicSubscriber sub = null;\r\n      try {\r\n          ctx = new InitialContext();\r\n          log.debug(\"got InitialContext.\");\r\n\r\n          tcf = \r\n              (TopicConnectionFactory)ctx.lookup(TOPIC_CONN_FACTORY);\r\n          log.debug(\"got TopicConnectionFactory.\");\r\n          conn = tcf.createTopicConnection();\r\n          log.debug(\"got conn.\");\r\n          topic = (Topic)ctx.lookup(TEST_TOPIC);\r\n          log.debug(\"got topic.\");\r\n          session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);\r\n          conn.start();\r\n          log.debug(\"strated conn.\");\r\n          sub = session.createDurableSubscriber(topic, subscriberID);\r\n          msg = (TextMessage)sub.receive(5000);\r\n          if (msg != null){\r\n              log.debug(msg.getText());\r\n          } else {\r\n              log.debug(\"No message\");\r\n          }\r\n      } finally {\r\n          if (sub != null)\r\n              sub.close();\r\n          if (session != null)\r\n              session.close();\r\n          if (conn != null)\r\n              conn.close();\r\n      }\r\n      log.debug(\"done.\");\r\n      return msg;\r\n  }\r\n\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>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. &#8211; Use &lt;resource-ref&gt; for connection &hellip; <a href=\"https:\/\/jianmingli.com\/wp\/?p=1734\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[69],"tags":[],"class_list":["post-1734","post","type-post","status-publish","format-standard","hentry","category-oc4j"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8cRUO-rY","_links":{"self":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1734"}],"version-history":[{"count":3,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1734\/revisions"}],"predecessor-version":[{"id":1736,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1734\/revisions\/1736"}],"wp:attachment":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}