Spring, Infinispan и JGroups - конфигурация программно - PullRequest
0 голосов
/ 29 мая 2018

Я использую 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) файла конфигурации.Можно пойти путем чтения свойств yml из Java (у меня есть эта часть) и каким-то образом настроить их на конфигурацию 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()
    );

Однако строка конфигурации не выполняет эту работу.

ОБНОВЛЕНИЕ.Еще одна попытка:

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")));

Кажется, что это тоже не работает.

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Прежде чем копаться во внутренностях Infinispan, позвольте мне попробовать простой путь.

Знаете ли вы все хосты во время загрузки приложения?Если это так, вы можете использовать переменную среды (или системное свойство) для добавления списка хостов.Просто выполните java myApp -Djgroups.tcpping.initial_hosts=host1...

Другой способ сделать это - копаться во внутренностях Infinispan, как вы это делали.Единственная проблема заключается в том, что ваша реализация делает это слишком поздно (канал JGroups уже инициализирован в этот момент).Поэтому вам необходимо внедрить представление (возможно, используя протокол INJECT_VIEW, см. Руководство )

0 голосов
/ 31 мая 2018

Как указали Бела Бан и Алтанис, проблема в том, что 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(),
           (...)

Работает как положено!

0 голосов
/ 29 мая 2018

Если у вас есть JChannel JGroups, вы можете получить TCPPING следующим образом: channel.getProtocolStack().findProtocol(TCPPING.class) и затем вызвать установщик для установки initial_hosts на нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...