是否有示例项目显示如何将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
}
我遇到的主要问题是:
我的消费者没有使用我的主题。我可以看到生产者在Kafka中创建了主题,并且创建了客户组,但偏移量保持为0。
启动测试时出现问题,看起来好像创建了两个客户端实例,因此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)
答案 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