Java Dataflow:pubsub消息的字符串

Java Dataflow:pubsub消息的字符串,java,google-cloud-dataflow,apache-beam,Java,Google Cloud Dataflow,Apache Beam,我试图在数据流中进行单元测试 对于该测试,在begging,我将从一个简单的硬编码字符串开始 问题是我需要将该字符串转换为pubsub消息。我得到了以下代码: // Create a PCollection from string a transform to pubsub message format PCollection<PubsubMessage> input = p.apply("input string", Create.of("test" +

我试图在数据流中进行单元测试

对于该测试,在begging,我将从一个简单的硬编码字符串开始

问题是我需要将该字符串转换为pubsub消息。我得到了以下代码:

    // Create a PCollection from string a transform to pubsub message format
    PCollection<PubsubMessage> input = p.apply("input string", Create.of("test" + 
            ""))
            .apply("convert to Pub/Sub message", ParDo.of(new DoFn<String, PubsubMessage>() {
                @ProcessElement
                public void processElement(ProcessContext c) {
                    c.output(new PubsubMessage(c.element().getBytes(), null));
                }
            }));
//创建一个从字符串转换为pubsub消息格式的PCollection
PCollection input=p.apply(“输入字符串”),Create.of(“测试”+
""))
.apply(“转换为发布/订阅消息”),第页,共页(新DoFn(){
@过程元素
公共void processElement(ProcessContext c){
c、 输出(新的PubsubMessage(c.element().getBytes(),null));
}
}));
但我得到了以下错误:

 java.lang.IllegalArgumentException: unable to serialize DoFnWithExecutionInformation{doFn=com.xxx.pipeline.TesterPipeline$1@7b64240d, mainOutputTag=Tag<output>, sideInputMapping={}, schemaInformation=DoFnSchemaInformation{elementConverters=[]}}
    at org.apache.beam.sdk.util.SerializableUtils.serializeToByteArray(SerializableUtils.java:55)
    <...>
Caused by: java.io.NotSerializableException: com.xxx.pipeline.TesterPipeline
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at org.apache.beam.sdk.util.SerializableUtils.serializeToByteArray(SerializableUtils.java:51)
    ... 50 more
java.lang.IllegalArgumentException:无法序列化DoFnWithExecutionInformation{doFn=com.xxx.pipeline.TesterPipeline$1@7b64240d,mainOutputTag=Tag,sideInputMapping={},schemaInformation=DoFnSchemaInformation{elementConverters=[]}
位于org.apache.beam.sdk.util.SerializableUtils.SerializationToByteArray(SerializableUtils.java:55)
原因:java.io.NotSerializableException:com.xxx.pipeline.TesterPipeline
位于java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
位于java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
位于java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
位于java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
位于java.io.ObjectOutputStream.WriteObject 0(ObjectOutputStream.java:1178)
位于java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
位于java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
位于java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
位于java.io.ObjectOutputStream.WriteObject 0(ObjectOutputStream.java:1178)
位于java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
位于org.apache.beam.sdk.util.SerializableUtils.SerializationToByteArray(SerializableUtils.java:51)
... 50多

如何从字符串创建pubsub消息?

您可以查看下面的链接,了解如何实现此目的-

您可以查看下面的链接,了解如何实现此目的-

在用户ParDos的可串行化要求中,它提到了以下内容:

使用匿名内部类实例内联声明函数对象时要小心。在非静态上下文中,内部类实例将隐式包含指向封闭类及其状态的指针。该封闭类也将被序列化,因此应用于函数对象本身的相同注意事项也适用于该外部类

发生的情况是,匿名DoFn隐式包含一个指向正在构建管道的类的指针,这导致了序列化失败。通过将DoFn设置为命名子类而不是匿名子类,可以避免这种情况:

public class MyDoFn extends DoFn<String, PubsubMessage>() {
  @ProcessElement
  public void processElement(ProcessContext c) {
    c.output(new PubsubMessage(c.element().getBytes(), null));
  }
}
公共类MyDoFn扩展了DoFn(){
@过程元素
公共void processElement(ProcessContext c){
c、 输出(新的PubsubMessage(c.element().getBytes(),null));
}
}
在用户ParDos的可串行化要求中,提到了以下内容:

使用匿名内部类实例内联声明函数对象时要小心。在非静态上下文中,内部类实例将隐式包含指向封闭类及其状态的指针。该封闭类也将被序列化,因此应用于函数对象本身的相同注意事项也适用于该外部类

发生的情况是,匿名DoFn隐式包含一个指向正在构建管道的类的指针,这导致了序列化失败。通过将DoFn设置为命名子类而不是匿名子类,可以避免这种情况:

public class MyDoFn extends DoFn<String, PubsubMessage>() {
  @ProcessElement
  public void processElement(ProcessContext c) {
    c.output(new PubsubMessage(c.element().getBytes(), null));
  }
}
公共类MyDoFn扩展了DoFn(){
@过程元素
公共void processElement(ProcessContext c){
c、 输出(新的PubsubMessage(c.element().getBytes(),null));
}
}