如何为 OJMS 配置 OC4J 资源提供方(使用 data-sources.xml)?
日期:2003 年 6 月 24 日
在阅读此方法文档后,您应该能够
简介
本文档演示如何配置资源提供方,以访问数据库中的队列并通过资源提供方插入一条消息到队列。本方法文档通过使用 data-sources.xml 和 application.xml 配置文件来配置 ResourceProvider。
软件需求
说明
ResourceProvider 接口使您可为 JMS 连接插入第三方消息提供方。对于 Oracle JMS (OJMS) 而言,这将使 EJB、Servlet 及 OC4J 客户端可以访问许多不同的队列实现。利用第三方消息提供方,只有 EJB 可访问队列实现。这些资源作为缺省的 JMS 资源,可在 java:comp/resource/ 下获得。
设置数据库
开始了解错综复杂的 ResourceProvider 之前,首先让我们创建此方法文档所需的数据库队列。通过 sqlplus 以任何用户身份连接到数据库,并执行下列操作。请确保该数据库用户对 dbms_aqadm、dbms_aq 和 dbms_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 的数据库用户名/口令替换 username 和 password 属性的值。
- 使用您的数据库连接参数替换
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 提示下看到您插入队列的消息。
资源
|