我在试图使用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的经纪人。
答案 0 :(得分:1)
Spring Cloud Stream StreamListener的@Input参数类型仅支持反应堆类型1: {
areaOpacity: 1,
color: '#000000',
lineWidth: 0,
type: 'area',
visibleInLegend: false,
enableInteractivity: false
},
,因为它非常适合反应流应用程序,而不是@Input参数类型的Flux
。