[英]Spring, Infinispan and JGroups - configuration programmatically
我正在使用Spring 4.3,Infinispan 9.11和JGroups 4.0.6。 對於JGroups,我使用的是xml配置,其中有:
<TCPPING async_discovery="true"
initial_hosts="${jgroups.tcpping.initial_hosts: HOSTS}"
(...)
假設我想將配置保留在xml中,但是,我需要應用另一個(yml)配置文件中的主機列表。 一種可能的方法是從Java讀取yml屬性(我有那部分)並將它們以某種方式設置為JGroups配置。
到目前為止,這是我嘗試過的:
EmbeddedCacheManager cacheManager = new DefaultCacheManager(
GlobalConfigurationBuilder.defaultClusteredBuilder()
.transport()
.nodeName(nodeName)
.addProperty(JGroupsTransport.CONFIGURATION_FILE, "tcp.xml")
.addProperty(JGroupsTransport.CONFIGURATION_STRING, "jgroups.tcpping.initial_hosts: HOSTS")
.build(),
new ConfigurationBuilder()
...
.build()
);
但是,配置字符串不起作用。
UPDATE。 另一嘗試:
JGroupsTransport transport = (JGroupsTransport)(cacheManager.getCacheManagerConfiguration().transport().transport());
TCPPING ping = transport.getChannel().getProtocolStack().findProtocol(TCPPING.class);
ping.setPortRange(1);
ping.setInitialHosts(Arrays.asList(new IpAddress("HOST1:PORT1"), new IpAddress("HOST2:PORT2")));
這似乎也不起作用。
如果您具有JGroups JChannel,則可以像這樣獲取TCPPING: channel.getProtocolStack().findProtocol(TCPPING.class)
,然后調用設置器在其上設置initial_hosts。
正如Bela Ban和Altanis所指出的那樣,問題在於Infinispan在調用JChannel.connect()之前才能夠修改傳輸屬性。 我找到了一種解決方法:
public class JGroupsChannelLookupImpl implements JGroupsChannelLookup {
@Override
public JChannel getJGroupsChannel(Properties p) {
JChannel channel = null;
try {
channel = new JChannel("tcp.xml");
TCPPING ping = channel.getProtocolStack().findProtocol(TCPPING.class);
ping.setInitialHosts(Arrays.asList(HOST1, HOST2, HOST3, ...));
}
catch (Exception ex) {
// do sth with the ex
}
Objects.requireNonNull(channel);
return channel;
}
(...)
}
然后,在創建DefaultCacheManager時,無需直接從xml加載配置,而只需加載通道查找:
new DefaultCacheManager(
GlobalConfigurationBuilder.defaultClusteredBuilder()
.transport()
.nodeName(nodeName)
.addProperty(JGroupsTransport.CHANNEL_LOOKUP, JGroupsChannelLookupImpl.class.getName())
.build(),
(...)
可以正常工作!
在深入研究Infinispan內部之前,讓我嘗試一下簡單的方法。
您是否知道應用程序啟動時的所有主機? 如果是這樣,則可以使用環境變量(或系統屬性)來注入主機列表。 只需執行java myApp -Djgroups.tcpping.initial_hosts=host1..
。
另一種方法是像您一樣深入研究Infinispan內部。 唯一的問題是您的實現太晚了(此時JGroups通道已被初始化)。 因此,您需要注入一個視圖(可能使用INJECT_VIEW
協議,請參見手冊 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.