关于kotlin:Vert.x反应式Kafka客户端:编写时链接不起作用?

 2021-04-09 

Vert.x Reactive Kafka client: chaining not working when writing?

我正在使用io.vertx.reactivex.kafka.client.producer.KafkaProducer客户端。客户有一个
返回x2的rxWrite函数。但是,我需要在写操作期间记录错误(如果有)。显然它没有被执行。

我写了以下工作示例。

test():测试链接和日志记录的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    fun test(): Single<Int> {
    val data = Single.just(ArrayList<String>().apply {
        add("Hello")
        add("World")
    })

    data.flattenAsObservable<String> { list -> list }
        .flatMap { advertiser ->
       //does not work with writeKafka
            writeError(advertiser).toObservable().doOnError({ println("Error $data") })
        }
        .subscribe({ record -> println(record) }, { e -> println("Error2 $e") })

    return data.map { it.size }
}

writeKafka:将给定的给定字符串写入Kafka并返回Single

1
2
3
4
5
fun writeKafka(param: String): Single<RecordMetadata> {
 //null topic to produce IllegalArgumentException()
    val record = KafkaProducerRecord.create(null, UUID.randomUUID().toString(), param)
    return kafkaProducer.rxWrite(record)
}

writeError:总是返回错误类型相同的单个

1
2
3
fun writeError(param: String): Single<RecordMetadata> {
    return Single.error<RecordMetadata>(IllegalArgumentException())
}

因此,当我呼叫writeKafka时,它只会打印Error2,但是如果我使用writeError,它会同时打印ErrorError2。看来writeKafka返回的单曲仍在等待结果,但是为什么还要打印Error2

我是RxJava2的新手,有人可以指出其中的任何错误吗?


读取并发布错误的堆栈跟踪很重要,这样可以隔离问题。

在这种情况下,您似乎从create获得了IllegalArgumentException,却没有得到任何Single,因为相关的Kafka类将其抛出了。 return kafkaProducer.rxWrite(record)根本不会执行,实际上会使flatMap崩溃。 doOnError永远不会起作用,因此仅打印" Error2"。