Mule:如何在执行文件出站之前确保有效负载处于可写状态

时间:2014-02-24 16:51:13

标签: mule

在我的<catch-exception-strategy>中,我将错误有效负载写入file。但有时当流程涉及Web服务调用且主机不可用或未知(例如,抛出java.net.UnknownHostException)时,有效负载不再是InputStreamString的实例。如果我尝试将错误记录到文件,则抛出以下异常:

exception.AbstractExceptionListener (AbstractExceptionListener.java:299) - 
********************************************************************************
Message               : Could not find a transformer to transform "SimpleDataType{type=org.apache.commons.httpclient.methods.PostMethod, mimeType='*/*'}" to "SimpleDataType{type=java.io.InputStream, mimeType='*/*'}".
Code                  : MULE_ERROR-65237
--------------------------------------------------------------------------------
Exception stack is:
1. Could not find a transformer to transform "SimpleDataType{type=org.apache.commons.httpclient.methods.PostMethod, mimeType='*/*'}" to "SimpleDataType{type=java.io.InputStream, mimeType='*/*'}". (org.mule.api.transformer.TransformerException)
  org.mule.registry.MuleRegistryHelper:252 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.api.transformer.TransformerException: Could not find a transformer to transform "SimpleDataType{type=org.apache.commons.httpclient.methods.PostMethod, mimeType='*/*'}" to "SimpleDataType{type=java.io.InputStream, mimeType='*/*'}".
    at org.mule.registry.MuleRegistryHelper.lookupTransformer(MuleRegistryHelper.java:252)
    at org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:355)
    at org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:313)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

我正在考虑在写入文件之前执行choice块以确保有效负载是可写的。我应该做#[payload instanceof java.io.InputStream]之类的事吗?但那么有效负载是DOM还是其他什么情况呢?请指教。

2 个答案:

答案 0 :(得分:0)

我会在catch异常策略中使用一个转换器,并在那里封装将考虑输入并产生可写有效负载的逻辑。

答案 1 :(得分:0)

如果要检查是否有可用于特定有效负载类型和输出类型的转换器,我猜您可以从注册表中查找可用的转换器。在Groovy中:

transformers = message.getMuleContext().getRegistry().lookupTransformers(
   new org.mule.transformer.types.SimpleDataType(payload.getClass()), 
   new org.mule.transformer.types.SimpleDataType(java.io.InputStream))
if (transformers.size() == 0) {
  //set some variable or whatever
}