Hazelcast JCache Listener сериализуется? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть две службы весенней загрузки, которые общаются друг с другом через уровень кэширования (по причинам, не связанным с этой проблемой).Я использую 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;

С уважением,
Питер

...