Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kafka流链接LeftJoin-在新消息之后再次处理以前的旧消息_Java_Apache Kafka_Left Join_Apache Kafka Streams - Fatal编程技术网

Java Kafka流链接LeftJoin-在新消息之后再次处理以前的旧消息

Java Kafka流链接LeftJoin-在新消息之后再次处理以前的旧消息,java,apache-kafka,left-join,apache-kafka-streams,Java,Apache Kafka,Left Join,Apache Kafka Streams,我有一个流,它是其他流的组合 final KTable compositeinfo table=compositeImcTable .leftJoin( 综合融资, (compositemic cimc,CompositeFund cf)->{ CompositeInfo newCandidate=新CompositeInfo(); 如果(cimc!=null){ newCandidate.imcName=cimc.imcName; newCandidate.imcID=cimc.imcID;

我有一个流,它是其他流的组合

final KTable compositeinfo table=compositeImcTable
.leftJoin(
综合融资,
(compositemic cimc,CompositeFund cf)->{
CompositeInfo newCandidate=新CompositeInfo();
如果(cimc!=null){
newCandidate.imcName=cimc.imcName;
newCandidate.imcID=cimc.imcID;
如果(cf!=null){
newCandidate.investments=cf.investments;
}
}
返回新的候选人;
})
.leftJoin(
合成图表,
(CompositeInfo cinfo,CompositeGeography cg)->{
如果(cg!=null){
cinfo.regions=cg.regions;
}
返回cinfo;
})
.leftJoin(
复合系数表,
(CompositeInfo cinfo,CompositeSector cs)->{
如果(cs!=null){
cinfo.sections=cs.sections;
}
返回cinfo;
})
.leftJoin(
可组合,
(CompositeInfo cinfo,CustomCluster cc)->{
如果(cc!=null&&cc.clusters!=null){
cinfo.clusters=cc.clusters;
}
返回cinfo;
})
.leftJoin(
复合聚类表,
(CompositeInfo cinfo,CompositeAlphaCluster cac)->{
如果(cac!=null){
cinfo.alphaClusters=cac.alphaClusters;
};
返回cinfo;
},
物化.as(this.storeName)
.withKeySerde(Serdes.Long())
.带ValueSerde(复合信息));
我的问题涉及CompositeInfo和CustomCluster之间的左连接。CustomCluster如下所示

KTable compositeClusterTable=builder
.小溪(
子主题组合集群,
使用(Serdes.Long(),CompositeClusterOrde))
.filter((k,v)->v.clusters!=null)
.groupByKey(序列化的.with(Serdes.Long(),CompositeClusterOrde))
.reduce((aggValue,newValue)->newValue);
自定义集群中的消息如下所示

CustomCluster [clusterId=null, clusterName=null, compositeId=280, operation=null, clusters=[Cluster [clusterId=6041, clusterName=MyName]]]
因此,我将此对象中的HashMap簇指定给在compositeId上加入的CompositeInfo对象中的簇

我所看到的是,一条CustomCluster消息进入到给定的compositeId中,并且被正确地处理了,但是包含前一个集群的旧消息(我仍在研究)被再次处理。 在深入研究后,问题发生在卡夫卡内部的KTableKTableRightJoin中

公共作废流程(最终K键,最终更改){
//我们加入iff键是相等的,因此,如果键为null,我们就不能加入并忽略记录
if(key==null){
返回;
}
最终R值;
R oldValue=null;
最终V2 value2=valueGetter.get(键);
如果(value2==null){
返回;
}
newValue=joiner.apply(change.newValue,value2);
if(sendOldValues){
oldValue=joiner.apply(change.oldValue,value2);
}
context().forward(key,newchange(newValue,oldValue));
}
当joine第一次返回时,newValue将正确更新。但代码随后转到sendOldValues块,一旦joiner返回,newValue就是update gain,但这次是使用旧集群值

下面是我的问题:

  • 当joiner被称为 第二次使用旧值

  • 有没有办法关闭sendOldValues
  • 我的链式左连接是否与此有关。我知道 卡夫卡以前的版本有一个链接错误。但现在我开始了 1.0
  • 更新: 我发现了另一件事。如果我将联接链向上移动并删除其他联接,sendOldValues仍然为False。因此,如果我有如下内容:

    final KTable compositeinfo table=compositeImcTable
    .leftJoin(
    综合融资,
    (compositemic cimc,CompositeFund cf)->{
    CompositeInfo newCandidate=新CompositeInfo();
    如果(cimc!=null){
    newCandidate.imcName=cimc.imcName;
    newCandidate.imcID=cimc.imcID;
    如果(cf!=null){
    newCandidate.investments=cf.investments;
    }
    }   
    返回新的候选人;
    })
    .leftJoin(
    可组合,
    (CompositeInfo cinfo,CustomCluster cc)->{
    如果(cc!=null&&cc.clusters!=null){
    cinfo.clusters=cc.clusters;
    }
    返回cinfo;
    },
    物化.as(this.storeName)
    .withKeySerde(Serdes.Long())
    .带ValueSerde(复合信息));
    
    这给了我正确的结果。但我认为,如果我在这之后再添加任何链式联接,它们可能会显示相同的错误行为

    在这一点上我不确定什么,但我认为我的问题在于链接的leftjoin和计算oldValue的行为。还有其他人遇到过这个问题吗

    更新

    在深入挖掘之后,我意识到sendOldValues是卡夫卡的内在因素,而不是我所经历的问题的原因。我的问题是,当ValueJoiner for oldValue返回时,newValue会发生变化,我不知道这是否是由于对Java对象进行了某种按引用传递的赋值

    这就是传入对象的外观

    CustomCluster [clusterId=null, clusterName=null, compositeId=280, operation=null, clusters=[Cluster [clusterId=6041, clusterName=Sunil 2]]]
    
    clusters是一个
    HashSet clusters=newhashset()

    然后将其连接到一个对象

    CompositeInfo [compositeName=BUCKET_NM-280, compositeID=280, imcID=19651, regions=null, sectors=null, clusters=[]]
    
    这里的集群类型相同,但属于CompositeInfo类

    加入时,我将CustomCluster对象的簇指定给CompositeInfo对象

    (合成信息