从PL / SQL调用/使用JMS

是否可以从PL / SQL调用/使用JAVA消息服务(JMS)?

我知道我们可以从pl / SQL调用java,但调用java与调用JMS Queues或JMS Topics不同,因为JMS依赖于JNDI资源命名,当我们使用基于JNDI的资源时,我们首先必须将它们部署在某些J2EE容器中,然后使用它们。 所以调用JMS总是涉及在某个J2EE容器上部署然后利用它的function。

回到我之前提到的问题,我想使用PL / SQL中的JMS以及如何处理部署和基于JNDI的资源。

您的问题中有两个问题需要单独解决:

JNDI

不,调用JMS服务不依赖于拥有JNDI资源,也不需要在容器中部署JMS客户端。 在容器中使用JNDI的原因是为了避免在应用程序代码中使用硬编码的配置参数(通过使用名为“things”的“目录”。)

例如,我们使用JNDI来获取连接池,从中获取jdbc连接,但我可以直接创建一个jdbc连接。 后者适用于测试或命令行实用程序,但对于一般情况肯定不合适(这就是为什么我们通常选择以前的基于jndi的选项。)

对于JMS,是的,您确实需要JNDI,但这并不意味着您的客户端需要在EE容器中。 查看Oracle / Sun站点上的JMS教程,并查看简单示例部分:

http://download.oracle.com/javaee/1.3/jms/tutorial/1_3_1-fcs/doc/client.html

IIRC,每个示例都显示可以从命令行运行的客户端,以及从命令行传递队列名称和其他参数的位置。 应该很容易改进该代码,以便您可以从属性文件或函数调用中的参数加载它们。

存储过程中的Java

一旦有了可以访问要访问的JMS队列的命令行客户端,就可以改进该代码,使其作为存储过程运行。 是的,您可以使用Java来编写Oracle存储过程…

…现在,我认为这是一个可怕的function,一个太开放滥用的function。 但是,如果您有合法的需要从PL / SQL访问JMS提供程序,这将是一种方法。

首先,将命令行jms客户端转换为存储过程。 查看有关如何使用Oracle创建基于Java的存储过程的现有文档。

http://www.stanford.edu/dept/itss/docs/oracle/10g/java.101/b12021/storproc.htm

http://download.oracle.com/docs/cd/B10501_01/java.920/a96659.pdf

然后让您的PL / SQL代码调用存储过程,就像调用任何其他存储过程或SQL语句一样。 瞧。

分手思考

我从来没有做过这些,而且可能会遇到问题。 但是,至少在概念上,它应该是可能的。 至少你应该能够创建一个jms命令行实用程序,然后可以将其转换为基于java的存储过程。

编辑

显然,Oracle有一种称为“Oracle高级队列”的东西,您可以通过PL / SQL直接访问JMS提供程序。

http://www.akadia.com/services/ora_advanced_queueing.html

http://technology.amis.nl/blog/2384/enqueuing-aq-jms-text-message-from-plsql-on-oracle-xe

http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96587/qintro.htm

看起来涉及很多阅读和肘部油脂,但它肯定是可行的(假设您使用正确的Oracle版本。)

我可能正在更新旧线程,但我刚刚成功使用JMS从PLJava触发器函数发送消息。 我从未在任何地方找到的一个要求是,你必须通过pljava安装function在数据库中加载jms broker jar文件(我使用activemq)。 其他过程与此示例相同。