2013-05-15 2 views
0

Я использую Mule Community Edition 3.4. У меня проблема с компонентом UntilSuccessful. Теперь отображается сценарий: У меня поток, составленный компонентом UntilSuccessful, в котором есть SOAP-компонент, который делает запрос к веб-службе. В этом потоке также есть ExcpetionStrategy. Проблема в том, что когда исключение возникает внутри UntilSuccessful (т. Е. В компоненте SOAP), ExcpetionStrategy не может справиться с этим, потому что он (обработанное исключение) обрабатывается каким-то механизмом внутри компонента UntilSuccessful. Поскольку мне нужно обрабатывать Exception в ExcpetionStrategy, я решил создать настраиваемый исходящий перехватчик (внутри SOAP-компонента), который перехватывает ответ SOAP (исключение, если оно выбрано), и которое может генерировать исключение, чтобы вызвать ExcpetionStrategy. Может ли кто-нибудь помочь мне с этой проблемой? Я попытался прочитать документацию, но она разрежена и не очень хорошо объясняет, как создать настраиваемое исходящее исключение. Что бы я сделать, это сохранить где-то имя исключительной ситуации (например, если сервер кинул NumberFormatException, я бы сохранить его имя где-то для того, чтобы использовать его в ExceptionStrategy)Создание пользовательского перехватчика с помощью веб-службы SOAP MULE

Ниже вы можете увидеть фрагмент мула файл конфигурации:

<flow name="ProvaClient" doc:name="ProvaClient"> 
     <quartz:inbound-endpoint jobName="TalendJob" repeatInterval="5000" repeatCount="0" responseTimeout="10000" doc:name="Quartz"> 
      <quartz:event-generator-job> 
       <quartz:payload>error</quartz:payload> 
      </quartz:event-generator-job> 
     </quartz:inbound-endpoint> 
     <object-to-string-transformer doc:name="Object to String"/> 
     <until-successful objectStore-ref="OS_Bean" maxRetries="2" secondsBetweenRetries="2" doc:name="Until Successful" deadLetterQueue-ref="myQueue"> 
      <processor-chain doc:name="Processor Chain: Wait For Web Service Response"> 
       <processor-chain doc:name="Processor Chain: Web Service"> 
        <cxf:jaxws-client operation="getCode" clientClass="it.aizoon.prova.client.ProvaService" port="ProvaPort" enableMuleSoapHeaders="true" doc:name="SOAP"> 
        </cxf:jaxws-client> 
         <http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="service/prova" method="POST" doc:name="HTTP"/> 
       </processor-chain> 
       <logger message="PAYLOAD: #[payload]" level="INFO" doc:name="Logger"/> 
      </processor-chain> 
     </until-successful> 
     <catch-exception-strategy doc:name="Catch Exception Strategy"> 
      <!-- <processor ref="myExceptionHandler_id"/> --> 
      <logger message="EXCEPTION STRATEGY" level="INFO" doc:name="Logger"/> 
     </catch-exception-strategy> 
</flow> 

здесь вы можете увидеть сервер, который выставляет веб-службы:

<flow name="provaServer" doc:name="provaServer"> 
     <http:inbound-endpoint exchange-pattern="request-response" doc:name="HTTP" host="localhost" path="service/prova" port="8081"/> 
     <logger message="SERVER" level="INFO" doc:name="Logger"/> 
     <cxf:jaxws-service serviceClass="it.aizoon.prova.Prova" doc:name="Process SOAP Request" /> 
     <component class="it.aizoon.prova.ProvaImpl" doc:name="Java"/> 
</flow> 

И здесь есть ProvaImpl.java, реализация веб-службы. Как вы можете видеть, если строка передается в качестве аргумента в Получить код() функция ошибки, исключение в выброшен, и я бы, что он управляет стратегией исключения, определенной в клиенте

@WebService(endpointInterface = "it.aizoon.prova.Prova", 
        serviceName = "Prova") 
public class ProvaImpl implements Prova{ 

     @Override 
     public String getCode(String code) throws NumberFormatException{ 
      // TODO Auto-generated method stub 
      if(code.equals("error")) throw new NumberFormatException(); 

      String str = "Andato a buon fine!"; 
      return str; 
     } 
} 

ответ

1

Я хотел бы изменить подход а не использовать перехватчик. Если вам нужно вызывать стратегию исключения, когда вы запускаете только успешный маршрутизатор, я бы переместил ваш cxf: jaxws-client и т. Д. В частный поток. Цитирую Mule в действии 2-е издание частных потоков:

Такое разделение позволяет определить обработку и обработку ошибок стратегии, которые являются локальными по отношению к частному потоку.

<flow name="ProvaClient" doc:name="ProvaClient"> 
    ... 
    <until-successful objectStore-ref="OS_Bean" 
     maxRetries="2" secondsBetweenRetries="2" doc:name="Until Successful" 
     deadLetterQueue-ref="myQueue"> 
     <processor-chain doc:name="Processor Chain: Wait For Web Service Response"> 
      <processor-chain doc:name="Processor Chain: Web Service"> 
       <flow-ref name="externalCallFlow" /> 
      </processor-chain> 
      <logger message="PAYLOAD: #[payload]" level="INFO" doc:name="Logger" /> 
     </processor-chain> 
    </until-successful> 

    ... 
</flow> 
<flow name="externalCallFlow"> 
    <cxf:jaxws-client operation="getCode" 
     clientClass="it.aizoon.prova.client.ProvaService" port="ProvaPort" 
     enableMuleSoapHeaders="true" doc:name="SOAP"> 
    </cxf:jaxws-client> 
    <http:outbound-endpoint exchange-pattern="request-response" 
     host="localhost" port="8081" path="service/prova" method="POST" 
     doc:name="HTTP" /> 
    <catch-exception-strategy doc:name="Catch Exception Strategy"> 
     <!-- Handle exception here locally and return custom exception or error 
      message for the unil-successful router --> 
    </catch-exception-strategy> 
</flow> 

Вы можете обрабатывать исключения локально и возвращать специальное исключение или ошибка сообщение для до-успешного маршрутизатора, чтобы поймать, используя следующий атрибут: failureExpression = «исключение типа: java.lang.NumberFormatException»

Вот фиктивный пример, который я залетела бросить NumberFormatException, бревенчатый исключение в стратегии исключения и повторить:

<flow name="test" doc:name="test"> 
     <http:inbound-endpoint address="http://localhost:8081/test" 
      doc:name="HTTP" /> 

     <until-successful objectStore-ref="OS_Bean" 
      maxRetries="2" secondsBetweenRetries="2" doc:name="Until Successful"> 
      <processor-chain doc:name="Processor Chain: Wait For Web Service Response"> 
       <processor-chain doc:name="Processor Chain: Web Service"> 
        <flow-ref name="externalCallFlow" doc:name="Flow Reference" /> 
       </processor-chain> 
      </processor-chain> 
     </until-successful> 

    </flow> 
    <flow name="externalCallFlow" doc:name="externalCallFlow"> 
     <scripting:component> 
      <scripting:script engine="groovy"> 
       throw new java.lang.NumberFormatException(); 
       </scripting:script> 
     </scripting:component> 
     <default-exception-strategy> 
      <processor-chain> 
       <logger level="ERROR" 
        message="NumberFormatException Occurred : #[message.payload.getException().getCause()]" /> 
       <scripting:component> 
        <scripting:script engine="groovy"> 
         throw message.payload.getException().getCause(); 
       </scripting:script> 
       </scripting:component> 
      </processor-chain> 
     </default-exception-strategy> 
    </flow> 
+0

Прежде всего спасибо за ре sponse. Если getCode() возвращает исключение, например NumberFormatException, как я могу задать в качестве полезной нагрузки это имя исключения в сообщении в стратегии исключения? Моя цель - отправить почту с заброшенным исключением. Я не хочу получать SOAPFaultException, но NumberFormatException –

+0

Обновлен ответ о том, как установить полезную нагрузку для исключения и т. Д. –

+0

Извините Ryan, где обновление? –