У меня есть две службы весенней загрузки, которые общаются друг с другом через уровень кэширования (по причинам, не связанным с этой проблемой).Я использую API JCache (jsr-107) для абстрагирования от реального поставщика кэша, в данном случае Hazelcast.Я вручную регистрирую несколько слушателей событий кэша (обновление, создание и удаление) и использую эти события для выполнения некоторых действий.
Простым вариантом использования будет service A
, потребляющее событие CacheEntryUpdatedListener
, которое service B
создается путем отправки некоторых данных в определенный кеш.Когда я начинаю service A
.он запускается правильно и создает свой собственный узел кластера Hazelcast.Когда service B
пытается присоединиться к этому узлу Hazelcast, он находит его правильно, но затем немедленно отключается, и я получаю java.io.NotSerializableException:c.i.c.e.i.b.ws.m.cache.listener.MarketStateRefreshListener
, MarketStateRefreshListener - слушатель события кэша, почему Hazelcast пытается его сохранить, эти слушатели не имеют смыслаза пределами service B
нет смысла их сохранять в IMDG?Я в корне не понимаю, как работают кластеры Hazelcast?
Вот конфигурация hazelcast (используется обеими службами):
<hazelcast
xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.10.xsd"
xmlns="http://www.hazelcast.com/schema/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<group>
<name>cache_group_name</name>
</group>
<network>
<port>5701</port>
<join>
<multicast/>
</join>
</network>
<cache name="cache_name_1">
<!--<management-enabled>true</management-enabled>-->
<!--<backup-count>3</backup-count>-->
</cache>
<cache name="cache_name_2"/>
<cache name="cache_name_3"/>
</hazelcast>
Я использую JCache, поэтому события обновления кэша обрабатываются экземпляром javax.cache.event.CacheEntryUpdatedListener
.Один из таких классов:
@Slf4j
@Component
@AllArgsConstructor
public class MarketSummaryStateUpdatedListener implements CacheEntryUpdatedListener<String, MarketSummaryState> {
private CacheEventService eventService;
@Override
public void onUpdated(Iterable<CacheEntryEvent<? extends String, ? extends MarketSummaryState>> events)
throws CacheEntryListenerException {
events.forEach( event -> {
eventService.fireEvent(MARKET_STATE, event.getEventType(), EventData.of(event.getValue()));
});
}
}
Четный слушатель - это пружина @Component, как и private CacheEventService eventService;
С уважением,
Питер