如何为 OJMS 配置 OC4J 资源提供方(使用 data-sources.xml)?

日期:2003 年 6 月 24 日

在阅读此方法文档后,您应该能够

  • 为 OJMS 配置资源提供方。

简介

本文档演示如何配置资源提供方,以访问数据库中的队列并通过资源提供方插入一条消息到队列。本方法文档通过使用 data-sources.xml 和 application.xml 配置文件来配置 ResourceProvider。


软件需求

  • 此处可下载 Oracle9i Enterprise Edition Release 9.2.0.2.0 — 产品版(或高级版本)

  • Oracle9iAS Containers for J2EE (OC4J) Version 9.0.3 或更高版本您可从 Oracle 技术网下载 OC4J。

  • JDK1.3.x 或更高版本。可从此处下载。


说明

ResourceProvider 接口使您可为 JMS 连接插入第三方消息提供方。对于 Oracle JMS (OJMS) 而言,这将使 EJB、Servlet 及 OC4J 客户端可以访问许多不同的队列实现。利用第三方消息提供方,只有 EJB 可访问队列实现。这些资源作为缺省的 JMS 资源,可在 java:comp/resource/ 下获得。

设置数据库

开始了解错综复杂的 ResourceProvider 之前,首先让我们创建此方法文档所需的数据库队列。通过 sqlplus 以任何用户身份连接到数据库,并执行下列操作。请确保该数据库用户对 dbms_aqadmdbms_aqdbms_aqin 包拥有执行权限。

-- Create a Queue Table. The payload is SYS.AQ$_JMS_TEXT_MESSAGE. 
-- This type can store simple String values.
  BEGIN
dbms_aqadm.create_queue_table(
queue_table=>'RPTable',
queue_payload_type=>'SYS.AQ$_JMS_TEXT_MESSAGE',
multiple_consumers => false,
comment => 'Queue Table For Resource Provider'
); END; / -- Create a Queue. BEGIN
dbms_aqadm.create_queue (
queue_name => 'RPQueue',
queue_table => 'RPTable');
END;
/ -- Start this queue. This enables the queue to receive messages. EXECUTE dbms_aqadm.start_queue (queue_name=>'RPQueue')
/

这样就完成了数据库设置。

配置自定义资源提供方

首先,我们将创建一个数据源来访问 OC4J。可在 data-sources.xml 文件中完成此任务。请在此处添加下列标记。

 <data-source
class="com.evermind.sql.DriverManagerDataSource"
name="RPDataSource"
location="jdbc/OracleRPDS"
xa-location="jdbc/xa/OracleXRPDS"
ejb-location="jdbc/OracleERPDS"
connection-driver="oracle.jdbc.driver.OracleDriver"
username="rp"
password="rp"
url="jdbc:oracle:thin:@ind712r.idc.oracle.com:1521:otn9i"
inactivity-timeout="30"
/>

对于上面的标记,请注意下列几点

  • 使用创建队列表 RPTable 的数据库用户名/口令替换 usernamepassword 属性的值。
  • 使用您的数据库连接参数替换 url 属性的值。一般的构造为
 jdbc:oracle:thin:@<db_hostname>:<db_port>:<db_sid>

现在我们将更新 application.xml。用于 OJMS 的 OC4J 资源提供方由类 oracle.jms.OjmsContext 实现。每个 OJMS 资源提供方实例是配置文件中的一个 XML 元素。要添加自定义的 ,请将下列标记添加到您的 application.xml 文件。如果部署在 OC4J 内的某个特定应用程序要在本地获得 ResourceProvider,则将此标记添加到 orion-application.xml 中并将其打包为 ear 文件。

 <resource-provider class="oracle.jms.OjmsContext" name="TestRP">
<description> OTN How-to to configure Resource Provider</description>
<property name="datasource"
value="jdbc/OracleRPDS"
/>
</resource-provider>

对于上面的标记,请注意下列几点

  • TestRP 是 JNDI 名,应用程序通过它来识别资源提供方。此名称将以 java:comp/resource/TestRP/ 形式用于在应用程序的 JNDI 中查找资源提供方。
  • property 标记中的 value 属性是已创建的数据源名。

这样就完成了资源提供方的配置。

使用自定义资源提供方

要通过 JMS 访问 Oracle JMS 队列,您必须在 Java 客户端(Java 类、EJB、Servlet、JSP 等)中执行下列操作

  // Get the Initial Context
Context jndiContext = new InitialContext(); // LookUp the QueueTable and create the QueueConnectionFactory
QueueConnectionFactory queueCF = (QueueConnectionFactory)jndiContext.lookup
("java:comp/resource/TestRP/QueueConnectionFactories/RPTable"); // Lookup the Queue and create its object
Queue queue = (Queue)jndiContext.lookup("java:comp/resource/TestRP/Queues/RPQueue"); // Create a Connection to the QueueTable
QueueConnection queueConnection = queueCF.createQueueConnection(); // Start the Connection
queueConnection.start(); // Create a Session to the queue
QueueSession queueSession = queueConnection.createQueueSession
(true, Session.AUTO_ACKNOWLEDGE); // Create an object through which this program enqueues
QueueSender sender = queueSession.createSender(queue); // Create a Text Message to be enqueued
Message msg = queueSession.createTextMessage("Did you have your OTN Sample today?"); // Enqueue the message in the queue
sender.send(msg);

请单击此处来查看完整的 JSP,它使用上述代码展示 ResourceProvider 的性能。

执行 JSP

  • ResourceProvider.jsp 复制到 <oc4j_home>\j2ee\home\default-web-app\examples 下。<oc4j_home> 是安装 OC4J 的文件夹。例如,对于 Windows,此文件夹为 D:\oc4j;对于 Linux 或 Solaris,此文件夹为 /home/oc4j
  • 启动 OC4J 服务器。
  • 打开浏览器并访问 URL http://<host_name>:<oc4j_port>/examples/ResourceProvider.jsp
  • 在第一页您将看到一个文本框。请在其中输入一些文本。此文本消息将插入数据库队列。请按下 Enqueue Message 按钮。
  • 现在您将看到 Message Enqueued Successfully !!!.这表示您提供的消息已通过 ResourceProvider 成功插入队列。要进行检查,请通过 sqlplus 以数据库用户身份(创建队列的数据库)登录,并运行下列命令
      set serveroutput on;
    declare
    deqopt dbms_aq.dequeue_options_t;
    mprop dbms_aq.message_properties_t;
    msgid RAW(16);
    payload SYS.AQ$_JMS_TEXT_MESSAGE; begin
    deqopt.navigation := DBMS_AQ.FIRST_MESSAGE;
    deqopt.wait := 1;
    dbms_aq.dequeue(
    queue_name => 'RPQueue',
    dequeue_options => deqopt,
    message_properties => mprop,
    payload => payload,
    msgid => msgid );
    commit; dbms_output.put_line('The Message Sent to the Queue is: ' || payload.TEXT_VC); end;
    /

执行上述操作之后,您将在 sql 提示下看到您插入队列的消息。

资源


寄送此页面
Printer View 打印机视图