SmallRye反应式消息传递&x27;s发射器<>;。发送不';t通过与Quarkus的AMQP代理发送Kotlin
目前,我正试图在Kotlin中编写一个基于Maven、Quarkus和SmallRye反应式消息传递的“通知服务”。 作为一个基础,我有一个Java示例,它运行良好,我试图将其“翻译”为Kotlin 我希望它工作的方式是,我发送一个HTTP请求(例如GET{word}),系统将“word”(这里是一个字符串)发送到Artemis AMQP消息代理的队列“querys”。 另一个系统订阅MessageBroker,并根据HTTP请求(例如GET)获取队列“查询”中的“单词” 然而,在Kotlin中,它不起作用,我最好的猜测是,发射器不像Java那样发送“单词” 下面是我正在使用的代码: Kotlin 发送SmallRye反应式消息传递&x27;s发射器<>;。发送不';t通过与Quarkus的AMQP代理发送Kotlin,kotlin,amqp,reactive,quarkus,smallrye-reactive-messaging,Kotlin,Amqp,Reactive,Quarkus,Smallrye Reactive Messaging,目前,我正试图在Kotlin中编写一个基于Maven、Quarkus和SmallRye反应式消息传递的“通知服务”。 作为一个基础,我有一个Java示例,它运行良好,我试图将其“翻译”为Kotlin 我希望它工作的方式是,我发送一个HTTP请求(例如GET{word}),系统将“word”(这里是一个字符串)发送到Artemis AMQP消息代理的队列“querys”。 另一个系统订阅MessageBroker,并根据HTTP请求(例如GET)获取队列“查询”中的“单词” 然而,在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
}
}
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;
}
}
这是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")
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
}
}
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
一些信息:
- 我在docker中运行的AMQP消息代理就是基于此编写的
提前感谢,如果我没有提供信息,请告诉我。问题归结为Kotlin在字节码中添加了
@Stream
注释
基本上,要解决您的问题,您需要更换:
@Stream("queries")
与
您好,您是否尝试将
@Inject
添加到用@Stream
注释的字段中?我怀疑这是问题所在,但只是想涵盖所有基本内容。那么,您是否在github上同时拥有这两个版本,以便我可以试一试?您好@Geo,“@Inject”不幸的是,也只会给我一个“未满足的解决方案例外:未满足的依赖关系”错误:这是Github项目的链接。提前谢谢。这个周末我会去看看的希望嘿,非常感谢。工作完美。然而,我不明白有什么区别。你能简单地解释一下发生了什么吗?很高兴听到!我在这里基本上描述了这个问题: