Java Hazelcast';s IsScheduledExecutorService可以';t序列化任务
我的项目中有一个Hazelcast,它在集群中的两个成员上工作。同时,我使用Hazelcast的Java Hazelcast';s IsScheduledExecutorService可以';t序列化任务,java,spring,serialization,scheduled-tasks,hazelcast,Java,Spring,Serialization,Scheduled Tasks,Hazelcast,我的项目中有一个Hazelcast,它在集群中的两个成员上工作。同时,我使用Hazelcast的isScheduledExecutorService来调度任务,该任务从数据库中获取一些数据,并以固定速率将其放入缓存中 问题是,我的任务类(该调度器的任务)有一些字段无法序列化(isScheduledExecutorService尝试这样做),例如mybatis Mappers和hazelcast的CacheManager,它们从DB获取数据并将数据放入缓存 我尝试使用Spring的功能,例如在该字
isScheduledExecutorService
来调度任务,该任务从数据库中获取一些数据,并以固定速率将其放入缓存中
问题是,我的任务类(该调度器的任务)有一些字段无法序列化(isScheduledExecutorService
尝试这样做),例如mybatis Mappers和hazelcast的CacheManager,它们从DB获取数据并将数据放入缓存
我尝试使用Spring的功能,例如在该字段上使用@Autowire
,在类上使用@SpringAware
,但没有成功
可能有一些我不知道的Hazelcast或Spring功能?任何帮助都将不胜感激
我的任务类:
@Service
@SpringAware
public class MyTask implements Runnable, Serializable {
private static final Logger LOG = LoggerFactory.getLogger(MyTask.class);
private static final String CACHE1 = "cache1";
private static final String CACHE2 = "cache2";
private static final String KEY1 = "key1";
private static final String KEY2 = "key2";
@Autowired
private MapperOne mapperOne;
@Autowired
private MapperTwo mapperTwo;
@Autowired
// if mark it 'transient' it would be null for other threads
private transient CacheManager cacheManager;
@Override
public void run() {
LOG.info("ABOUT TO UPDATE CACHE");
List<SomeStuff> stuff1 = mapperOne.getData();
List<OtherStuff> stuff2 = mapperTwo.getData();
cacheManager.getCache(CACHE1).put(KEY1, stuff1);
cacheManager.getCache(CACHE2).put(KEY2, stuff2);
}
}@SpringAware在默认情况下被禁用。(请参见禁用它的原因)您需要通过声明
或类似的编程方式来启用它
@Service
public class MySchedulerService {
@Autowired
private MyTask myTask;
@PostConstruct
void init() {
if (hazelcastInstance.getCluster().getMembers().iterator().next().localMember()) {
IScheduledExecutorService notificationCacheService =
hazelcastInstance.getScheduledExecutorService("myService");
notificationCacheService.scheduleOnKeyOwnerAtFixedRate(
myTask, hazelcastInstance.getCluster().getLocalMember(), 0, 15, TimeUnit.SECONDS);
}
}