gpt4 book ai didi

kotlin - SmallRye Reactive Messaging的Emitter <>。send无法通过Quarkus的AMQP代理在Kotlin中发送

转载 作者:行者123 更新时间:2023-12-02 12:57:39 25 4
gpt4 key购买 nike

目前,我正在尝试基于Kotlin中的Maven,Quarkus和SmallRye Reactive Messaging编写“通知服务”。
作为基础,我有一个使用Java的示例,它可以正常工作,并且我试图将其“翻译”成Kotlin。

我希望它的工作方式是,我发送一个HTTP请求(例如GET http://localhost:8080/search/ {word}),然后系统将“word”(这里是一个字符串)发送到Artemis AMQP消息Broker的队列“查询”。
另一个系统订阅消息Broker,并根据HTTP请求(例如GET http://localhost:8080/receiver)获取队列“查询”中的“单词”。

但是,在Kotlin中,它不起作用,我最好的猜测是,Emitter不会像Java中那样发送“单词”。

这是我正在使用的代码:

Kotlin

发送

import io.smallrye.reactive.messaging.annotations.Emitter
import io.smallrye.reactive.messaging.annotations.Stream
import javax.ws.rs.GET
import javax.ws.rs.Path
import javax.ws.rs.PathParam


@Path("/search")
class ExampleService {


@Stream("queries")
val queryEmitter: Emitter<String>? = null



@GET
@Path("/{word}")
fun search(@PathParam("word") word: String?): String {

println("about to send word: " + word!!)

if (word.isNotEmpty()) {

var qE=queryEmitter?.send(word)
println("Emitter return : $qE")
return word
}
return "word was empty"
}


}

接收
import org.eclipse.microprofile.reactive.messaging.Incoming
import javax.ws.rs.GET
import javax.ws.rs.Path
import javax.ws.rs.Produces
import javax.ws.rs.core.MediaType


@Path("/receiver")
class AdsResource {


var word : String = "nothing happened so far"

@GET
@Produces(MediaType.TEXT_PLAIN)
fun getWords(): String {
return word
}


@Incoming("sink")
fun consume(message: String) {
println("got user query: $message")
word = message
}
}

这是 Java 版本

发送
import io.smallrye.reactive.messaging.annotations.Emitter;
import io.smallrye.reactive.messaging.annotations.Stream;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;



@Path("/search")
public class SearchEndpoint {

@Stream("queries")
Emitter<String> queryEmitter;


@GET
@Path("/{word}")
public String search(@PathParam("word") String word) {

System.out.println("about to send word: " + word);

if (!word.isEmpty()) {

Emitter<String> qE = queryEmitter.send(word);
System.out.println("Emitter return: " + qE);
return word;
}

return "word was empty" ;
}

}

接收
import org.eclipse.microprofile.reactive.messaging.Incoming;
import javax.ws.rs.GET;
import javax.ws.rs.Path;


@Path("/receiver")
public class AdsResource {

private String word = "";


@GET
public String getAd() {
System.out.println("got user query: " + word);
return word;
}
@Incoming("sink")
public void consume(String message) {
System.out.println("got user query: " + message);
word = message;
}


}

这里是针对Kotlin和Java的配置文件'application.properties'
# Configures the AMQP broker credentials.
amqp-username=quarkus
amqp-password=quarkus

# Configure the AMQP connector to write to the `queries ` address
mp.messaging.outgoing.queries.connector=smallrye-amqp
mp.messaging.outgoing.queries.address=sink
mp.messaging.outgoing.queries.durable=true


# Configure the AMQP connector to read from the `queries ` queue
mp.messaging.incoming.sink.connector=smallrye-amqp
mp.messaging.incoming.sink.durable=true

一些信息:
  • 我通过基于此guide的docker-compose运行AMQP消息代理。
  • Smallrye Reactive Messaging

  • 在此先感谢您,如果我错过了提供信息的时间,请告诉我。

    最佳答案

    问题归结为Kotlin在字节码中添加@Stream注释的位置。

    从根本上解决您的问题,您需要更换:

    @Stream("queries")


    @field: Stream("queries")

    关于kotlin - SmallRye Reactive Messaging的Emitter <>。send无法通过Quarkus的AMQP代理在Kotlin中发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57960858/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com