出错在 KStreamFlatMapValues 方法执行时,由于json异常数据无法解析,结果生成的值为null,报错信息如下:

  1. 2018-04-18 19:21:04,776 ERROR [app-8629d547-bcf1-487b-85e5-07d7e135e1e3-StreamThread-1] com.gw.stream.KStream103.lambda$main$1(100) | 捕获到异常:hello world hello world king
  2. Exception in thread "app-8629d547-bcf1-487b-85e5-07d7e135e1e3-StreamThread-1" java.lang.NullPointerException
  3. at org.apache.kafka.streams.kstream.internals.KStreamFlatMapValues$KStreamFlatMapValuesProcessor.process(KStreamFlatMapValues.java:41)
  4. at org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:46)
  5. at org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:208)
  6. at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:124)
  7. at org.apache.kafka.streams.processor.internals.AbstractProcessorContext.forward(AbstractProcessorContext.java:174)
  8. at org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:80)
  9. at org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:224)
  10. at org.apache.kafka.streams.processor.internals.AssignedStreamsTasks.process(AssignedStreamsTasks.java:94)
  11. at org.apache.kafka.streams.processor.internals.TaskManager.process(TaskManager.java:411)
  12. at org.apache.kafka.streams.processor.internals.StreamThread.processAndMaybeCommit(StreamThread.java:918)
  13. at org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:798)
  14. at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:750)
  15. at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:720)

问题解决方案:

  1. 对json解析的bean添加未知字段忽略


    1. import java.util.List;
    2. import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    3. @JsonIgnoreProperties(ignoreUnknown = true)
    4. public class Bean103 {
    5. private List<String> key1;
    6. private List<List<String>> key2;
    7. public void setKey1(List<String> key1) {
    8. this.key1 = key1;
    9. }
    10. public List<String> getKey1() {
    11. return key1;
    12. }
    13. public void setKey2(List<List<String>> key2) {
    14. this.key2 = key2;
    15. }
    16. public List<List<String>> getKey2() {
    17. return key2;
    18. }
    19. }
  2. 由于报空指针错误,所以解决空指针问题,即判断为null时创建一个空对象.

    1. return list == null ? new ArrayList<String>():list;
  3. 完整的示例代码如下:

    1. package com.gw.stream;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. import java.util.Properties;
    5. import java.util.stream.Collectors;
    6. import org.apache.kafka.clients.consumer.ConsumerConfig;
    7. import org.apache.kafka.common.serialization.Serdes;
    8. import org.apache.kafka.streams.KafkaStreams;
    9. import org.apache.kafka.streams.KeyValue;
    10. import org.apache.kafka.streams.StreamsBuilder;
    11. import org.apache.kafka.streams.StreamsConfig;
    12. import org.apache.kafka.streams.kstream.KStream;
    13. import org.apache.kafka.streams.kstream.Produced;
    14. import org.apache.log4j.Logger;
    15. import com.alibaba.fastjson.JSONObject;
    16. public class KStream103 {
    17. private static Logger log = Logger.getLogger(KStream103.class);
    18. public static void main(String[] args) {
    19. if(args.length < 6){
    20. log.error("错误:参数个数不正确[application_id bootstarp_server groupid source_topic target_topic auto_offset_reset]");
    21. return ;
    22. }
    23. String application_id=args[0];
    24. String bootstarp_server = args[1];
    25. String groupid = args[2];
    26. String source_topic = args[3];
    27. String target_topic = args[4];
    28. String auto_offset_reset = args[5];
    29. Properties props = new Properties();
    30. // consumer group
    31. // 指定一个应用ID,会在指定的目录下创建文件夹,里面存放.lock文件
    32. props.put(StreamsConfig.APPLICATION_ID_CONFIG, application_id);
    33. props.put(StreamsConfig.STATE_DIR_CONFIG, "./tmp/");
    34. props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,bootstarp_server);
    35. // props.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG,10485760);
    36. props.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 2000);
    37. props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
    38. props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());
    39. props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, auto_offset_reset);
    40. props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true); //自动提交
    41. props.put(ConsumerConfig.GROUP_ID_CONFIG, groupid);
    42. //针对时间异常解决方法
    43. props.put(StreamsConfig.DEFAULT_TIMESTAMP_EXTRACTOR_CLASS_CONFIG, MyEventTimeExtractor.class);
    44. final String splitChar = "\001";
    45. StreamsBuilder builder = new StreamsBuilder();
    46. KStream<String, String> textLines = builder.stream(source_topic); // 接收第一个topic
    47. textLines.flatMapValues(value -> {
    48. Bean103 bean103 = null;
    49. List<String> list = null;
    50. try {
    51. //这里是value的业务处理逻辑...最终返回的是一个list
    52. } catch (Exception e) {
    53. log.error("捕获到异常:" + value);
    54. log.error("error message:" + e.getMessage());
    55. }
    56. return list == null ? new ArrayList<String>():list;
    57. }).filter((k,v)-> v !=null).map((k, v) -> new KeyValue<>(k, v))
    58. .to(target_topic, Produced.with(Serdes.String(), Serdes.String()));
    59. KafkaStreams streams = new KafkaStreams(builder.build(), props);
    60. streams.start();
    61. }
    62. }

kafkaStream解析json出错导致程序中断的解决方法的更多相关文章

  1. PHP json_decode 函数解析 json 结果为 NULL 的解决方法

    在做网站 CMS 模块时,对于模块内容 content 字段,保存的是 json 格式的字符串,所以在后台进行模块内容的编辑操作 ( 取出保存的数据 ) 时,需要用到 json_decode() 函数 ...

  2. Android Studio 解析json文件出现中文乱码解决方法

    作为一个Android开发初学者,好不容易找到解决方法,跟大家分享一下, 其实很简单,只要保持服务器上的文件(date2.json)与软件的编码方式一样就行. 我用的Android Studio是ut ...

  3. .NET MVC Json()处理大数据异常解决方法

    [1-部分原文]: .NET MVC Json()处理大数据异常解决方法 整个项目采用微软的ASP.NET MVC3进行开发,前端显示采用EasyUI框架,图表的显示用的是Highcharts,主要进 ...

  4. XCode编译文件过多导致内存吃紧解决方法

    XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧

  5. Jquery方法load之后导致js失效解决方法

    Jquery方法load之后导致js失效解决方法 >>>>>>>>>>>>>>>>>>> ...

  6. yum安装命令:遇到的问题报错如下: File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: 通过看报错可以了解到是使用了python2的语法,所以了解到当前yum使用的Python2,因为我单独安装了python3,且python3设置为默认版本了,所以导致语法问题 解决方法: 使用python2.6 yum install

    1.安装zip yum install -y unzip zip 2.安装lrszs yum -y install lrzsz 3.安装scp 遇到下面的问题: 结果提示: No package sc ...

  7. 阿里云提出的漏洞(Phpcms V9某处逻辑问题导致getshell漏洞解决方法)的问题

    最近从阿里云云盾检测流出来的,相比使用阿里云服务器的朋友已经收到漏洞提醒:Phpcms V9某处逻辑问题导致getshell漏洞解决方法,这个漏洞怎么办呢?CMSYOU在这里找到针对性解决办法分享给大 ...

  8. C# Winform频繁刷新导致界面闪烁解决方法

    C#Winform频繁刷新导致界面闪烁解决方法 一.通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲) 对于大多数应用程序,.NET Framework 提供的默认双缓冲将 ...

  9. winform频繁刷新导致界面闪烁解决方法

    转自龙心文 原文 winform频繁刷新导致界面闪烁解决方法 一.通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲) 对于大多数应用程序,.NET Framework 提供 ...

随机推荐

  1. postgresql命令行[转]

    postgresql命令行 原文链接 PostgreSQL 8.1 中文文档 连接数据库, 默认的用户和数据库是postgrespsql -U user -d dbname \c dbname 切换数 ...

  2. Quartz.net官方开发指南[转]

    http://www.cnblogs.com/shanyou/category/102991.html

  3. android调节屏幕亮度

    一:只改变当前程序android屏幕亮度(1)方法:lp.screenBrightness 取值 0.0 -- 1.0 ※设定值(float)的范围,默认小于 0(系统设定).0.0(暗)-1.0(亮 ...

  4. 从一个activity返回

    页面之间的跳转有startActivity 和startActivityForResult两种, 返回的话用finish方法,如下示例 MyActivity.this.finish();那你返回按钮使 ...

  5. DBA_实践指南系列2_Oracle Erp R12系统安装配置设定Setup(案例)

    2013-12-02 Created By BaoXinjian

  6. 基于KWIC 的keyword匹配算法(管道+过滤器模式下实现)

    以下是基于KWIC 的keyword匹配算法(管道+过滤器模式下实现) 关键部分的管道+过滤器 软件体系下的实现, 在非常多的keyword搜索平台都使用了这一 循环移位+排序输出的 keyword匹 ...

  7. hdu 4971/ 2014多校/最大权闭合图

    题意:n个项目(每一个相应获得一定价值).m个技术问题(每一个须要支出一定价值),每一个项目必须要攻克若干个技术问题.技术难题之间有拓扑关系. 关键是建图.一看,第一感觉就是最大权闭合图,马上建好了图 ...

  8. 以 DirectUI 方式实现的ImageButton

    原文链接: http://www.cnblogs.com/hoodlum1980/archive/2011/02/15/1954779.html 这是一篇比较简单的文章,主要讲解的是用 DirectU ...

  9. C++拷贝函数的小结,关于变量的作用域等---ShinePans

    #include <iostream> using namespace std; class circle { private: double r0; public: circle(dou ...

  10. ios app 实现热更新(无需发新版本号实现app加入新功能)

    眼下可以实现热更新的方法,总结起来有下面三种 1. 使用FaceBook 的开源框架 reactive native,使用js写原生的ios应用 ios app能够在执行时从server拉取最新的js ...