6

我试图从 JMS 队列中的 XML 中获取(Oracle Data Integrator 12.1.2.0.0),支持 Apache ActiveMQ 5.8,但出现以下错误:

ODI-1227: Task LKM JMS XML to SQL (Load JMS to XML) fails on the source <Empty Value> connection JMS_ActiveMQ_INVOICE_LOCAL2_CNG.
Caused By: java.sql.SQLException: java.lang.ClassCastException: org.apache.activemq.command.ActiveMQObjectMessage cannot be cast to javax.jms.BytesMessage
at com.sunopsis.jdbc.driver.SnpsDriverStatement.executeQuery(SnpsDriverStatement.java:110) 
at com.sunopsis.jdbc.driver.SnpsDriverPreparedStatement.executeQuery(SnpsDriverPreparedStatement.java:139)
at com.sunopsis.jdbc.driver.JMSXMLStatement.loadJMS(JMSXMLStatement.java:687)
at com.sunopsis.jdbc.driver.JMSXMLStatement.execute(JMSXMLStatement.java:159)
at oracle.odi.runtime.agent.execution.sql.SQLCommand.execute(SQLCommand.java:205)...

JMS-queue 是外部系统,我无法更改消息的类型。LKM JMS XML to SQL知识模块能否处理消息org.apache.activemq.command.ActiveMQObjectMessage类,实现接口javax.jms.BytesMessage,如果可以,如何配置?

因为org.apache.activemq.command.ActiveMQTextMessage实现接口javax.jms.TextMessage知识模块LKM JMS XML to SQL的类的消息处理成功。

我该如何解决这个问题。

问候, 阿扎马特

4

1 回答 1

9

我遇到了同样的问题并通过添加检查在调用中返回哪种类型的实例来解决它。

if (message instanceof ActiveMQTextMessage) {
    ActiveMQTextMessage amqMessage = (ActiveMQTextMessage) message;
    mqDelegate.execute(params, amqMessage.getText());
} else {
    BytesMessage bm = (BytesMessage) message;
    byte data[] = new byte[(int) bm.getBodyLength()];
    bm.readBytes(data);
    mqDelegate.execute(params, new String(data));
}

让我知道是否有更好的解决方案。

于 2015-10-23T06:49:55.707 回答