我正在尝试将点对点 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
这三个 jar 在工作的远程 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
我不知道为什么这不起作用,并且无法从抛出的异常中收集更多信息。任何人都可以确认我这样做是正确的,如果我是,看看我做错了什么?
对于这么长的帖子深表歉意,但提前感谢您的阅读!