Oracle: хранимая процедура Java, отправляющая сообщение JMS

Я пытаюсь отправить JMS-сообщение точка-точка из хранимой процедуры базы данных Oracle в приложение Java. Две «точки» находятся на разных машинах, которые, как я подтвердил, могут общаться друг с другом через ping.

Я создал приложение Java, способное успешно удалять сообщения из очереди на сервере приложений. Приложение работает на сервере JBoss v4.2.3. Мне удалось успешно отправить JMS-сообщение из удаленного Java-приложения, поэтому я уверен, что код, запущенный на сервере, в порядке.

Я взял код из работающего удаленного Java-приложения и успешно загрузил его в хранимая процедура оракула. Мне также удалось (я считаю!) Загрузить в 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

Я не понимаю, почему это не работает, и не смог почерпнуть больше из сгенерированного исключения. Может ли кто-нибудь подтвердить, что я делаю это правильно, и если да, то посмотрите, что я делаю неправильно?

Приношу извинения за длинный пост, но заранее благодарю вас за то, что посмотрели его!

5
задан ScreamingMage 9 August 2011 в 17:06
поделиться