Вызов / Использование JMS из PL / SQL - PullRequest
6 голосов
/ 28 апреля 2011

Можно ли вызвать / использовать службу сообщений JAVA (JMS) из PL / SQL?

Я знаю, что мы можем вызывать java из pl / SQL, но вызов java отличается от вызова очередей JMS или разделов JMS, поскольку JMS зависит от именования ресурсов JNDI, и когда мы используем ресурсы на основе JNDI, мы сначала должны развернуть их в некоторых J2EE контейнер, а затем использовать их. Поэтому вызов JMS всегда включает в себя развертывание в некотором контейнере J2EE и последующее использование его функциональных возможностей.

Возвращаясь к моему вопросу, как я упоминал ранее, я хочу использовать JMS из PL / SQL и узнать, как он будет обрабатывать ресурсы, связанные с развертыванием и ресурсами на основе JNDI ..?

Ответы [ 2 ]

5 голосов
/ 28 апреля 2011

В вашем вопросе есть две проблемы, которые необходимо рассмотреть отдельно:

JNDI

Нет, вызов JMS-службы не зависит от наличия JNDI-ресурса, и вам не нужно развертывать JMS-клиент в контейнере. Причина использования JNDI в контейнере состоит в том, чтобы избежать жестко запрограммированных параметров конфигурации в коде вашего приложения (используя «каталог» именованных «вещей».)

Например, мы используем JNDI для получения пула соединений, из которого можно получить соединение jdbc, но я мог бы в равной степени создать соединение jdbc напрямую. Последнее подходит для тестирования или для утилиты командной строки, но, конечно, не подходит для общего случая (именно поэтому мы обычно выбираем первый вариант, основанный на jndi.)

С JMS, да, вам действительно нужен JNDI, но это не значит, что ваш клиент должен находиться в контейнере EE. Посмотрите учебное пособие по JMS на сайте Oracle / Sun и посмотрите раздел простых примеров:

http://download.oracle.com/javaee/1.3/jms/tutorial/1_3_1-fcs/doc/client.html

IIRC, каждый пример показывает клиентов, которых можно запустить из командной строки, и где вы просто передаете имя очереди и другие параметры из командной строки. Должно быть легко модифицировать этот код, чтобы вы могли загружать его из файла свойств или в качестве параметров при вызове функции.

Java в процедурах магазина

Если у вас есть клиент командной строки, который может получить доступ к очереди JMS, к которой вы хотите получить доступ, вы можете модифицировать этот код, чтобы он выполнялся как хранимая процедура. Да, вы можете использовать Java для написания хранимых процедур с Oracle ...

... теперь я думаю, что это ужасная особенность, слишком открытая для злоупотреблений. Но если у вас есть законная необходимость доступа к провайдеру JMS из PL / SQL, это может быть одним из способов.

Сначала преобразуйте ваш jms-клиент из командной строки в хранимую процедуру. Проверьте существующую документацию о том, как создавать хранимые процедуры на основе Java с Oracle.

http://www.stanford.edu/dept/itss/docs/oracle/10g/java.101/b12021/storproc.htm

http://download.oracle.com/docs/cd/B10501_01/java.920/a96659.pdf

Затем ваш PL / SQL-код вызывает хранимую процедуру так же, как они вызывают любой другой хранимый метод proc или SQL. И вуаля.

Прощальные мысли

Я никогда этого не делал, и на этом пути могут возникнуть проблемы. Однако, по крайней мере, концептуально, это должно быть возможно. По крайней мере, вы сможете создать утилиту командной строки jms, которую затем сможете конвертировать в хранимый процесс на основе Java.

редактировать

Очевидно, что в Oracle есть нечто, называемое Oracle Advanced Queuing, где вы можете напрямую обращаться к провайдеру JMS через PL / SQL.

http://www.akadia.com/services/ora_advanced_queueing.html

http://technology.amis.nl/blog/2384/enqueuing-aq-jms-text-message-from-plsql-on-oracle-xe

http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96587/qintro.htm

Похоже, что для этого требуется много чтения и смазывание локтем, но это, безусловно, возможно (при условии, что вы используете правильную версию Oracle.)

2 голосов
/ 20 ноября 2012

Возможно, я обновляю старый поток, но я только что успешно использовал JMS для отправки сообщений из триггерной функции PLJava. Единственное требование, которое я нигде не нашел, это то, что вы должны загрузить jar-файлы jms-брокера (я использовал activemq) в вашу базу данных через функцию установки pljava. Другие процедуры такие же, как этот пример.

...