【问题标题】:Batch Process - Could not deserialize object批处理 - 无法反序列化对象
【发布时间】:2023-03-15 14:44:01
【问题描述】:

我最近一直在玩 Batch 处理器,在测试中它运行良好。

我已经将它添加到我们的主要项目流程中,但我遇到了一个奇怪的问题。

Batch 进程本身只包含一个 Logger,发送给它的有效负载是一个 LineIterator。

我遇到的问题是它抛出了 SerializationException。奇怪的是它第一次运行时会在运行时抛出异常。之后它将无法编译,抛出相同的异常。

这是流程中的批处理过程和构建失败时的相关堆栈信息。完整的跟踪附在 Mule 论坛上的这篇文章中:https://forums.mulesoft.com/questions/65671/batch-process-could-not-deserialize-object.html

 <batch:job name="revenue-batch-Flow" block-size="10">
 <batch:process-records>
     <batch:step name="Batch_Step" accept-expression="#[!org.apache.commons.lang.StringUtils.isBlank( payload )]">
         <logger message="#[payload]" level="INFO" doc:name="Logger"/>
     </batch:step>
 </batch:process-records>
</batch:job>

 Caused by: com.esotericsoftware.kryo.KryoException: java.lang.UnsupportedOperationException
 Serialization trace:
 value (org.mule.transformer.types.TypedValue)
 properties (org.mule.session.DefaultMuleSession)
 session (org.mule.DefaultMuleEvent)
 muleEvent (com.mulesoft.module.batch.DefaultBatchJobInstance)

对导致这种奇怪行为的原因有什么想法吗?

更新

只是为了添加一些上下文。我正在尝试遍历从 SFTP 读取的文件中的行。

此端点本身是在 Java 组件的流程中创建的:

    @Override
public Object onCall(MuleEventContext muleEventContext) throws Exception {

    String sftpUri = muleEventContext.getMessage().getProperty( "sesSftpUri", PropertyScope.SESSION);

    EndpointBuilder endpointBuilder = muleEventContext.getMuleContext().getEndpointFactory().getEndpointBuilder( sftpUri );
    endpointBuilder.addMessageProcessor(new MessageFilter(new FilenameWildcardFilter(muleEventContext.getMessage().getProperty( "sesFileName", PropertyScope.SESSION)) ));

    InboundEndpoint inboundEndpoint = endpointBuilder.buildInboundEndpoint();

    MuleMessage muleMessage = inboundEndpoint.request(30000L);

    return muleMessage;
}

我刚刚检查过,我可以在本地批处理同一个文件,所以这是此端点或其配置的问题。我可以将此端点配置为将文件放在临时目录中并从那里读取吗?

【问题讨论】:

  • 添加了一个更新,问题似乎与在流程中创建的端点有关。

标签: mule deserialization mule-studio batching


【解决方案1】:

批处理作业拆分原始有效负载(必须是集合或迭代器)将拆分的消息(包括有效负载)序列化到其持久批处理队列中。

您的消息负载(拆分后)是否可序列化?

另一个问题是持久性:尝试在运行配置中检查“清除应用程序数据”。如果这样做没有帮助,请删除工作区中的目录 /mule/.mule/.mule/。

你可能知道批处理作业文档:

https://docs.mulesoft.com/mule-user-guide/v/3.8/batch-processing

【讨论】:

  • 嗨,Roger,LineIterator 应该返回字符串,我之前可以批处理。我尝试按照您的建议清除应用程序数据并删除 /.mule 目录,但问题仍然存在。
  • 你试过调试器吗?如果用集合拆分器或 for each 循环替换批处理会怎样?
  • 嗨,罗杰,我已经更新了我原来的帖子,提供了更多细节。我需要调查是否是我自己实例化端点的方式导致了这个问题的出现。我在工作中被拖到另一项任务中,当我有机会重新访问此流程时,我会更新我的发现。
【解决方案2】:

我们最终发现了问题。

我们使用的是不可变映射类型的会话变量,虽然没有在批处理过程中的任何地方使用,但导致了上述错误。

在批处理输入阶段删除此变量后,没有其他问题。

【讨论】:

    【解决方案3】:

    在任何时候 Studio Mule -> 正如@rbutenuth 所说,“清除应用程序数据”对我有用

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 1970-01-01
      • 2014-08-04
      • 2015-05-29
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多