использование Oracle Advanced Queue через JMS: NPE, брошенный в AQjmsProducer.jdbcEnqueue

1

Я бы хотел использовать Oracle Advanced queue через JMS.

Я создаю таблицу очередей и очередь через plsql следующим образом:

BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
queue_table            => 'QT3',
queue_payload_type     => 'RAW');
END;
/

BEGIN
DBMS_AQADM.CREATE_QUEUE( 
queue_name          => 'Q3', 
queue_table         => 'QT3'); 
END;
/

Затем я пытаюсь отправить сообщение следующим образом:

    System.setProperty("oracle.jms.traceLevel", "6");

    ConnectionFactory connectionFactory = AQjmsFactory.getConnectionFactory("x.x.x.x", "xxx", 1521, "thin");
    Connection connection = connectionFactory.createConnection("xxx", "xxx");
    connection.start();

    Session session = connection.createSession(true, 0);
    Queue queue = session.createQueue("Q3");
    MessageProducer producer = session.createProducer(queue);
    TextMessage message = session.createTextMessage("valami");
    message.setJMSType("text");
    producer.send(message);
    session.commit();

Вышеприведенный код находит очередь (если я заменяю Q3 на что-то еще, тогда он говорит, что очередь не найдена, поэтому я предполагаю, что базовая настройка соединения в порядке), но я получил исключение NPE на сайте производителя. Я установил трассировку aqapi, и я получил этот результат:

main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.send-1:  entry
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.send-main:  entry
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.send:  queue: RISKOPALL.Q3
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.send:  dest_queue: RISKOPALL.Q3
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.jdbcEnqueue:  entry
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.checkMessageType:  adt type: null
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.checkMessageType:  message_class: oracle.jms.AQjmsTextMessage
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.jdbcEnqueue:  exit
Exception in thread "main" java.lang.NullPointerException
    at oracle.jms.AQjmsProducer.checkMessageType(AQjmsProducer.java:2362)
    at oracle.jms.AQjmsProducer.jdbcEnqueue(AQjmsProducer.java:823)
    at oracle.jms.AQjmsProducer.send(AQjmsProducer.java:747)
    at oracle.jms.AQjmsProducer.send(AQjmsProducer.java:517)
    at aqjms.AqJmsTest.main(AqJmsTest.java:55)

Я декомпилировал aqapi.jar и обнаружил, что NPE выбрасывается, потому что параметр "adtType" равен нулю в AQjmsProducer.checkMessageType.

Что это за тип ADT и как его правильно установить?

Большое спасибо!

Теги:
jms

1 ответ

2
Лучший ответ

Установка типа полезной нагрузки очереди решила проблему:

BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
queue_table            => 'QT3',
queue_payload_type     => 'SYS.AQ$_JMS_TEXT_MESSAGE',
compatible => '8.1.0');
END;
/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню