我是一个很新的人,他想尝试从EntryProcessor中“缓存”缓存,但是无法遍历应用程序中ScanQuery的结果
我已经点燃了带有两个原子分区缓存并启用了对等类加载的ignite v2.6.0集群:
Cache A : IgniteCache<Long, A>
Cache B : IgniteCache<UUID, ScheduledTask>
interface ScheduledTask extends Serializable {
Instant getExecuteAt()
}
one of classes that are stored in cache B:
class ExpirationTask implements ScheduledTask
Spring启动应用程序(用Kotlin写)对缓存A异步调用入口处理器。处理器在两个缓存(A和B)中填充数据。然后应用程序查询缓存B:
val dueQuery = ScanQuery<UUID, ScheduledTask> { _, task -> task.executeAt <= now }
bCache.query(dueQuery, { it.key }).use { taskKeys ->
for (taskKey in taskKeys) {
………………………
}
}
但是查询游标会抛出ClassCastException:
Caused by: java.lang.ClassCastException: ExpirationTask cannot be cast to ScheduledTask
at ….Scheduler$poll$dueQuery$1.apply(Scheduler:61)
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$ScanQueryIterator.advance(GridCacheQueryManager.java:3089)
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$ScanQueryIterator.onHasNext(GridCacheQueryManager.java:2982)
at org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:53)
at org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:45)
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager.runQuery(GridCacheQueryManager.java:1164)
at org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager.processQueryRequest(GridCacheDistributedQueryManager.java:230)
at org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$2.apply(GridCacheDistributedQueryManager.java:108)
at org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$2.apply(GridCacheDistributedQueryManager.java:106)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:1054)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:579)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:378)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:304)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:99)
at org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:293)
at org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1556)
at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1184)
at org.apache.ignite.internal.managers.communication.GridIoManager.access$4200(GridIoManager.java:125)
at org.apache.ignite.internal.managers.communication.GridIoManager$9.run(GridIoManager.java:1091)
... 3 common frames omitted
由于自定义序列化,A和B类都由OptimizedMarshaller封送,
data class B(val dueTime: Instant, val id: Long) : ScheduledTask {
override fun getExecuteAt(): Instant {
return dueTime
}
private fun writeObject(stream: ObjectOutputStream) {
// Only used to indicate custom serialization for Ignite. Real work done by writeReplace()
}
private fun readObject(stream: ObjectInputStream) {
// Only used to indicate custom serialization for Ignite. Real work done by writeReplace()
}
private fun writeReplace(): Any = Serializer(this)
class Serializer @JvmOverloads constructor(var source: B? = null) : Externalizable {
override fun readExternal(stream: ObjectInput) {
val dueTime = stream.readObject() as Instant
val id = stream.readLong()
source = B(dueTime, id)
}
override fun writeExternal(stream: ObjectOutput) {
stream.writeObject(source!!.dueTime)
stream.writeLong(source!!.id)
}
private fun readResolve(): Any = source!!
companion object {
private const val serialVersionUID: Long = 1
}
}
companion object {
private const val serialVersionUID: Long = 42
}
}
所以我正在寻找一种对缓存值执行多态查询的方法。
谢谢
答案 0 :(得分:0)
getClass().getClassLoader()
来进行调试。