Java 弗林克生的和死的。什么时候使用它们?

Java 弗林克生的和死的。什么时候使用它们?,java,scala,state,apache-flink,Java,Scala,State,Apache Flink,假设我有以下代码。引擎由这个抽象类的实现初始化,它是一个包含哈希表的复杂类。这样声明的缺点是什么?根据我的理解,这既不是原始状态,也不是管理状态。我应该使用其中一种吗?为什么 描述托管状态并使用flink库中现有的类(例如ValueState) 另一方面,描述了原始状态,从我所看到的情况来看,它只能在扩展AbstractStreamOperator类时使用,而不是在这里(RichMapFunction被扩展)。(将给出一个代码示例) 基本上,如果不使用Flink状态,这意味着每次启动或重新启动作

假设我有以下代码。引擎由这个抽象类的实现初始化,它是一个包含哈希表的复杂类。这样声明的缺点是什么?根据我的理解,这既不是原始状态,也不是管理状态。我应该使用其中一种吗?为什么

描述托管状态并使用flink库中现有的类(例如ValueState)

另一方面,描述了原始状态,从我所看到的情况来看,它只能在扩展AbstractStreamOperator类时使用,而不是在这里(RichMapFunction被扩展)。(将给出一个代码示例)


基本上,如果不使用Flink状态,这意味着每次启动或重新启动作业时,
ERFEngine
都将被实例化为一个新对象。这基本上意味着,如果在作业执行期间,您的
引擎保持某种状态,则当作业失败、重新启动或停止时,它将丢失。


我不会描述原始状态和托管状态之间的区别,因为您引用的帖子做得非常好。基本上,原始状态是一个相当低级的API,它允许您实现自己的操作符,因此一般来说,托管状态是首选的,因为它利用了一些Flink功能(例如允许在并行度更改时重新分布),并且通常更易于使用。

如果您不使用Flink状态,这基本上意味着每次启动或重新启动作业时,
ERFEngine
将被实例化为一个新对象。这基本上意味着,如果在作业执行期间,您的
引擎保持某种状态,则当作业失败、重新启动或停止时,它将丢失。


我不会描述原始状态和托管状态之间的区别,因为您引用的帖子做得非常好。基本上,原始状态是一种相当低级的API,允许您实现自己的运算符,因此通常首选托管状态,因为它利用了一些Flink功能(例如允许在并行度更改时重新分布),并且通常更易于使用。

如果我在引擎引用中使用托管状态,ValueState可能不够,对吗?我需要对通过引擎引用访问的所有对象/字段使用托管状态类(MapState e.t.c),对吗?我问了一个类似的问题。是的,我看到了。但是OP也在为他的案例询问更具体的细节:)如果我在引擎引用上使用托管状态,ValueState可能不够,对吗?我需要对通过引擎引用访问的所有对象/字段使用托管状态类(MapState e.t.c),对吗?我问了一个类似的问题。是的,我看到了。但OP也要求提供更具体的案件细节:)
abstract class EmbeddedEngineMap(fsmList: List[FSMInterface],
                             predList: List[PredictorInterface],
                             predictorEnabled: Boolean,
                             expirationTime: Long,
                             collectStats: Boolean,
                             finalsEnabled: Boolean,
                             distance: (Double,Double)) extends RichMapFunction[GenericEvent, Unit] {

       protected var engine: ERFEngine = _
       ....
}