无法推断类型变量 R, 参数不匹配

最近在用java写flink任务,遇到无法推断类型变量 R问题,特此记录一下,希望对大家也有用。

1、完整报错信息

完整的报错信息

2、代码实现
/**
 * @Author dingws
 * @PackageName rule_engine
 * @Package com.rules.engine.task
 * @Date 2021/7/7 7:25 下午
 * @Version 1.0
 */
@Slf4j
public class KafkaMessageDeal3 {
    public static void main(String[] args) throws Exception {
        long delay = 5000L;
        long windowGap = 5000L;

        //1、设置运行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
        env.enableCheckpointing(6000L);
        env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
        env.setParallelism(1);

        //2、配置数据源读取数据
        Properties props = new Properties();
        props.put("bootstrap.servers", "127.0.0.1:9092");
        props.put("group.id", KafkaProducer.TOPIC_GROUP1);

        FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<String>(KafkaProducer.TOPIC_TEST, new SimpleStringSchema(), props);

        // 配置规则服务
        DataStream<Product> rulesStream = env.addSource(new MyRuleSource());

        //设置数据源
        DataStreamSource<String> dataStreamSource = env.addSource(consumer).setParallelism(1);

        //从kafka里读取数据,转换成UserInfoVo对象
        DataStream<UserInfoVo> dataStream = dataStreamSource.map(value -> JSONObject.parseObject(value, UserInfoVo.class));

//        ...

        // broadCast deal
        dataStream
                .connect(rulesStream)
                .process(new MyBroadcast2())
                .uid("DynamicKeyFunction")
                .name("Dynamic Partitioning Function")
                .keyBy("id")
                .connect(rulesStream)
//                .process(new DynamicAlertFunction())
                .process(new MyKeyedBroadCast())
                .uid("DynamicAlertFunction")
                .name("Dynamic Rule Evaluation Function");


        //4、配置数据汇写出数据
//        stream.writeAsText("./output");

        //5、提交执行
        env.execute("KafkaMessageDeal2");
    }

    static class MyBroadcast2 extends BroadcastProcessFunction<UserInfoVo, Product, UserInfoVo>{

        @Override
        public void processElement(UserInfoVo userInfoVo, ReadOnlyContext readOnlyContext, Collector<UserInfoVo> collector) throws Exception {
            System.out.println("------1010101010 userInfoVo = " + userInfoVo);
            collector.collect(userInfoVo);
        }

        @Override
        public void processBroadcastElement(Product product, Context context, Collector<UserInfoVo> collector) throws Exception {
            System.out.println("------1212121212121 rule = " + product);
        }
    }

    static class MyKeyedBroadCast extends KeyedBroadcastProcessFunction<String, UserInfoVo, MyRule, Alert>{

        @Override
        public void processElement(UserInfoVo userInfoVo, ReadOnlyContext ctx, Collector<Alert> collector) throws Exception {
            System.out.println("-----88888 processElement userInfo = " + userInfoVo);

            MyRule rule = new MyRule();
            rule.setRuleId(123);
            rule.setRuleState(MyRule.RuleState.ACTIVE);
            rule.setControlType(MyRule.ControlType.CLEAR_STATE_ALL);
            System.out.println("----- rule = " + rule);
            Alert alert = new Alert();
            alert.setKey("123");
            alert.setRuleId(123);
            alert.setViolatedRule(rule);
            collector.collect(alert);
        }

        @Override
        public void processBroadcastElement(MyRule rule, Context context, Collector<Alert> collector) throws Exception {
            System.out.println("-----99999 processBroadcastElement rule = " + rule);
        }

        private boolean noRuleAvailable(MyRule rule) {
            // This could happen if the BroadcastState in this CoProcessFunction was updated after it was
            // updated and used in `DynamicKeyFunction`
            if (rule == null) {
                return true;
            }
            return false;
        }
    }
}

3、原因分析

process()这个接口的入参MyBroadcast2有问题,我们先看下process()的定义:

    @PublicEvolving
    public <R> SingleOutputStreamOperator<R> process(CoProcessFunction<IN1, IN2, R> coProcessFunction) {
        TypeInformation<R> outTypeInfo = TypeExtractor.getBinaryOperatorReturnType(coProcessFunction, CoProcessFunction.class, 0, 1, 2, TypeExtractor.NO_INDEX, this.getType1(), this.getType2(), Utils.getCallLocationName(), true);
        return this.process(coProcessFunction, outTypeInfo);
    }

可以看到process()期望传进来的是一个CoProcessFunction类型的参数,该参数有三个变量:IN1、IN2、R,其中IN1和IN2的实现是process()所在的类ConnectedStreams初始化传进来的,R是我们自己定义的。
IN1和IN2

再看下我们MyBroadcast2类的实现,该类是继承自BroadcastProcessFunction,该类初始化时同样需要三个参数:IN1、IN2、OUT。
BroadcastProcessFunction实现

到这里,原因很明显了:我们传给process()的参数类型和定义的不一样

4、解决方法

重新定义一个process()期望传进来的类型CoProcessFunction,传进去。

5、补充

如果process()所在的类ConnectedStreams初始化时,IN1、IN2的类型已经确定了,如果CoProcessFunction的初始化的IN1、IN2和ConnectedStreams的IN1、IN2不同,也会出现问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值