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

我如何在Scala中使用属性值声明KafkaListener的主题

朱炳
2023-03-14

我有一个简单的Kafka/Scala项目,它创建了一个生产者。但是,现在我正在尝试创建消费者,当我使用以下代码时……

@Service
class KafkaService @Autowired()(producer: KafkaTemplate[String, Array[Byte]]){

  @Value("${spring.kafka.topic}") val topic : String = null

  def sendMessage(msg: String): Unit = {
    System.out.println(s"Writing the message $msg to the topic ${this.topic}")
    producer.send(topic, msg.getBytes());
  }

  @KafkaListener(id="test", topics="${this.topic}")
  def consume(record: ConsumerRecord[String, String]): Unit = {
    System.out.println(s"Consumed Strinsg Message : ${record.value()}")
  }

}

我得到以下错误…

[ERROR] ...\service\KafkaService.scala:26: error: type mismatch;
[ERROR]  found   : String("${this.topic}")
[ERROR]  required: Array[String]
[ERROR]   @KafkaListener(id="test", topics="${this.topic}")

我错过了什么?

我还尝试了以下方法。。。

@Configuration
public class CommonConfiguration{
    ...
    @Value("${spring.kafka.topic}")
    public String topic;
    ...
}
@Service
class KafkaService @Autowired()(producer: KafkaTemplate[String, Array[Byte]], config: CommonConfiguration){

  def sendMessage(msg: String): Unit = {
    val topics : Array[String] = config.getTopics();
    println(s"Writing the message $msg ${topics.mkString(" ")}")
    producer.send(config.topic, msg.getBytes());
  }

  @KafkaListener(id="test", topics="#{config.topic.split(',')}")
  def consume(record: ConsumerRecord[String, String]): Unit = {
    System.out.println(s"Consumed Strinsg Message : ${record.value()}")
  }

}

仍然没有运气,但生产者的控制台日志得到了正确的值。

共有2个答案

谢华彩
2023-03-14
@KafkaListener(id="scala", topics=Array("#{'${spring.kafka.topic}'.split(',')}"))

欲了解更多信息,请参阅此问题或此问题

鲁光霁
2023-03-14

错误表明您需要Array[String]类型作为主题,而您提供了String类型。您需要将主题字符串转换为数组。

注释看起来与Spring非常相似,您可以在其中执行以下操作

@Value("#{'${kafka.topic}'.split(',')}")
 类似资料:
  • 问题内容: 如何在Python中声明静态属性? 这里写了我如何声明一个方法: Python中的静态方法? 问题答案: 在Python的类级别定义的所有变量均被视为静态 在类中,您可以使用相同的名称拥有两个不同的变量(一个静态变量和一个普通变量)。不要困惑。

  • 我正在将ApacheFelixSCR注释迁移到OSGI声明性服务[AEM]。在迁移过程中,我无法在DS中找到基数的精确替换。 现有的SCR实施: 现在它在OSGi声明性服务中迁移如下 在DS注释实现中,我必须映射@Property中存在的参数基数。请推荐我

  • 我正在使用maven项目进行UI自动化,我需要在多个环境和多个浏览器中运行一些测试。我已经创建并添加了pom.xml文件,并声明了其中的属性。但是当我通过终端执行它时,我得到了错误。我用的命令- 错误-[信息]扫描项目...[ERROR][ERROR]处理POM时遇到一些问题:[FATAL]不可解析POM d:\work\cucumber_projects\ui-automation-projec

  • 问题内容: 在Scala中,我可以这样声明一个字节数组 这太冗长了。有没有更简单的方法来声明Byte数组,类似于Java的 请注意,由于String 中的,以下结果导致错误 问题答案: 我相信您能做的最短的是 您 必须 将和转换为字节,因为它们不是有效的字节文字,因为它们超出了有符号字节的范围([-128,127])。 请注意,Java也是如此,以下给出了编译错误: 您必须将192和168强制转换

  • 问题内容: 我希望能够用元数据注释我的类型和方法,并在运行时读取它们。 语言参考说明了如何声明属性用法,但实际上可以声明自己的属性吗? 阅读将需要某种反射机制,我根本无法在参考文献中找到这种反射机制,因此问题的第二部分可能是- 是否可能反射。如果这些功能在Swift中不可用,是否可以用Objective-C代码完成(但在Swift实例和类型上)? 相对不相关的注释:关于将什么建模为属性以及将哪些内

  • 问题内容: 对于上述代码,快速二进制文件抱怨“未处理错误,因为未将封闭函数声明为” throws”。 我如何在上面声明“ someProperty”“抛出”? 和 和 似乎不起作用。 问题答案: Swift 5更新:仍然不可能。 从Swift 3开始: 您不能从计算的属性中抛出。如果要抛出,必须使用一个函数。Swift编程语言末尾的“ 语言参考”部分的“声明”部分仅列出(和)作为函数和初始化声明的