我正在尝试使用Byte Buddy生成一个类和方法,基于运行时可用的一些配置。该类正在尝试创建一个Hazelcast Jet管道来连接多个IMaps。
根据提供的配置,没有。 IMaps的加入可能会有所不同。在下面的示例中,我正在尝试加入三个IMaps。
private Pipeline getPipeline(IMap<String, Object1> object1Map, IMap<String, Object2> object2Map,
IMap<String, Object3> object3Map) {
Pipeline p = Pipeline.create();
BatchStage<Entry<String, Object1>> obj1 = p.drawFrom(Sources.map(object1Map));
BatchStage<Entry<String, Object2>> obj2 = p.drawFrom(Sources.map(object2Map));
BatchStage<Entry<String, Object3>> obj3 = p.drawFrom(Sources.map(object3Map));
DistributedFunction<Tuple2<Object1, Object2>, String> obj1Obj2JoinFunc = entry -> entry.f1().getField31();
DistributedBiFunction<Tuple2<Object1, Object2>, Object3, Tuple2<Tuple2<Object1, Object2>, Object3>> output = (
in1, in2) -> (Tuple2.tuple2(in1, in2));
BatchStage<Tuple2<Object1, Object2>> obj1_obj2 = obj1.map(entry -> entry.getValue())
.hashJoin(obj2.map(entry -> entry.getValue()),
JoinClause.onKeys(Object1::getField11, Object2::getField21), Tuple2::tuple2).filter(entry -> entry.getValue() != null);
BatchStage<Tuple2<Tuple2<Object1, Object2>, Object3>> obj1_obj2_obj3 = obj1_obj2.hashJoin(
obj3.map(entry -> entry.getValue()),
JoinClause.onKeys(obj1Obj2JoinFunc, Object3::getField31), output)
.filter(entry -> entry.getValue() != null);
// the transformResult method will get the required fields from above operation and create object of AllObjectJoinClass
BatchStage<Entry<String, AllObjectJoinClass>> result = transformResult(obj1_obj2_obj3);
result.drainTo(Sinks.map("obj1_obj2_obj3"));
return p;
}
这里的问题是没有。我的方法的参数取决于运行时配置,也决定了方法体。我能够使用TypeDescription.Generic.Builder.parameterizedType
生成方法签名。但是,我在生成方法体时遇到了麻烦。我尝试使用MethodDelegation.to
,以便该方法驻留在一个单独的类中。这种方法的问题在于,单独的类中的方法需要非常通用,因此它可以采用任意的方法。不同类型的参数,还需要了解IMap中每个对象的字段。
我想知道是否有一种替代方法可以使用某种类型的模板来实现这一点,以便可以为每个管道生成一个单独的类。我没有找到任何关于生成具有已定义体的方法的文档(也许我错过了一些东西)。
- Anoop
这在很大程度上取决于你要做的事情:
Advice
,您可以将模板编写为内嵌到方法中的字节代码。StackManipulation
s,您可以编写单独的字节代码指令。在我看来,选项(2)就是你的目标。对于单独组合的代码,这通常是最简单的选择。
编写单个字节代码当然不是最方便的选项,但如果您可以轻松编写每个输入的处理,您可以组合多个Advice
类以避免直接使用字节代码指令。