DataFlow ProcessContext输出异常ClosedChannelException

时间:2015-11-20 21:17:41

标签: google-cloud-dataflow

我正在从流中解析XML,并将POJO调度到ProcessContext.output。 它正在抛出ClosedChannelException之后。 知道发生了什么事吗?

com.google.cloud.dataflow.sdk.util.UserCodeException: java.nio.channels.ClosedChannelException
    at com.google.cloud.dataflow.sdk.util.DoFnRunner.invokeProcessElement(DoFnRunner.java:193)
    at com.google.cloud.dataflow.sdk.util.DoFnRunner.processElement(DoFnRunner.java:171)
    at com.google.cloud.dataflow.sdk.runners.worker.ParDoFnBase.processElement(ParDoFnBase.java:193)
    at com.google.cloud.dataflow.sdk.util.common.worker.ParDoOperation.process(ParDoOperation.java:52)
    at com.google.cloud.dataflow.sdk.util.common.worker.OutputReceiver.process(OutputReceiver.java:52)
    at com.google.cloud.dataflow.sdk.runners.worker.ParDoFnBase$1.output(ParDoFnBase.java:157)
    at com.google.cloud.dataflow.sdk.util.DoFnRunner$DoFnContext.outputWindowedValue(DoFnRunner.java:329)
    at com.google.cloud.dataflow.sdk.util.DoFnRunner$DoFnProcessContext.output(DoFnRunner.java:483)
    at com.myproj.dataflow.MyDocDispatcher.onMyDoc(MyDocDispatcher.java:24)

1 个答案:

答案 0 :(得分:1)

可能的原因是,执行XML处理以生成POJO的DoFn实际上懒得产生POJO。当您将POJO传递给ProcessContext#output()时,它可能会根据优化程序直接传递给管道中的其他DoFn

在这种情况下,如果与POJO交互的下游DoFn对收到的POJO有一些副作用,则会违反immutability requirements,因为与从{{{{}收到的POJO进行交互1}}修改它。

如果这是问题,最简单的解决方法是在将POJO传递给ProcessContext#element()之前克隆它。