【发布时间】:2011-10-23 10:07:03
【问题描述】:
我正在尝试将点对点 JMS 消息从 oracle 数据库存储过程发送到 java 应用程序。这两个“点”位于不同的机器上,我已经确认它们可以通过 ping 相互通信。
我创建了一个 java 应用程序,它能够成功地从应用程序服务器中的队列中取出消息。该应用程序在 JBoss v4.2.3 服务器中运行。我已经能够从远程 Java 应用程序成功发送 JMS 消息,所以我确信在服务器中运行的代码是可以的。
我已经从正在运行的远程 java 应用程序中获取代码,并将其成功加载到一个 oracle 存储过程中。我还设法(我相信!)使用 loadjava 实用程序将所需的 jar 文件加载到 oracle 中。我加载的三个jar文件是:
* jms-1.1
* jbossmq-3.2.3
* jboss-client-4.0.2
这三个 jars 在工作的远程 java 应用程序中使用,似乎就是所有需要的。加载到存储过程中的代码如下:
package com.base.jms.client;
import java.util.Hashtable;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
public class StandAloneClient {
public static String send() throws Exception {
String result = "Starting -> ";
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "192.168.111.242:1099");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
result = result + "Environment -> ";
// set up stuff
Context ic = new InitialContext(env);
result = result + "Context -> ";
QueueConnectionFactory connectionFactory = (QueueConnectionFactory) ic.lookup("ConnectionFactory");
result = result + "Factory -> ";
Queue queue = (Queue) ic.lookup("queue/A");
result = result + "Queue -> ";
QueueConnection connection = connectionFactory.createQueueConnection();
result = result + "Connection -> ";
QueueSession session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
result = result + "Session -> ";
QueueSender sender = session.createSender(queue);
connection.start();
result = result + "Sender -> ";
TextMessage myMessage = session.createTextMessage();
myMessage.setText(result);
sender.send(myMessage);
result = result + "Sending Message -> ";
sender.close();
session.close();
connection.close();
result = result + "Close";
} catch (JMSException e) {
result = result + "JMS Exception";
/*
if(e.getMessage() != null) {
result = result + ":" + e.getMessage();
}*/
} catch (Exception e) {
result = result + "Exception";
/*
if(e.getMessage() != null) {
result = result + ":" + e.getMessage();
}*/
}
return result;
}
}
我已经添加了结果字符串,因此我可以尝试确定它在代码中的哪个位置发生了故障。为了创建和测试这个过程,我在 sqlplus 中执行了以下命令:
create or replace function send_jms return VARCHAR2 as language java name 'com.base.jms.client.StandAloneClient.send() return java.lang.String';
variable myString varchar2(20);
call send_jms() into :myString;
Call completed.
print myString;
一切似乎都已正确加载和编译,但是没有发送消息。返回的结果字符串暗示它在尝试从 InitialContext 检索 QueueConnectionFactory 类时发生故障。返回的结果字符串为:
Starting -> Environment -> Context -> Exception
我不知道为什么这不起作用,并且无法从抛出的异常中收集更多信息。谁能确认我这样做是正确的,如果是,看看我做错了什么?
为这篇长文道歉,但提前感谢您查看它!
【问题讨论】:
-
附带说明:Oracle 附带了一个建立在高级队列之上的 JMS 实现。有没有人使用内置的 JMS 成功地与 JBoss 或其他应用程序服务器进行互操作,甚至可能不使用 Java,而只使用 PL/SQL 包?
-
我使用了 JBoss 提供的 Advance Queues。 Oracle 流也可用于 JMS。我认为采用我所做的方法会更容易。我开始不这么想了:)