当前位置: 首页 > 知识库问答 >
问题:

SmallRye Reactive Messaging的Emitter. send不会通过带有Quarkus的AMQP代理以静态编程语言发送

巫马承德
2023-03-14

目前,我正在尝试在Kotlin编写基于Maven、Quarkus和SmallRye Reactive Messaging的“通知服务”。作为基础,我在Java中有一个很好的例子,我试图将其“翻译”成Kotlin。

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

然而,在静态编程语言中,它不起作用,我最好的猜测是,发射器不像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;
   }


}

这里是静态编程语言和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消息代理基于此指南编写
  • Smallrye响应式消息传递

提前致谢,如果我错过了提供信息,请告诉我。

共有1个答案

万俟招
2023-03-14

问题在于Kotlin在字节码中添加了@Stream注释。

本质上,要解决您的问题,您需要替换:

@Stream("queries")

具有

@field: Stream("queries")
 类似资料:
  • 我有两个单选组(组1和组2),分别包含3个单选按钮。我用这个准则把左右两列分开,各占一半。由于两个无线组是分开的,当用户单击组1时,我希望清除组2中的选定项(如果有)。任何想法都可以做到,因为我是由Kotlin编写的,所以我在stackoverflow ConstraintLayout、RadioGroup和RadioButton RadioGroup的两列中找到了一些示例,其中两列有十个单选按钮

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 我想从< code>local.properties文件中检索如下所示的密钥: 并通过gradle静态编程语言DSL将此值保存在我的中。稍后可以从我的项目中访问该字段。

  • 暴露0.27.1是否能够翻译以下SQL语句? 下面是我尝试的内容,但不幸的是,子查询独立于查询的其余部分工作。 此外,如果可能的话,那么如何使用别名从ResultRow获取结果?在这个示例之后,解决方案似乎是将整个子查询存储在单个变量中,并使用一个alias()方法调用,但这看起来很难看。有没有更好的方法?

  • 我试图发送一个用户到一个活动的基础上,如果他们的电子邮件被验证,然后如果他们有一个用户名。到目前为止,我的代码如下所示: 和 我如何通过活动?我试着将它作为字符串传递,但没有成功。我做错了什么?

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。