在@KafkaListener

时间:2018-01-26 03:39:45

标签: java spring spring-kafka

我正在考虑将@SendTo注释与@KafkaListener注释一起使用。我将收到一条消息,将进行最小的计算,这将只是一个方法调用。但是,该方法有可能引发异常。在这种情况下,我将抛出然后捕获异常(想要抓住它)。在这种情况下,是否有可能不将对象/字符串转发到主题上,因为在我的系统中,发生的异常应该足够合理,对象/字符串格式错误且不适合进一步使用?

编辑 -

所以我在思考类似于@ cacheable-的内容,除非?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

我认为@Cacheable.unless()在这里有点误导:

/**
 * Spring Expression Language (SpEL) expression used to veto method caching.
 * <p>Unlike {@link #condition}, this expression is evaluated after the method
 * has been called and can therefore refer to the {@code result}.

您会看到它是针对方法结果执行的。在您的情况下,您正在讨论异常,因此您需要考虑使用@KafkaListener.errorHandler(),其工作原理如下:

catch (ListenerExecutionFailedException e) {
        if (this.errorHandler != null) {
            try {
                Object result = this.errorHandler.handleError(message, e, consumer);
                if (result != null) {
                    handleResult(result, record, message);
                }
            }
            catch (Exception ex) {
                throw new ListenerExecutionFailedException(createMessagingErrorMessage(
                        "Listener error handler threw an exception for the incoming message",
                        message.getPayload()), ex);
            }
        }
        else {
            throw e;
        }
    }

因此,在您的情况下,不要向@SendTo传播错误的消息,您应该只从KafkaListenerErrorHandler.handleError()返回任何内容。