Я пытаюсь отправить двухточечное сообщение JMS из хранимой процедуры базы данных оракула в приложение Java. Две «точки» расположены на разных машинах, и я убедился, что они могут общаться друг с другом через ping.
Я создал приложение Java, способное успешно удалять сообщения из очереди на сервере приложений. Приложение работает на сервере JBoss v4.2.3. Мне удалось успешно отправить сообщение JMS из удаленного Java-приложения, поэтому я уверен, что код, запущенный на сервере, в порядке.
Я взял код из работающего удаленного Java-приложения и успешно загрузил его в хранимую процедуру Oracle. Мне также удалось (я верю!) Загрузить в oracle необходимые файлы jar с помощью утилиты loadjava. Я загрузил три 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;
Кажется, что все загружается и компилируется правильно, однако сообщение не отправляется. Возвращаемая строка результата подразумевает, что она падает при попытке извлечь класс QueueConnectionFactory из InitialContext. Возвращенная строка результата:
Starting -> Environment -> Context -> Exception
Я в недоумении, почему это не работает, и не смог найти больше из брошенного исключения. Может ли кто-нибудь подтвердить, что я делаю это правильно, и если да, посмотрите, что я делаю неправильно?
Извиняюсь за длинный пост, но заранее благодарю за просмотр!