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

accountledgement.accountled()在Spring中抛出异常-kafka@kafkalistener

萧奇
2023-03-14

当我将enable.auto.commit设置为false并尝试使用基于注释的spring-kafka@kafkalistener手动提交偏移量时,我会得到一个org.springframework.kafka.Listener.listenerExecutionFailedException:无法用传入消息调用侦听器方法

我有一个非常简单的代码如下:

@KafkaListener(id = "someid", topics = "${demo.topic}", containerFactory = "someContainerFactory")
public void listenFooGroup(String message, Acknowledgement ack) {
    System.out.println("Received Messasge in group 'foo': " + message);

    // TODO: Do something with the message
}

并且当我从生产者发送消息时,我得到以下异常:

Listener.ExecutionFailedException:无法使用传入消息调用侦听器方法。

终结点处理程序详细信息:

方法[public void com.****.****.******.KafkaMessageListener.ListenFoogroup(java.lang.String,org.SpringFramework.Kafka.Support.Acknowdgment)]

Bean[com.****.*****.******.kafkamessageListener@5856DBE4];嵌套异常为org.springframework.messaging.converter.messageConversionexception:无法处理消息;嵌套异常为org.springframework.messaging.converter.messageConversionexception:无法将GenericMessage[payload=test,headers={kafka_offset=57,kafka_receivedmessagekey=null,kafka_receivedpartitionid=0,kafka_receivedtopic=demotopic}]、failedmessage=GenericMessage[payload=test,headers={kafka_offset=57,

请帮帮忙。蒂娅。

共有1个答案

那存
2023-03-14

您必须将容器工厂的containerpropertiesackMode设置为manualmanual_immedial以获取确认对象

对于其他ack模式,容器负责提交偏移量。

factory.getContainerProperties().setAckMode(AckMode.MANUAL_IMMEDIATE)

如果使用Spring Boot,则设置....ackmode属性

 类似资料:
  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 我在Spring/Hibernate网络应用程序上有以下代码: 实体: 听众: 此代码在实体上每次更新或持久化后调用。问题在于,当为负数量引发异常时,hibernate将上的

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • 问题内容: 我有一个关于Java中重新引发异常的非常简单的问题。 这是代码片段: 为什么我们需要在第一个版本中重新抛出,而第二个版本看起来更优雅?可能有什么好处,并且优先选择哪个版本? 问题答案: 你是对的。第二版更好。而且,第一个版本没有任何意义。除了异常的堆栈跟踪为“错误”之外,它的功能相同。 有“重新抛出”异常的原因如下: 如果您之前有事要做。 如果捕获一种类型的异常并抛出另一种类型的异常:

  • 这是可能的在Java抛出任何异常,即使它是刚刚宣布抛出的时刻,下面的例子: 请分享你对这种方法的好坏的看法。 同样的问题是扩展RuntimeException(这不是抽象的)并立即扔掉它。

  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写