在此代码中,我应该使用 transient
吗?
我什么时候可以使用transient
?
有什么区别?
需要您的帮助
private Map<String, HermesCustomConsumer> topicSourceMap = new ConcurrentHashMap();
private Map<TopicAndPartition, Long> currentOffsets = new HashMap<>();
private transient Map<TopicAndPartition, Long> restoredState;
tl; dr
如果使用transient
变量,则最好将其实例化,以实现Rich
接口的open()
操作员方法。否则,同时声明具有初始值的变量。
您在这里使用的状态称为用户本身管理的原始状态。是否应该根据序列化目的使用transient
修饰符。在提交Flink工作之前。计算拓扑将生成并分布到弗林克集群中。以及包括源和接收器在内的操作员将与字段进行实例化,例如您的代码中的topicSourceMap
。变量topicSourceMap
和currentOffsets
已与构造函数实例化。虽然restoredState
是瞬态变量,因此无论您分配了哪个初始值,它都不会被序列化并分配到某些任务中以执行。因此,您通常需要在实现Rich
接口的open()
操作方法中对其进行实例化。在某些任务中对该运算符进行了应有的序列化后,open()
方法将被调用到您自己的状态中。