簡體   English   中英

是否可以禁用特定方法的 spring-cloud-stream 的功能綁定?

[英]Is it possible to disable spring-cloud-stream's functional binding for a specific method?

我有一個基於 Spring Boot 的庫(使用 spring-data-mongo),它創建了一個PersistentEntities bean。 PersistentEntities恰好實現了Supplier<T>接口,因此 Spring Cloud Stream 功能綁定器正在為其創建綁定。 更具體地說, BeanFactoryAwareFunctionRegistry.discoverDefaultDefinitionIfNecessary發現它是一個類型為Supplier的 bean。

我們正在使用 Spring Cloud Streams Kafka 綁定器,因此 Spring 嘗試將這些對象中的每一個發布到它創建的 Kafka 主題。 這會導致 JSON 序列化程序中出現無限遞歸問題:

2019-12-04 15:36:54.323 錯誤 1 ​​--- [調度-1] osihLoggingHandler:org.springframework.messaging.MessagingException:調用方法失敗; 嵌套異常是 org.springframework.messaging.converter.MessageConversionException:無法寫入 JSON:無限遞歸(StackOverflowError)(通過參考鏈:org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity["idProperty"] -> org. springframework.data.mongodb.core.mapping.CachingMongoPersistentProperty["owner"] -> org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity["idProperty"] -> org.springframework.data.mongodb.core.mapping。 CachingMongoPersistentProperty["owner"] -> org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity["idProperty"] -> org.springframework.data.mongodb.core.mapping.CachingMongoPersistentProperty["owner"] -> org. springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity["idProperty"] -> org.springframework.data.mongodb.core.mapping.CachingMongoPersistentProperty["owner"] -> org.springframework.data.mongodb.core.mapping。 BasicMongoPersistentEntity["idProperty"] -> org.springframewor k.data.mongodb.core.mapping.CachingMongoPersistentProperty["owner"] -> org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity["idProperty"] -> org.springframework.data.mongodb.core.mapping。 CachingMongoPersistentProperty["owner"] ...

有沒有辦法從函數綁定中排除我的 bean? 使用這個庫的項目沒有使用 Spring Cloud Function,但我更願意保留這種可能性。

作為參考,我的 bean 定義為:

@Bean
public PersistentEntities myPersistentEntities(List<MongoTemplate> mongoTemplates) {
    return new PersistentEntities(() -> {
        List<MappingContext<?, ?>> mappingContexts = mongoTemplates.stream().map(t -> t.getConverter().getMappingContext()).collect(Collectors.toList());
        return mappingContexts.iterator();
    });
}

我們剛剛將 Spring Cloud 從 Greenwich 升級到 Hoxton,因此自動功能綁定對我們來說是新的。

通常,您可以通過將 spring-cloud-function 顯式排除為

@SpringBootApplication(exclude = ContextFunctionCatalogAutoConfiguration.class)

也就是說,請提出一個問題 - https://github.com/spring-cloud/spring-cloud-stream/issues 之前已經出現過這種變體,我開始相信我們需要一個比上述更好的解決方案。

另一種解決方法是明確指定spring.cloud.function.definition=blah屬性,其中blah是不存在的東西。 丑陋,但確實有效,並且不需要重新編譯,因為不涉及注釋或附加屬性。

但正如我所說,請提出一個問題,鏈接到這篇文章,我們將在今年年底之前為 SR1 解決這個問題。

所以,我遇到了類似的事情。 TL;DR 修復是明確定義可用於 Spring Cloud Streams 的函數,如下所示:

消費者 Bean 名稱: inputConsumer

spring:
  cloud:
    stream:
      function:
        bindings:
          inputConsumer-in-0: DataInputBinding
        definition: inputConsumer
      bindings:
        DataInputBinding:
          binder: kinesis
          destination: whatever
          group: whatever

在我的情況下,我的應用程序有另一個實現Supplier spring Component 沒有在配置中顯式定義函數,Spring Cloud Streams 只是將所有FunctionConsumerSupplier bean 添加到FunctionCatalog ,然后期望它們都附加到流中。

顯然,如果它們不是,那么它只是不附加任何一個並且沒有任何作用。 :/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM