2014-11-17 33 views
1

如果在Spring XD流中從一個「過濾器」傳遞到下一個「過濾器」的消息有效負載是一個自定義Java類實例,那麼我假設需要某種序列化機制「管道」之間是遠程運輸。在Spring中通過遠程傳輸傳遞Java對象XD

  1. 在這種情況下,Spring XD有什麼樣的「序列化」/「轉換」?
  2. Java序列化是否適用於這種情況?如果自定義類是可序列化的,Spring XD會自動將對象序列化/反序列化,還是需要在流定義/模塊定義中提供一些提示?

感謝, 西蒙

回答

3

XD使用KRYO序列化與遠程傳輸。 Java.io.serialization在理論上是可行的,但是我們不希望假設有效載荷類型實現java.io.Serializable。另外,如果有效載荷是可序列化的,我個人認爲在Kryo上自動選擇Java序列化沒有任何優勢。通過Spring XD的type conversion支持Java序列化。

你應該能夠創建一個包含像流:

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

在這種情況下,類型轉換將使用Java序列化擊中運輸前。消息總線將檢測到有效負載是一個字節數組,並將按原樣直接發送到下一個模塊。包含字節的消息會將content-type頭設置爲已聲明的outputType,以便可以使用入站轉換器的Java序列化對其進行反序列化。

以上要求有效負載實現Serializable。自定義有效負載類型也必須包含在Spring XD的類路徑中,例如,在每個已安裝的容器上添加一個jar到xd/lib。

+0

感謝您的迴應!在查看源代碼之後,我確實瞭解了遠程傳輸如何利用kryo序列化來編組Spring XD中的消息負載。這是我發現的:當查看redis-bus.xml文件時,messageBus有一個constructor-arg,它指向'codec'bean。 'codec'bean實際上是在codec.xml中定義的,它揭示了使用Kryo的類。然而,我想知道Spring應用程序,在這種情況下,如果我是正確的,XD容器如何設置跨越使用多個單獨的xml配置定義的上下文來組裝bean? –