单<>使用Spring Cloud Stream

时间:2017-05-31 12:37:11

标签: spring spring-cloud-stream

我在试图使用Reactor中的Mono和Spring Cloud Stream时遇到了一个问题,并且无法弄清楚发生了什么。

想象一下,我有一个这样的倾听者:

@StreamListener
@Output(Urls.OUTUT)
public Flux<String> expandUrls(@Input(Urls.INPUT) Flux<String> urlFormats)
{
    return urlFormats
        .map(this::expandUrl)
        .flatMapIterable(urls -> urls);
}

所以它基本上将像这样http://www.example.com/page/%d格式化的网址扩展为类似

的内容

http://www.example.com/page/1

http://www.example.com/page/2

http://www.example.com/page/3

它按预期工作,但当我尝试这样做时:

@StreamListener
@Output(Urls.OUTPUT)
public Flux<String> expandUrls(@Input(Urls.INPUT) Mono<String> urlFormats)
{
    return urlFormats
        .repeat(3)
        .zipWith(pageNumbers)
        .map(this::formatUrl);
}

其中pageNumber为Flux.fromStream(Stream.iterate(1, p -> p+1).limit(3))

我收到以下异常

Caused by: java.lang.IllegalArgumentException: A method annotated with @StreamListener may use @Input or @Output annotations only in declarative mode and for parameters that are binding targets or convertible from binding targets.

我像这样做了

,摆脱了异常
@StreamListener(value = Urls.INPUT)
@Output(Urls.OUTPUT)
public Flux<String> expandUrls(Mono<String> urlFormats)
{
    return urlFormats
        .repeat(3)
        .zipWith(pageNumbers)
        .map(this::formatUrl);
}

但现在我明白了:

Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'http': was expecting ('true', 'false' or 'null')
 at [Source: http://www.example.com/page-%d,1,0.html;

我的问题是:如何将Mono与Spring Cloud Stream结合使用。甚至可以像这样使用它吗?如果是,那该怎么办? 哦,我正在使用Kafka作为kafka-starter的经纪人。

1 个答案:

答案 0 :(得分:1)

Spring Cloud Stream StreamListener的@Input参数类型仅支持反应堆类型1: { areaOpacity: 1, color: '#000000', lineWidth: 0, type: 'area', visibleInLegend: false, enableInteractivity: false }, ,因为它非常适合反应流应用程序,而不是@Input参数类型的Flux