我有两个spring-boot服务,它们通过缓存层相互通信(由于与问题无关的原因)。我正在使用JCache(jsr-107)api抽象出实际的缓存提供程序,在这种情况下为Hazelcast。我正在手动注册一些缓存事件侦听器(update,create和delete)并使用这些事件来执行某些操作。
一个简单的用例是service A
消耗CacheEntryUpdatedListener
事件,该事件是通过将某些数据推送到特定的缓存而创建的。当我开始service B
时。它可以正确启动并创建自己的Hazelcast群集节点。当service A
尝试加入该Hazelcast节点时,它会正确找到它,但立即断开连接,而我得到一个service B
,MarketStateRefreshListener是一个缓存事件侦听器,为什么Hazelcast会尝试将其持久化,这些监听器在java.io.NotSerializableException:c.i.c.e.i.b.ws.m.cache.listener.MarketStateRefreshListener
之外毫无意义,将它们保存到IMDG没有意义吗?我是否从根本上误解了Hazelcast集群如何工作?
这是hazelcast配置(两个服务都使用):
service B
我正在使用JCache,因此更新缓存事件由<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>
实例处理。这样的一类是:
javax.cache.event.CacheEntryUpdatedListener
偶数侦听器是spring @Component,@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()));
});
}
}
也是
致谢,
彼得