我有一个基本的Ignite持久性设置。现在,它是在服务器模式下运行的单个节点,我从中连接两个客户端。当我通过SQL从这些客户端之一(以下称为“客户端1”)插入数据时,可以再次使用SQL选择它并返回结果。在下面的“客户端2”中,当我尝试获取应该已创建以代表该表的缓存时,该缓存为空。
服务器使用以下Dockerfile运行apacheignite映像:
FROM apacheignite/ignite
# for jdbc connection
EXPOSE 10800
EXPOSE 47100-47109
EXPOSE 47500-47509
# for rest api
EXPOSE 8080
WORKDIR /app
COPY ./config /app/config
RUN mv /opt/ignite/apache-ignite/libs/optional/ignite-aws /opt/ignite/apache-ignite/libs/
RUN mv /opt/ignite/apache-ignite/libs/optional/ignite-rest-http /opt/ignite/apache-ignite/libs/
CMD /opt/ignite/apache-ignite/bin/ignite.sh /app/config/ignite-config.xml -v
此处引用的ignite-config.xml
的相关部分如下:
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
<property name="defaultDataRegionConfiguration">
<bean class="org.apache.ignite.configuration.DataRegionConfiguration">
<property name="persistenceEnabled" value="true"/>
</bean>
</property>
</bean>
</property>
<property name="discoverySpi">
<bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
<property name="ipFinder">
<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
<property name="addresses">
<list>
<value>127.0.0.1:47500..47509</value>
</list>
</property>
</bean>
</property>
</bean>
</property>
</bean>
我还确保使用激活服务器容器上的群集,因为Persistence默认将群集设置为不活动。
/opt/ignite/apache-ignite/bin/control.sh --activate
客户端1通过Thin JDBC驱动程序连接,并执行一些CREATE TABLE
和INSERT
。以后当我在SELECT
中使用DBeaver之类的东西时,可以看到此数据。
此客户端也与Compose中的其他客户端一起在docker中运行。它真正要做的就是循环调用以下内容,其中$file
是一个包含CREATE TABLE
,INSERT
等的SQL文件。
/opt/ignite/apache-ignite/bin/sqlline.sh -u jdbc:ignite:thin://server:10800 -f $file;
一个这样的SQL文件如下:
DROP TABLE IF EXISTS attributes;
DROP INDEX IF EXISTS idx_attributes_token;
CREATE TABLE attributes (
token VARCHAR,
attributeId LONG,
name VARCHAR,
PRIMARY KEY(token, attributeId)
) WITH "affinityKey=token";
CREATE INDEX idx_attributes_token ON attributes (token);
INSERT INTO attributes (token, attributeId, name) VALUES ('abc123', 123, 'some name');
客户端2大致按以下方式连接到Ignite:
IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
ipFinder.setAddresses(igniteConfig.getAddresses()); // will be "localhost:10800" -- I map 10800:10800 when the "Server" container runs
discoverySpi.setIpFinder(ipFinder);
igniteConfiguration.setDiscoverySpi(discoverySpi);
Ignite ignite = Ignition.start(igniteConfiguration);
IgniteCache<Object, String> attributesCache = ignite.cache("SQL_PUBLIC_ATTRIBUTES"); // null
// if i use ignite.getOrCreateCache("SQL_PUBLIC_ATTRIBUTES") instead then of course it's a cache of size 0.
最终,我希望能够抓住此缓存并使用Ignite文档中描述的StreamVisitor
对每个缓存执行操作。据称,它看起来像:
...
IgniteDataStreamer<Object, AttributeWithGroup> attributeStreamer = ignite.dataStreamer(attributesCache.getName());
attributeStreamer.receiver(StreamVisitor.from((cache, entity) -> {
Object key = entity.getKey();
Attribute attribute = entity.getValue();
// do some stuff
}));
...但是lambda永远不会运行,因为缓存为空。
为什么在SQL中看到的内容和在缓存中看到的内容之间没有这种联系?
答案 0 :(得分:0)
通过这种方式,您将启动“客户端2”,它将作为没有缓存的单个服务器节点启动。
您还应该将47500用于发现端口,而不是10800。10800用于瘦客户机。
还请注意,您的IpFinder的Vm与多播不匹配。