您的问题中有两个问题需要单独解决:
不,调用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,每个示例都显示可以从命令行运行的客户端,以及从命令行传递队列名称和其他参数的位置.应该很容易改进该代码,以便您可以从属性文件或函数调用中的参数加载它们.
一旦有了可以访问要访问的JMS队列的命令行客户端,就可以改进该代码,使其作为存储过程运行.是的,您可以使用Java来编写Oracle存储过程...
...现在,我认为这是一个可怕的功能,一个太滥开放的方式.但是,如果您有合法的需要从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版本.)