Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从PL/SQL调用/使用JMS_Java_Jakarta Ee_Plsql_Jms - Fatal编程技术网

Java 从PL/SQL调用/使用JMS

Java 从PL/SQL调用/使用JMS,java,jakarta-ee,plsql,jms,Java,Jakarta Ee,Plsql,Jms,是否可以从PL/SQL调用/使用JAVA消息传递服务(JMS) 我知道我们可以从pl/SQL调用java,但调用java与调用JMS队列或JMS主题不同,因为JMS依赖于JNDI资源命名,当我们使用基于JNDI的资源时,我们首先必须将它们部署在某个J2EE容器中,然后使用它们。所以调用JMS总是需要在一些J2EE容器上部署,然后利用其功能 回到我前面提到的问题,我想使用PL/SQL中的JMS,以及它将如何处理部署和基于JNDI的资源。您的问题中有两个问题需要单独解决: JNDI 不,调用JMS服

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

我知道我们可以从pl/SQL调用java,但调用java与调用JMS队列或JMS主题不同,因为JMS依赖于JNDI资源命名,当我们使用基于JNDI的资源时,我们首先必须将它们部署在某个J2EE容器中,然后使用它们。所以调用JMS总是需要在一些J2EE容器上部署,然后利用其功能


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

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

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

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

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

IIRC,每个示例都显示了可以从命令行运行的客户端,您只需从命令行传递队列名称和其他参数。修改代码应该很容易,这样您就可以从属性文件或函数调用中作为参数加载它们

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

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

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

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

离别的想法 我从来没有这样做过,在这过程中可能会有问题。然而,至少在概念上,这应该是可能的。至少您应该能够创建一个jms命令行实用程序,然后将其转换为基于java的存储过程

编辑 显然,Oracle有一种叫做“Oracle高级排队”的东西,您可以通过PL/SQL直接访问JMS提供程序


看起来需要大量阅读和编辑,但这确实是可行的(假设您使用的是正确的Oracle版本)。

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

我不确定这是否可行。但是你的要求不能反过来吗?我的意思是,让Java代码(比如会话Bean)调用PL/SQL过程,获取结果并将其发送给JMS。听起来更自然。@Anthony-你的建议往往是最自然的方式。但也有可能需要在事务或DB作业中间访问非关系数据(例如访问LDAP)。它很难看,但有时是必要的。我从来没有做过OP要求的事情,但是,至少在概念上,这应该是可能的(请看我对他的回复)。。。没有保证,我最终可能是错的;我知道你的意思。但我将通过使用XA数据源来解决这个需求,并做一些事情,比如将存储过程一分为二。开始交易;调用第一个过程。获取结果,使用java端的结果访问LDAP,调用第二个过程传递任何必要的参数,提交事务。不过,我不确定这种方法是否适用于某些需求。非常感谢您的回答,先生!我可以接受它,并寻找一个解决方案连同您提出的解决方案。