批处理 - 无法反序列化对象
Batch Process - Could not deserialize object
我最近一直在玩 Batch 处理器,在测试中它运行良好。
我已经将它添加到我们的主要项目流程中,但我遇到了一个奇怪的问题。
Batch 进程本身只包含一个 Logger,发送给它的 payload 是一个 LineIterator。
我遇到的问题是抛出 SerializationException。奇怪的是第一次 运行 它在 运行 时抛出异常。之后它不会编译,抛出相同的异常。
这是流程中的批处理过程以及失败时的相关堆栈信息 build.The Mule 论坛上的此 post 附有完整跟踪: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;
}
我刚刚检查过,我可以在本地对同一文件进行批处理,所以这是此端点或其配置的问题。我可以配置此端点以将文件放在临时目录中并从那里读取吗?
批处理作业拆分原始有效负载(必须是 Collection 或 Iterator)将拆分后的消息(包括有效负载)序列化到其持久批处理队列中。
您的消息负载(拆分后)是否可序列化?
另一个问题是持久性:尝试检查 运行 配置中的 "Clear Application Data"。如果这没有帮助,请删除工作区中的目录 /mule/.mule/.mule/。
您可能知道批处理作业文档:
https://docs.mulesoft.com/mule-user-guide/v/3.8/batch-processing
我们最终发现了问题。
我们使用的是不可变映射类型的会话变量,虽然没有在批处理过程中的任何地方使用,但导致了上述错误。
作为批输入阶段的一部分删除此变量后,没有进一步的问题。
在 Anypoint Studio Mule 中 -> "Clear Application Data" 正如@rbutenuth 所说的那样对我有效
我最近一直在玩 Batch 处理器,在测试中它运行良好。
我已经将它添加到我们的主要项目流程中,但我遇到了一个奇怪的问题。
Batch 进程本身只包含一个 Logger,发送给它的 payload 是一个 LineIterator。
我遇到的问题是抛出 SerializationException。奇怪的是第一次 运行 它在 运行 时抛出异常。之后它不会编译,抛出相同的异常。
这是流程中的批处理过程以及失败时的相关堆栈信息 build.The Mule 论坛上的此 post 附有完整跟踪: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;
}
我刚刚检查过,我可以在本地对同一文件进行批处理,所以这是此端点或其配置的问题。我可以配置此端点以将文件放在临时目录中并从那里读取吗?
批处理作业拆分原始有效负载(必须是 Collection 或 Iterator)将拆分后的消息(包括有效负载)序列化到其持久批处理队列中。
您的消息负载(拆分后)是否可序列化?
另一个问题是持久性:尝试检查 运行 配置中的 "Clear Application Data"。如果这没有帮助,请删除工作区中的目录 /mule/.mule/.mule/。
您可能知道批处理作业文档:
https://docs.mulesoft.com/mule-user-guide/v/3.8/batch-processing
我们最终发现了问题。
我们使用的是不可变映射类型的会话变量,虽然没有在批处理过程中的任何地方使用,但导致了上述错误。
作为批输入阶段的一部分删除此变量后,没有进一步的问题。
在 Anypoint Studio Mule 中 -> "Clear Application Data" 正如@rbutenuth 所说的那样对我有效