2015-02-08 130 views
0

有時(非常頻繁),ESB禁止某些SOAP請求。我如何阻止騾子這樣做?我不知道阻塞的原因是什麼。禁止Mule ESB阻止一些請求

這是多麼我已經配置HTTP偵聽器在騾子的配置:

<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) 注:輸入是一個XML SOAP

- 編輯 - 這是騾子配置文件:

<?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> 

回答

1

假設createInputStreamWithStringKeyInstance(你沒有描述,所以它真的很難幫你)返回InputStream,騾結束了建立一個JMS StreamMessage(每this call)。

從騾子代碼,你可以看到它水渠流的有效載荷送入這個邏輯StreamMessage

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

這是很好的,提供由createInputStreamWithStringKeyInstance返回的流不會做後面的任何特殊業務現場。

另請注意,JMS StreamMessage可能不是您想要的。你讀過its Javadoc嗎?它說:

StreamMessage對象用於發送Java編程語言中的原語類型流。

我很確定你想用JMS BytesMessage。如果有效負載是byte[](根據上述鏈接轉換邏輯),Mule會創建此類消息,因此您寧願在jms:outbound-endpoint之前有<object-to-byte-array-transformer/>

+0

謝謝。我編輯了我的問題。我做了你所說的,並在之前放置了。這使得原始數據包的內容類型過於寬鬆。 (服務提供者機器抱怨:SOAP消息傳遞需要HTTP內容類型標頭,並且沒有被發現 – MoienGK 2015-02-09 06:09:53

+0

您的流程中沒有任何內容會創建適當的SOAP響應:您打算作爲SOAP XML響應返回什麼?是的,您需要設置正確的響應頭文件,這是偶然的工作 – 2015-02-09 18:03:06

+0

請求是一個肥皂消息,我將它轉換爲字節數組然後做一些東西(不改變它的內容),然後傳遞精確的請求作爲一個outbound.that是你的肥皂xml – MoienGK 2015-02-09 18:31:11