Запретить Mule ESB блокировать некоторые запросы

Иногда (очень часто) Mule ESB блокирует некоторые запросы SOAP. Как я могу остановить Mule от этого? Я не знаю, в чем причина блокировки.

вот как я настроил http-listener в конфигурации мула:

<http:listener-config name="HTTP_listener" host="${MachineName}" port="${InboundPort}"  doc:name="HTTP listener Configuration"  />      
<flow name="etryFlow" >
   <http:listener allowedMethods="POST"  config-ref="HTTP_listener" path="/{name}" doc:name="HTTP"/>

    <set-payload value="#[app.registry.pairFactory.createInputStreamWithStringKeyInstance(message.inboundProperties['http.uri.params']['name'],payload))]"  />                                  
    <jms:outbound-endpoint connector-ref="jms-connector" ref="UnsortedOrders" />
    <logger level="INFO" doc:name="Logger" message="****Entry****" />                         
</flow> 

примечание: запрещенные запросы преобразуются в BlockingTransferInputStream вместо BufferInputStream.

благодарю вас.

** РЕДАКТИРОВАТЬ **

это реализация createInputStreamWithStringKeyInstance:

public static Pair<String, byte[]> createByteArrayWithStringKeyInstance(String key, byte value[]) throws IOException {
    return new Pair<String, byte[]>(key, value);
}   

и Pair.java — это простой сериализуемый класс (такой же, как JavaFX.Pair). Примечание. Вход — это SOAP XML.

--EDIT -- Это конфигурационный файл мула:

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:file="http://www.mulesoft.org/schema/mule/file" 
      xmlns:http="http://www.mulesoft.org/schema/mule/http"
      xmlns="http://www.mulesoft.org/schema/mule/core"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:spring="http://www.springframework.org/schema/beans"
      xmlns:quartz="http://www.mulesoft.org/schema/mule/quartz"
      xmlns:vm="http://www.mulesoft.org/schema/mule/vm"
      xmlns:jms="http://www.mulesoft.org/schema/mule/jms"
      xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting"
      xmlns:bpm="http://www.mulesoft.org/schema/mule/bpm"
      xmlns:client="http://www.mulesoft.org/schema/mule/client"      
        xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" 
        xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
        xmlns:context="http://www.springframework.org/schema/context"   
        xmlns:management="http://www.mulesoft.org/schema/mule/management"       
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd 
        http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
        http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/3.2/mule.xsd
        http://www.mulesoft.org/schema/mule/quartz http://www.mulesoft.org/schema/mule/quartz/3.2/mule-quartz.xsd
        http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/3.2/mule-vm.xsd
        http://www.mulesoft.org/schema/mule/jms http://www.mulesoft.org/schema/mule/jms/3.2/mule-jms.xsd
        http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/3.2/mule-scripting.xsd
        http://www.mulesoft.org/schema/mule/bpm http://www.mulesoft.org/schema/mule/bpm/3.2/mule-bpm.xsd
        http://www.mulesoft.org/schema/mule/client http://www.mulesoft.org/schema/mule/client/3.2/mule-client.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd                
        http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.mulesoft.org/schema/mule/management http://www.mulesoft.org/schema/mule/management/current/mule-management.xsd ">

    <jms:activemq-connector  name="jms-connector" brokerURL="${BrokerURL}" disableTemporaryReplyToDestinations="true" specification="1.1"/>

    <jms:endpoint connector-ref="jms-connector" exchange-pattern="one-way" name="UnsortedOrders" queue="UnsortedOrders"/>                
    <jms:endpoint connector-ref="jms-connector" exchange-pattern="one-way" name="DestinationEMC" queue="DestinationEMC" />                
    <jms:endpoint connector-ref="jms-connector" exchange-pattern="one-way" name="DestinationOriginal" queue="DestinationOriginal"/>                           

    <management:jmx-default-config>
        <management:credentials>
          <spring:entry key="admin" value="admin"/> 
        </management:credentials>
    </management:jmx-default-config>

   <spring:beans>
        <context:property-placeholder location="classpath:Application.properties"/>
        <spring:bean name="NoFactsBean" class="java.util.ArrayList" scope="singleton"/>                 
        <spring:bean id="objectStore" class="org.mule.util.store.QueuePersistenceObjectStore"/>     
        <spring:bean id ="requestBean" class="com.hamgam.hit.esb.bean.RequestBean" factory-method="getInstance" scope="singleton"/>
    </spring:beans>

    <message-properties-transformer name="contentTypeTextXML">
        <add-message-property key="Content-Type" value="text/xml;charset=UTF-8;" />
    </message-properties-transformer>        

    <http:listener-config name="HTTP_listener" host="${MachineName}" port="${InboundPort}"  doc:name="HTTP listener Configuration"  />      
    <flow name="etryFlow">
        <http:listener allowedMethods="POST" parseRequest="false"  config-ref="HTTP_listener" path="/{name}" doc:name="HTTP" />
        <object-to-byte-array-transformer/>     
        <expression-component>
            payload = app.registry.requestBean.createServiceRequest(message.inboundProperties['http.uri.params']['name'],payload);
        </expression-component>
        <jms:outbound-endpoint connector-ref="jms-connector" ref="UnsortedOrders"  />
        <logger level="INFO" doc:name="Logger" message="****#[payload] Enters Entry****" />
    </flow> 

    <flow name="consumeRequestsFlow" >      
        <jms:inbound-endpoint ref="UnsortedOrders" connector-ref="jms-connector" />
        <logger level="INFO" doc:name="Logger" message="**** #[payload] Enters consumeRequestsFlow ****" />     
        <choice doc:name="Choice">
            <when expression="#[app.registry.requestBean.isEMCRequired(payload)]">
                <jms:outbound-endpoint connector-ref="jms-connector" ref="DestinationEMC" />
            </when>
            <otherwise>
                <jms:outbound-endpoint connector-ref="jms-connector" ref="DestinationOriginal" />
            </otherwise>
        </choice>
    </flow>

    <flow name="ConsumeEmcQ">
        <jms:inbound-endpoint connector-ref="jms-connector" ref="DestinationEMC" />
        <logger level="INFO" doc:name="Logger" message="**** #[payload] Enters ConsumeEmcQ ****" />        
        <set-payload value="#[app.registry.requestBean.sendToEMC(payload)]" />
        <until-successful objectStore-ref="objectStore" maxRetries="${MaximumRetry}" secondsBetweenRetries="${RetryInterval}">
            <http:outbound-endpoint address="${ECMURL}" exchange-pattern="one-way">             
                <transformer ref="contentTypeTextXML"/>
            </http:outbound-endpoint>
        </until-successful>  
    </flow>

    <flow name="ConsumeOrigQ">        
        <jms:inbound-endpoint connector-ref="jms-connector" ref="DestinationOriginal" />
        <logger level="INFO" doc:name="Logger" message="**** #[payload] Enters ConsumeOriginalQ ****" />
        <set-payload value="#[app.registry.requestBean.sendToDestination(payload)]" />         
    </flow> 

    <flow name = "EMCResponseFlow" >
        <http:inbound-endpoint host="${MachineName}" port="${EMCResponsePort}" exchange-pattern="one-way">
            <set-property propertyName="SOAPAction" value="#[message.inboundProperties['SOAPAction']]"/>
            <transformer ref="contentTypeTextXML"/>
        </http:inbound-endpoint>    
        <logger level="INFO" doc:name="Logger" message="***EMCResponseEntry****" />
    </flow>                   
</mule>

person MoienGK    schedule 08.02.2015    source источник


Ответы (1)


Предполагая, что createInputStreamWithStringKeyInstance (которое вы не описываете, поэтому вам действительно трудно помочь) возвращает InputStream, Mule в конечном итоге создает JMS StreamMessage (согласно этот вызов).

Из кода Mule вы можете видеть, что он сливает полезную нагрузку потоковой передачи в StreamMessage с помощью следующей логики:

while ((len = value.read(buffer)) != -1)
{
    streamMessage.writeBytes(buffer, 0, len);
}

что нормально, при условии, что поток, возвращаемый createInputStreamWithStringKeyInstance, не выполняет каких-либо замысловатых операций за кулисами.

Также обратите внимание, что JMS StreamMessage, вероятно, не то, что вам нужно. Вы читали его Javadoc? В нем говорится:

Объект StreamMessage используется для отправки потока примитивных типов на языке программирования Java.

Я почти уверен, что вместо этого вы хотите использовать JMS BytesMessage. Mule создает такое сообщение, если полезная нагрузка представляет собой byte[] (в соответствии с приведенной выше логикой связанного преобразования), поэтому вам лучше иметь <object-to-byte-array-transformer/> прямо перед jms:outbound-endpoint.

person David Dossot    schedule 08.02.2015
comment
Благодарю. я отредактировал свой вопрос. Я сделал то, что вы сказали, и поставил ‹object-to-byte-array-transformer/› непосредственно перед ‹set-payload›. и это приводит к тому, что исходный пакет слишком теряет свой тип содержимого. (машина поставщика услуг жалуется: заголовок HTTP Content-Type требуется для обмена сообщениями SOAP, но ничего не найдено - person MoienGK; 09.02.2015
comment
В вашем потоке нет ничего, что могло бы создать правильный ответ SOAP: что вы собираетесь вернуть в качестве ответа SOAP XML? И да, вам нужно будет установить правильные заголовки ответов, раньше это работало случайно. - person David Dossot; 09.02.2015
comment
Ну, запрос представляет собой мыльное сообщение, я преобразовываю его в массив байтов, затем делаю с ним что-то (без изменения его содержимого), а затем передаю точный запрос как исходящий. Это ваш мыльный xml - person MoienGK; 09.02.2015
comment
Я не помещал сюда весь файл, потому что я думал, что это не нужно. Думаю, я был неправ - person MoienGK; 09.02.2015
comment
Насколько я понимаю, вы преобразовываете входящий запрос SOAP перед его отправкой через JMS. Чего я не понимаю, так это того, какой ответ SOAP вы собираетесь вернуть клиенту, отправившему первоначальный запрос по HTTP. Где создается ответ SOAP? - person David Dossot; 09.02.2015
comment
Запросы должны быть односторонними. Запрашивающий отвечает на запрос сервера назначения, но этот разговор не синхронизируется, и мул играет роль человека в середине. Но я предполагаю, что включен какой-то автоматический ответ, потому что отправитель видит сообщение об ошибке, которое фактически создается целевым сервером, а я этого не делаю! - person MoienGK; 10.02.2015
comment
Mule всегда отвечает на HTTP-запросы, самый простой ответ — 200 OK без объекта ответа. В этом случае ответ не является допустимым ответом SOAP. Вы не указываете шаблон обмена в jms:outbound-endpoint, поэтому возможно, что Mule использует его в режиме request-response, таким образом, ожидая удаленного ответа, а затем направляя его обратно клиенту HTTP. Вам нужно лучше контролировать то, что вы на самом деле отвечаете по HTTP, не позволяйте просто так происходить. - person David Dossot; 10.02.2015