我在Kafka v1.0 Streams中编写应用程序,并在尝试运行应用程序时遇到奇怪的运行时问题。简化的应用程序看起来像:
KStream< String, ValueClass > stream = ...;
KGroupedStream< String, ValueClass > groupedStream = stream.groupByKey();
KTable< String, ValueClass > aggregatedTable =
groupedStream
.aggregate( ()-> new ValueClass(), // initializer
( string, invalue, aggvalue ) -> {
ValueClass aggResult = f( invalue, aggvalue );
return aggResult; }, // aggregator
Materialized.with( Serdes.String(), ValueClassSerde )
);
我已经通过print( Printed.toSysOut() )
操作确认输入KStream看起来像我期望的那样,添加groupByKey()
应用程序仍然有效,但是当我添加聚合操作时,我得到了一个运行时错误:
java.lang.ClassCastException: java.lang.String cannot be cast to ValueClass
我已多次浏览该程序,但对我来说看起来仍然合理,我无法弄清楚处理过程中正在尝试将String
强制转换为ValueClass
的实例{1}}。
您能否解释一下错误消息告诉我的内容,以及解决问题需要做些什么?
下一个问题:我修改了上面的代码,添加了一个步骤,将聚合输出表转换为流并打印出来:
KStream< String, ValueClass > stream = ...;
KGroupedStream< String, ValueClass > groupedStream = stream.groupByKey();
KTable< String, ValueClass > aggregatedTable =
groupedStream
.aggregate( ()-> new ValueClass(), // initializer
( string, invalue, aggvalue ) -> {
ValueClass aggResult = f( invalue, aggvalue );
return aggResult; }, // aggregator
Materialized.with( Serdes.String(), ValueClassSerde )
);
aggregatedTable.toStream().print( Printed.toSysOut() );
该程序运行,但没有任何结果。此外,当我在Eclipse调试器下运行并在聚合函数f
中放置一个断点时,执行永远不会到达断点。
我已经阅读了一些关于KTable.toStream的内容,但没有输出每个结果以节省流量;是什么在这里发生,有没有办法阻止它,以便输出立即刷新?