IScheduledExecutorService Hazelcast не может сериализовать задачу - PullRequest
0 голосов
/ 06 июля 2018

У меня есть Hazelcast в моем проекте, который работает на двух участниках в кластере. Одновременно я использую Hazelcast IScheduledExecutorService для планирования задачи, которая получает некоторые данные из БД и помещает их в кеш с фиксированной скоростью.

Проблема в том, что у моего класса задач (задачи для этого планировщика) есть некоторые поля, которые нельзя сериализовать (IScheduledExecutorService пытается это сделать), такие как mybatis Mappers и CashManager hazelcast, которые получают и помещают данные из БД в кеш.

Я пытался использовать функции 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);
}

}

мой планировщик:

@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);
    }
}
* *} Тысяча двадцать-один

1 Ответ

0 голосов
/ 06 июля 2018

@ SpringAware отключен по умолчанию. (См. Этот выпуск , почему он был отключен). Вам нужно включить его, объявив <hz:spring-aware /> или программно, как в этом примере .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...