如何使 java.util.function.Predicate 可序列化?不是我的應用程式中的一個類,我沒有在任何地方使用它,我該如何解決這個問題?
這是堆疊
App > Serialization stack:
App > - object not serializable (class: java.util.function.Predicate$$Lambda$309/931003277, value: java.util.function.Predicate$$Lambda$309/931003277@5c97826a)
App > - field (class: io.github.resilience4j.retry.RetryConfig, name: exceptionPredicate, type: interface java.util.function.Predicate)
App > - object (class io.github.resilience4j.retry.RetryConfig, io.github.resilience4j.retry.RetryConfig@20496d9f)
App > - field (class: determination.resilience.GetTaxResilience, name: retryConfig, type: class io.github.resilience4j.retry.RetryConfig)
App > - object (class determination.resilience.GetTaxResilience, determination.resilience.GetTaxResilience@af49e79)
App > - field (class: vertex.VertexTaxComplianceOperator, name: getTaxResilience, type: class determination.resilience.GetTaxResilience)
App > - object (class vertex.VertexTaxComplianceOperator, vertex.VertexTaxComplianceOperator@3e68a323)
App > - field (class: vertex.VertexTaxComplianceOperator$$anonfun$5, name: $outer, type: class vertex.VertexTaxComplianceOperator)
App > - object (class vertex.VertexTaxComplianceOperator$$anonfun$5, <function1>)
App > - field (class: org.apache.spark.sql.execution.MapElementsExec, name: func, type: class java.lang.Object)
App > - object (class org.apache.spark.sql.execution.MapElementsExec, MapElements <function1>, obj#512:
我很困惑,這是屬于另一個jar的東西,我只是使用它,為什么我在這一行出現序列化錯誤。
App > - field (class: io.github.resilience4j.retry.RetryConfig, name: exceptionPredicate, type: interface java.util.function.Predicate)
這是我的代碼
@Component
class GetTaxResilience extends Serializable {
private val logger = LoggerFactory.getLogger(this.getClass)
val retryConfig = RetryConfig.custom()
.maxAttempts(RESILIENCE_RETRY_MAX_ATTEMPTS)
.retryExceptions(classOf[StatusRuntimeException])
.intervalFunction(IntervalFunction.ofRandomized(RESILIENCE_RETRY_INTERVAL_MILLISECONDS))
.build
val retryRegistry = RetryRegistry.of(retryConfig)
val retryInstance = retryRegistry.retry(GET_VERTEX_TAX_RETRY_DEFAULT_NAME, retryConfig)
def getDefaultRetryInstance(): Retry = {
// default retry instance configured in yaml
logger.info("Retrieving default retry instance: {}", GET_VERTEX_TAX_RETRY_DEFAULT_NAME)
retryInstance
}
}
編輯:
@Autowired
var getTaxResilience: GetTaxResilience = null
withRetry(getTaxResilience.getDefaultRetryInstance())
而且發生的錯誤已經是可序列化的..
public class RetryConfig implements Serializable
編輯2
val calculateResultDF = preparedDataSetDF.mapPartitions(iterator => {
val calculateResultDF = iterator.map(row => {
//retry stuff
)
calculateResultDF
}).toDF()
spark.sql(sqlBuilder.createStagingTableInsertIntoSQL(jobInfoCase.run_id)).toDF()
insertIntoExceptionArchiveTable(spark, jobInfoCase.run_id)
uj5u.com熱心網友回復:
Spark 正在嘗試序列化retryConfig物件的欄位。該retryConfig欄位中的物件包含對不可序列化且您無法使其可序列化的事物的參考。
一種解決方案是標記retryConfig @transient. 這將防止它被序列化(在接收端,它將是null)。其他val依賴于@transient欄位的 s (在這種情況下retryRegistry,以及傳遞性地,retryInstance)也應該標記為@transient。
然后,您將定義一個readResolve方法,該方法將在接收端被呼叫。此方法將回傳一個新GetTaxResilience的 ,它將具有適當的retryConfig//值retryRegistry。retryInstance
class GetTaxResilience extends Serializable {
private val logger = LoggerFactory.getLogger(this.getClass)
@transient val retryConfig = RetryConfig.custom()
.maxAttempts(RESILIENCE_RETRY_MAX_ATTEMPTS)
.retryExceptions(classOf[StatusRuntimeException])
.intervalFunction(IntervalFunction.ofRandomized(RESILIENCE_RETRY_INTERVAL_MILLISECONDS))
.build
@transient val retryRegistry = RetryRegistry.of(retryConfig)
@transient val retryInstance = retryRegistry.retry(GET_VERTEX_TAX_RETRY_DEFAULT_NAME, retryConfig)
def getDefaultRetryInstance(): Retry = {
// default retry instance configured in yaml
logger.info("Retrieving default retry instance: {}", GET_VERTEX_TAX_RETRY_DEFAULT_NAME)
retryInstance
}
private def readResolve: AnyRef = new GetTaxResilience
}
在這種特殊情況下,由于GetTaxResilience不接受建構式引數,因此將其設為 a 可能是有意義的object,在這種情況下,它不必設為Serializable或具有@transients 或 a readResolve。
object GetTaxResilience {
private val logger = LoggerFactory.getLogger(this.getClass)
val retryConfig = RetryConfig.custom()
.maxAttempts(RESILIENCE_RETRY_MAX_ATTEMPTS)
.retryExceptions(classOf[StatusRuntimeException])
.intervalFunction(IntervalFunction.ofRandomized(RESILIENCE_RETRY_INTERVAL_MILLISECONDS))
.build
val retryRegistry = RetryRegistry.of(retryConfig)
val retryInstance = retryRegistry.retry(GET_VERTEX_TAX_RETRY_DEFAULT_NAME, retryConfig)
def getDefaultRetryInstance(): Retry = {
// default retry instance configured in yaml
logger.info("Retrieving default retry instance: {}", GET_VERTEX_TAX_RETRY_DEFAULT_NAME)
retryInstance
}
}
然后在 Scala 代碼中訪問默認的重試實體,你只需要:
GetTaxResilience.getDefaultRetryInstance()
(雖然更 Scala 慣用的方式只是GetTaxResilience.retryInstance)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/508553.html
