反序列化后如何处理SerializationException

2024-03-11

我在 Spring Kafka 设置中使用 Avro 和 Schema 注册表。

我想以某种方式处理SerializationException,在反序列化期间可能会抛出该异常。

我找到了以下两个资源:

https://github.com/spring-projects/spring-kafka/issues/164 https://github.com/spring-projects/spring-kafka/issues/164

如何配置 spring-kafka 忽略格式错误的消息? https://stackoverflow.com/questions/45584504/how-do-i-configure-spring-kafka-to-ignore-messages-in-the-wrong-format

这些资源建议我返回 null 而不是抛出SerializationException反序列化并监听时KafkaNull。这个解决方案效果很好。

然而,我希望能够抛出异常而不是返回 null。

KIP-161 https://cwiki.apache.org/confluence/display/KAFKA/KIP-161%3A+streams+deserialization+exception+handlers and KIP-210 https://cwiki.apache.org/confluence/display/KAFKA/KIP-210+-+Provide+for+custom+error+handling++when+Kafka+Streams+fails+to+produce提供更好的功能来处理异常。我确实在 Spring Cloud 中找到了一些提到 KIP-161 的资源,但没有任何关于 Spring-Kafka 的具体信息。

有谁知道怎么抓SerializationException在 Spring Boot 中?

我正在使用 Spring Boot 2.0.2

编辑:我找到了解决方案。

我宁愿抛出异常并捕获它,也不愿返回 null 或KafkaNull。我在多个不同的项目中使用我的自定义 Avro 序列化器和反序列化器,其中一些不是 Spring。如果我更改了 Avro 序列化器和反序列化器,则需要更改其他一些项目以期望反序列化器返回 null。

我想关闭容器,这样我就不会丢失任何消息。在生产中永远不应该出现 SerializationException。 SerializationException 应该只有在架构注册表关闭或未格式化的消息以某种方式发送到生产 kafka 时才会发生。不管怎样,SerializationException 应该很少发生,如果发生,我想关闭容器,这样就不会丢失任何消息,并且我可以调查问题。

只需考虑一下,它将捕获您的消费者容器中的所有异常。在我的具体情况下,我只想在它是时才关闭SerializationException

public class SerializationExceptionHandler extends ContainerStoppingErrorHandler {

    @Override
    public void handle(Exception thrownException, List<ConsumerRecord<?, ?>> records, Consumer<?, ?> consumer,
                       MessageListenerContainer container) {

        //Only call super if the exception is SerializationException
        if (thrownException instanceof SerializationException) {
            //This will shutdown the container.
            super.handle(thrownException, records, consumer, container);
        } else {
            //Wrap and re-throw the exception
            throw new KafkaException("Kafka Consumer Container Error", thrownException);
        }
    }
}

该处理程序被传递到消费者容器。下面是一个示例KafkaListenerContainerFactory bean.

@Bean
public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<Integer, String>>
kafkaListenerContainerFactory(JpaTransactionManager jpa, KafkaTransactionManager<?, ?> kafka) {

    ConcurrentKafkaListenerContainerFactory<Integer, String> factory =
            new ConcurrentKafkaListenerContainerFactory<>();

    factory.setConsumerFactory(consumerFactory());
    factory.setConcurrency(1);
    factory.getContainerProperties().setPollTimeout(3000);

    factory.getContainerProperties().setErrorHandler(new SerializationExceptionHandler());

    factory.getContainerProperties().setTransactionManager(chainedTxM(jpa, kafka));
    return factory;
}

Spring无能为力;反序列化发生在消费者获取任何数据之前。您需要增强解串器。

然而,我希望能够抛出异常而不是返回 null。

这不会有任何帮助,因为卡夫卡不知道如何处理异常。再次;这一切都发生在数据可用之前,因此返回 null(或其他一些特殊值)是最好的技术。

EDIT

在2.2中,我们添加了一个错误处理解串器 https://docs.spring.io/spring-kafka/docs/2.2.0.RELEASE/reference/html/_reference.html#error-handling-deserializer它委托给实际的反序列化器并返回 null,但标头中除外;然后,侦听器容器将其直接传递给错误处理程序而不是侦听器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反序列化后如何处理SerializationException 的相关文章

  • (不?)使用 JavaScriptSerializer 将 xml 文件(未知模式)转换为 c# 中的 json

    JavascriptSerializer 是将 xml 文件 未知模式 转换为 json 字符串的 工具 吗 这里有一些线程讨论如何在 C 中将 xml 转换为 json 以及一些推荐的专用解决方案 http www phdcc com x
  • 如何在node-mysql查询后获取警告

    如何获取查询执行后识别的相应警告 如下所示 connection query squery function err rows search for OkPacket in 2 dimension array var warningCoun
  • 隐藏错误报告窗口

    我有以下问题 我的 ASP Net 应用程序接收简单控制台程序的 C 源代码 使用 cl exe 命令行 VC 编译器 对其进行编译 并使用 System Diagnostics Process 运行它 ASP Net应用程序运行在PC上
  • Django Rest Framework:如何为 PUT 和 PATCH 等更新操作设置字段为必填/只读?

    我有一个 Django 序列化器 它有一个字段 该字段仅适用于 PUT 和 PATCH 等更新操作 但不适用于 POST 等创建操作 我发现这个类似的SOquestion https stackoverflow com q 30953481
  • exit() 和 abort() 有什么区别?

    在C和C 中 有什么区别exit and abort 我试图在发生错误 不是例外 后结束我的程序 abort http en cppreference com w c program abort退出程序而不调用使用注册的函数atexit h
  • PHP 构造函数返回 NULL

    我有这个代码 是否有可能User对象构造函数以某种方式失败 以便 this gt LoggedUser被分配了一个NULL构造函数返回后值和对象被释放吗 this gt LoggedUser NULL if SESSION verbiste
  • 将 PHP 错误处理程序限制为特定命名空间

    PHP 有没有办法只为特定的命名空间设置错误处理程序 我正在构建一个小型框架 我希望能够通过设置自定义错误处理程序并抛出异常来尝试捕获其名称空间内的所有错误 警告 通知消息 在此特定名称空间之外触发的错误应该以常规方式表现 用PHP可以完成
  • 在 Spring MVC 中使用一系列项目处理表单发布

    我正在尝试将一些数据从客户端发送到服务器 并将其处理为文件下载 我使用简单的 HTML 表单 因为我想初始化文件下载 而不是 AJAX 其中一个表单字段是一组项目 另外两个是名称和描述字符串 在提交表单之前 我将此字段序列化为字符串 JSO
  • 使用 Serialized 属性和实现 ISerialized 之间有什么区别?

    使用有什么区别Serializable属性并实现ISerializable界面 当您使用SerializableAttribute http msdn microsoft com en us library system serializa
  • 无法渲染非字符串的属性,toString 返回:null SPRING MVC 中的错误

    我正在尝试按照本教程为我的 spring mvc 项目创建一个通用错误处理程序 http www mkyong com spring mvc spring mvc exceptionhandler example http www mkyo
  • 树结构的序列化/反序列化

    我试图找出保存 序列化 并稍后打开 反序列化 树结构的最佳方法 我的结构由具有不同属性的各种对象类型组成 但每个对象类型都继承自基本抽象 Node 类 每个节点都有唯一的 ID GUID 并且有一个 AddSuperNode Node nd
  • 如何处理 Primefaces 延迟加载中的错误?

    我无法让用户知道发生的异常PrimeFaces http primefaces org LazyDataModel load方法 我正在从数据库加载数据 当引发异常时 我不知道如何通知用户 我尝试添加FacesMessage to Face
  • Django 如何从 ManyToManyField 序列化并列出全部

    我正在使用 Django 1 9 1 开发移动应用程序后端 我实现了关注者模型 现在我想列出用户的所有关注者 但目前我不得不这样做 我还使用 Django Rest 框架 这是我的 UserProfile 模型 class UserProf
  • C# XML 反序列化。将节点中的所有内部文本读取到字符串属性中

    我目前正在尝试修改我的类 以便我的模型上的文本属性包含某个节点的所有内部文本 text node 给我带来问题的 xml 示例是
  • 将记录转换为序列化表单数据以通过 HTTP 发送

    有没有办法转换此记录 TError record code Word message String end TState record caption String address Cardinal counters TArray
  • 使用 jackson 序列化 Map.Entry 时出现问题

    如果我尝试反序列化以下存储为字符串的类型 List
  • 自定义 WCF DataContractSerializer

    是否可以用我自己的序列化程序替换 Windows Communication Foundation 中的 dataContractSerializer 如果可能的话 我怎样才能实现这一目标 是的 您可以提供自己的序列化器实现 默认情况下 W
  • django REST框架多源领域

    假设我的 models py 中有这些 models py class Theme models Model An theme is an asset of multiple levels adventure models ForeignK
  • 我们为什么使用序列化?

    为什么我们需要使用序列化 如果我们想通过网络发送一个对象或一段数据 我们可以使用字节流 如果我们想将一些数据保存到磁盘上 我们可以再次使用二进制模式和字节流来保存它 那么使用序列化有什么好处呢 从技术上讲 在低级别上 您的序列化对象也将最终
  • 抑制 R 中的错​​误消息

    我正在 R 中运行模拟研究 有时 我的模拟研究会产生错误消息 当我在函数中实现模拟研究时 当出现此错误消息时模拟停止 我知道抑制错误是不好的做法 但此时对我来说 除了抑制错误然后继续下一个模拟 直到达到我喜欢运行的模拟总数为止 没有其他选择

随机推荐

  • 使用 Func 时如何调用 invoke

    在函数中Test Func
  • 在 Akka 中等待多个结果

    在 Akka 中等待多个 actor 结果的正确方法是什么 The 反应式编程原理 https www coursera org course reactiveCoursera 课程有一个使用复制键值存储的练习 在不详细讨论分配的细节的情况
  • Paypal Express 沙箱访问被拒绝

    我正在尝试使用 Paypal 沙箱 API 并得到此响应 Access Denied You don t have permission to access http api 3t sandbox paypal com nvp on thi
  • WCF:如何将多个服务组合到单个 WSDL 中

    在我的 ASP NET WebForms 项目中 我引用了 WCF 服务库项目 其中包含针对每个业务对象的不同 WCF 服务 这些服务托管在 IIS 中 并且可以通过我在 Global asax 中定义的路由获取 WSDL 每个服务通过一个
  • postgres 关系中的 ALTER TYPE 错误不存在

    使用以下内容 CREATE TYPE user types AS ENUM it accounting processes CREATE TABLE my users my user id integer NOT NULL my user
  • GPUImage imageFromCurrentFramebuffer 有时为 GPUImageLookupFilter 及其子类返回 nil

    我一直在使用GPUImage对于我的项目 我遇到了这个问题imageFromCurrentFramebuffer对于某些返回 nilGPUImageLookupFilter s 我子类化了GPUImageFilterGroup就像在GPUI
  • 使用 ASP.NET 和 MVC 3,如何创建隐藏字段,以便正确绑定以数组作为列表中每个项目的值的列表?

    我有一个查询语句列表 当需要在末尾添加另一个语句时 需要将这些查询语句发回 MVC 控制器 对于我现在尝试创建的测试 页面以过滤器列表开头 执行此示例时 页面将为过滤器创建字段 如下所示
  • 缩放时更改 ImageView 的大小

    我正在使用 chrisbanes PhotoView 来实现捏缩放 图像在捏和双击时缩放 但我看不到图像在缩放时拉伸到全屏 在缩放时 看起来图像在框内缩放并且部分图像消失关于缩放 我如何实现图像缩放 以便图像的高度在缩放时增加 我正在使用
  • 如何为javascript接口配置proguard?

    我已经实现了一个使用 JavascriptInterface 的 Webview 当不进行混淆时它工作得很好 但是一旦 Proguard 处于活动状态 它就不起作用了 我在这里查看了其他答案 但仍然无法使其正常工作 一些WebView类 p
  • 更改 Android 中的 MAC 地址

    我正在尝试更改已 root 的 Note 2 Android 设备的 Mac 地址 我做了以下事情 busybox ifconfig wlan0 关闭 busybox ifconfig wlan0 硬件以太 00 11 22 33 44 5
  • Rails 4 simple_form owns_to 关联未定义方法错误

    使用 Rails 4 当我想从对象 Document Document 渲染表单 使用 simple form 时 出现以下错误 undefined method document type id for
  • 搜索结果 url 中的 django csrf_token

    搜索结果 url 中有 csrf 不知道为什么会存在以及如何删除它 搜索效果很好 这是网址 search csrfmiddlewaretoken 675d1340034e094866d15a921407e3fc q testing 这是视图
  • 可靠的全双工串行通信

    我正在设计一种设备 它将加密从 PC 发送的长 假设无限 数据流并将其发回 我计划在运行全双工的设备上使用单个串行端口 并通过硬件握手来 阻止 数据 在每个块后发送一个 CRC 值 该设备只会缓冲有限数量的块 理想情况下 只有一个缓冲区累积
  • 是否可以在 OSX 中检测 Power Nap / DarkWake 模式

    我有一个通过 launchd 启动的守护进程 即使在 DarkWake 期间 它也会运行 并且在 OS X 再次返回睡眠状态之前没有时间完成 我可以想到以下解决方案 但没有找到实现此目的的方法 不要让该守护进程在 DarkWake 期间运行
  • Ropemacs 使用教程

    有很多网站都有相关说明安装Ropemacs 但到目前为止我找不到任何有关如何操作的说明use安装完成后即可 我已经安装了它 或者至少看起来是这样 Emacs 在其顶部菜单栏中有 Rope 菜单 怎么办 到目前为止 我只能使用 显示文档 默认
  • Docker 中的非 root 用户

    我有一个基本的 Dockerfile FROM ubuntu xenial USER test ENTRYPOINT bin bash 对于这个 Dockerfile 我希望能够创建一个没有密码的用户 并且当 Docker 容器运行时 我希
  • 通过 websocket 使用 javascript 传输文件

    你好 我正在尝试传输文件 我有一些程序将文件转换为二进制并使用 C 通过网络传输它们 我想知道我是否能够使用 javascript 和 websocket 传输文件 任何有关如何将我的 C 程序集成到 JavaScript 中的示例将不胜感
  • 无法在 Sublime Text 中的 REPL R 中运行选定的行

    按照这些说明为 sublime text 设置 REPLhttp www kevjohnson org using r in sublime text 3 http www kevjohnson org using r in sublime
  • 什么是擦除

    什么是擦除以及擦除对仿制药的限制是什么 Erasure http download oracle com javase tutorial java generics erasure html是在编译时使用类型但在运行时不存在的结果 这是 J
  • 反序列化后如何处理SerializationException

    我在 Spring Kafka 设置中使用 Avro 和 Schema 注册表 我想以某种方式处理SerializationException 在反序列化期间可能会抛出该异常 我找到了以下两个资源 https github com spri