簡體   English   中英

Spring,Infinispan和JGroups-以編程方式進行配置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM