很多框架都有类似的接口
1.接口 1
public interface RichFunction{
void open(Configuration parameters) throws Exception;
void close() throws Exception;
}
2.抽象类
public abstract class AbstractRichFunction implements RichFunction{
@Override
public void open(Configuration parameters) throws Exception {}
@Override
public void close() throws Exception {}
}
3.接口 2
public interface SinkFunction<IN>{
default void invoke(IN value, SinkFunction.Context context) throws Exception {
this.invoke(value);
}
}
4.定义抽象类 2
public abstract class RichSinkFunction<IN> extends AbstractRichFunction implements SinkFunction<IN> {
private static final long serialVersionUID = 1L;
public RichSinkFunction() {
}
}
引用抽象类 2 的时候,如果重写了 open 和 close 方法,那么执行 invoke 方法前会先调用 open ,执行结束后执行 close ,请问下这是怎么做到的呢?
new RichSinkFunction<Tuple2<String, Integer>>() {
private static final long serialVersionUID = -6063998106426201742L;
private transient SqlSession sqlSession;
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
sqlSession = MybatisSessionFactory.getSqlSessionFactory().openSession();
}
@Override
public void invoke(Tuple2<String, Integer> value) throws Exception{
try{
//do something
sqlSession.commit();
}
catch (Throwable e){
sqlSession.rollback();
e.printStackTrace();
}
}
@Override
public void close() throws Exception {
sqlSession.close();
super.close();
}
});
1
yazoox 2021-11-05 07:20:49 +08:00
为什么你认为“执行 invoke 前调用 open ,执行后调用 close”,如果发生了,直接在 open 那里打个断点,执行暂停后,看看 call stack 应该就知道了吧?
至少从你贴的代码来看,不会发生这样的事情。反正我没看出来,open, close, invoke 之间,有调用的关系。 |
2
zxCoder 2021-11-05 08:56:19 +08:00
应该还有你没看到的代码
|
3
liuhouer OP 是模板模式
|