【问题标题】:Passing Java Object via remote transport in Spring XD在 Spring XD 中通过远程传输传递 Java 对象
【发布时间】:2014-11-17 14:33:42
【问题描述】:

如果在 Spring XD 流中从一个“过滤器”传递到下一个“过滤器”的消息负载是自定义 Java 类实例,我想如果中间的“管道”是远程传输,则需要某种序列化机制.

  1. 在这种情况下,Spring XD 中提供了什么样的“序列化”/“转换”?
  2. Java 序列化是否适用于这种情况?而如果自定义类是可序列化的,Spring XD会自动序列化/反序列化对象吗,还是我们还需要在流定义/模块定义中给出一些提示?

谢谢, 西蒙

【问题讨论】:

    标签: spring-xd


    【解决方案1】:

    XD 使用带有远程传输的 Kryo 序列化。 Java.io.serialization 理论上可以工作,但是我们不想假设有效负载类型实现了 java.io.Serializable。此外,如果有效负载是可序列化的,我个人认为自动选择 Java 序列化而不是 Kryo 没有任何优势。通过 Spring XD 的 type conversion 支持 Java 序列化。

    您应该能够创建一个包含以下内容的流:

    filter1 --outputType=--application/x-java-serialized-object | filter2 --input-type=my.custom.SerializablePayloadType
    

    在这种情况下,类型转换将在传输之前使用 Java 序列化。消息总线将检测到负载是一个字节数组,并将其直接发送到下一个模块。包含字节的消息会将 content-type 标头设置为声明的 outputType,以便入站转换器可以使用 Java 序列化对其进行反序列化。

    以上要求payload实现Serializable。此外,自定义有效负载类型必须包含在 Spring XD 的类路径中,即,在每个已安装的容器上向 xd/lib 添加一个 jar。

    【讨论】:

    • 感谢您的回复!查看源代码后,我确实发现了远程传输如何利用 kryo 序列化来编组 Spring XD 中的消息负载。这是我发现的:当查看 redis-bus.xml 时,messageBus 有一个构造函数参数,它引用“编解码器”bean。 'codec' bean 实际上是在 codec.xml 中定义的,它揭示了在底层使用 Kryo 的类。但是,我想知道 Spring 应用程序,在这种情况下,如果我是正确的,XD 容器如何设法跨使用多个单独的 xml 配置定义的上下文来组装 bean?
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多