我正在使用 Mule 社区版 3.4。我对 UntilSuccessful 组件有疑问。现在该场景已公开:我有一个由 UntilSuccessful 组件组成的流,其中有一个向 Web 服务发出请求的 SOAP 组件。在这个流程中,也有一个 ExcpetionStrategy。我遇到的问题是,当UntilSuccessful 内部(即SOAP 组件中)发生异常时,ExcpetionStrategy 无法处理它,因为它(抛出的异常)是由UntilSuccessful 组件内部的某种机制处理的。因为我需要在 ExcpetionStrategy 中处理异常,所以我想构建一个自定义出站拦截器(在 SOAP 组件内部)来拦截 SOAP 响应(如果它被抛出则异常)并且能够抛出异常以触发例外策略。谁能帮我解决这个问题?我试图阅读文档,但它很少,并且没有很好地解释如何构建自定义出站异常。我要做的是将抛出的异常的名称保存在某处(即,如果服务器抛出 NumberFormatException,我会将其名称保存在某处以便在 ExceptionStrategy 中使用它)
下面你可以看到一段 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>
在这里,您可以看到公开 Web 服务的服务器:
<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,Web Service 的实现。如果在 getCode() 函数中作为参数传递的字符串是错误的,那么您如何看到,抛出异常,我希望它由客户端中定义的异常策略管理
@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;
}
}