2014-12-15 3 views
0

У меня есть конфигурация Synapse для чтения сообщения из очереди Oracle JMS, вызова веб-службы и захвата ответа в журнале. Конфигурация основана на ws02 with oracleотправка ответа на очередь jms в синапсе

Я попытался расширить конфигурацию, чтобы захватить ответ в другом Queryue Oracle, но я получаю ошибку, как показано ниже. Похоже, что, несмотря на указание типа назначения ответа как «очереди», он все еще пытается создать сеанс темы вместо сеанса очереди.

2014-12-15 14:13:21,728 [-] [HttpClientWorker-1] ERROR JMSSender Unable to create a JMSMessageSender for : [email protected] oracle.jms.AQjmsException: JMS-107: Operation not allowed on Connection 
at oracle.jms.AQjmsError.throwEx(AQjmsError.java:334) 
at oracle.jms.AQjmsConnection.createTopicSession(AQjmsConnection.java:728) 
at org.apache.axis2.transport.jms.JMSOutTransportInfo.createJMSSender(JMSOutTransportInfo.java:365) 
at org.apache.axis2.transport.jms.JMSSender.sendMessage(JMSSender.java:121) 
at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:119) 
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443) 

Конфигурация:

<definitions xmlns="http://ws.apache.org/ns/synapse"> 
<proxy name="StockQuoteProxy" transports="https http jms" startOnLoad="true" trace="disable"> 
    <target> 
    <endpoint> 
    <address uri="http://localhost:9000/services/SimpleStockQuoteService" /> 
    </endpoint> 
    <inSequence> 
    <log level="full" /> 
    <enrich> 
     <source type="body" clone="true" /> 
     <target type="property" property="jms_body_text" /> 
    </enrich> 
    <property name="jms_body_text" expression="get-property('jms_body_text')" scope="default" /> 
     <xslt key="jmsMsgToSoapMsg_xslt"> 
     <property name="jms_text" expression="get-property('jms_body_text')" /> 
     </xslt> 
     <log level="full"> 
     <property name="After transformation" value="************" /> 
     </log> 
    </inSequence> 
    <outSequence> 
    <log level="full"> 
     <property name="OUT SEQUENCE" value="************" /> 
    </log> 
    <send/> 
    </outSequence> 
    </target> 

    <publishWSDL uri="file:repository/conf/sample/resources/proxy/sample_proxy_1.wsdl"/> 

    <parameter name="transport.jms.ContentType"> 
    <rules> 
    <jmsProperty>ContentType</jmsProperty> 
    <default>text/plain</default> 
    </rules> 
    </parameter> 

    <parameter name="transport.jms.Destination">cn=tro_Q_JMS1,cn=OracleDBQueues,cn=ORCL,cn=OracleContext,ou=Services, o=sgi,c=us</parameter> 
    <parameter name="transport.jms.ReplyDestinationType">queue</parameter> 
    <parameter name="transport.jms.ReplyDestination">cn=tro_Q_JMS2,cn=OracleDBQueues,cn=ORCL,cn=OracleContext,ou=Services, o=sgi,c=us</parameter> 

</proxy> 

<localEntry key="jmsMsgToSoapMsg_xslt" src="file:jmsMsgToSoapMsg.xslt" /> 

<sequence name="fault"> 
    <log level="full"> 
    <property name="MESSAGE" value="Executing default &quot;fault&quot; sequence" /> 
    <property name="ERROR_CODE" expression="get-property('ERROR_CODE')" /> 
    <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')" /> 
    </log> 
    <drop/> 
</sequence> 

<sequence name="main"> 
    <log/> 
    <drop/> 
</sequence> 
</definitions> 

ответ

0

Я думаю, что я нашел эту проблему. Похоже, что Oracle JMS несовместим с транспортной библиотекой Axis2 jms.

JMSOutTransportInfo(JMSConnectionFactory jmsConnectionFactory, Destination dest, 
     String contentTypeProperty) { 
    this.jmsConnectionFactory = jmsConnectionFactory; 
    this.destination = dest; 
    destinationType = dest instanceof Topic ? JMSConstants.DESTINATION_TYPE_TOPIC 
              : JMSConstants.DESTINATION_TYPE_QUEUE; 
    this.contentTypeProperty = contentTypeProperty; 
} 

Для того, чтобы определить, назначение, является ли тема или очереди axis2 Jms сначала проверяет, если адресат реализует интерфейс темы. Проблема заключается в том, что класс Oracle одинаковый как для Topic, так и для Queue, AQjmsDestination, который реализует интерфейс Topic и Queue.