将Kafka与Micronaut结合使用

时间:2018-11-02 10:40:09

标签: apache-kafka micronaut

是否有示例项目显示如何将Kafka与Micronaut一起使用?我在使其正常工作时遇到问题。

我有以下生产者:

@KafkaClient
interface AppClient {

@Topic("topic-name")
    void sendMessage(@KafkaKey String id, Event event)
}

和听众:

@KafkaListener(
    groupId="group-id",
    offsetReset = OffsetReset.EARLIEST
)
class AppListener {

@Topic("topic-name")
    void onMessage(Event event) {
        // do stuff
    }
}

我的application.yml包含:

kafka:
  bootstrap:
    servers: localhost:2181

和application-test.yml(这是正确的,是否应与application.yml位于同一目录中。还要不确定应如何使用嵌入式服务器):

kafka:
  #  embedded:
  #    enabled: true
  #    topics: promo-api-promotions
  bootstrap:
    servers: localhost:9092

我的测试如下:

@MicronautTest
class AppSpec extends Specification {

@Shared
@AutoCleanup
EmbeddedServer server = ApplicationContext.run(EmbeddedServer)

@Shared
private AppClient appClient =
        server.applicationContext.getBean(AppClient)

def 'The upload endpoint is called'() {
  // test here
  appClient.sendMessage(id, event)
  // other test stuff
}

我遇到的主要问题是:

  1. 我的消费者没有使用我的主题。我可以看到生产者在Kafka中创建了主题,并且创建了客户组,但偏移量保持为0。

  2. 启动测试时出现问题,看起来好像创建了两个客户端实例,因此MBean注册失败(另外,如果我尝试使用嵌入式Kafka,则会得到不同的结果关于端口9092已被使用的消息,因为它试图启动服务器两次):

    javax.management.InstanceAlreadyExistsException: kafka.consumer:type = app-info,id = app-kafka-client-app-listener 在com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437) com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1898)

2 个答案:

答案 0 :(得分:0)

设法解决第二个问题-传递给侦听器的对象没有@JsonCreator。我通过尝试使用Jackson对象映射器在游戏时从其JSON构造对象来发现这一点。

如果其他人有同样的问题-请确保对象模型可以与Jackson一起使用,然后再继续!

答案 1 :(得分:0)

您应该将嵌入式配置kafka.embedded.enabled添加到具有配置的映射中,然后将其传递给ApplicationContext.run方法。

Map<String, Object> config = Collections.
    unmodifiableMap(new HashMap<String, Object>() {
        {
            put(AbstractKafkaConfiguration.EMBEDDED, true);
            put(AbstractKafkaConfiguration.EMBEDDED_TOPICS, "test_topic");
    }
});

try (ApplicationContext ctx = ApplicationContext.run(config)) {

使用者在另一个线程中从Kafka进行消费,您必须等待一段时间,直到AppListener赶上来。 您可以在KafkaProducerListenerTest

中看到一个简短的示例

请记住Micronaut文档中描述的Kafka依赖项:Embedding Kafka