Как обрабатывать ошибку, выдаваемую ClusterListenerThread во время создания экземпляра (Spring) моего bean-компонента Hazelcast Client?

Я использую Spring для настройки (ленивой загрузки) клиента Hazelcast, который подключается к кластеру из 2-х элементов.

<hz:client id="hazelcast" lazy-init="true">
    <hz:group name="${HzName}" password="${HzPassword}"/>
    <hz:properties>
        <hz:property name="hazelcast.client.connection.timeout">10000</hz:property>
        <hz:property name="hazelcast.client.retry.count">600</hz:property>
        <hz:property name="hazelcast.jmx">true</hz:property>
        <hz:property name="hazelcast.logging.type">slf4j</hz:property>
    </hz:properties>
    <hz:network smart-routing="true" redo-operation="true" connection-attempt-period="5000"
                connection-attempt-limit="2">
        <hz:member>${HzMember1}</hz:member>
        <hz:member>${HzMember2}</hz:member>
    </hz:network>
</hz:client>

Моя проблема:

Если во время запуска моего приложения ОБА из членов кластера оказались недоступны, я вижу, что ClusterListenerThread выдает СЕРЬЕЗНОЕ исключение:

WARNING: Unable to get alive cluster connection, try in 4945 ms later, attempt 1 of 2.
16-Apr-2015 14:57:34 com.hazelcast.client.spi.impl.ClusterListenerThread
WARNING: Unable to get alive cluster connection, try in 4987 ms later, attempt 2 of 2.
16-Apr-2015 14:57:39 com.hazelcast.client.spi.impl.ClusterListenerThread
SEVERE: Error while connecting to cluster!
java.lang.IllegalStateException: Unable to connect to any address in the config!
    at com.hazelcast.client.spi.impl.ClusterListenerThread.connectToOne(ClusterListenerThread.java:273)
    at com.hazelcast.client.spi.impl.ClusterListenerThread.run(ClusterListenerThread.java:79)
Caused by: com.hazelcast.spi.exception.RetryableIOException: java.util.concurrent.ExecutionException: com.hazelcast.core.HazelcastException: java.net.ConnectException: Connection refused
    at com.hazelcast.client.connection.nio.ClientConnectionManagerImpl$OwnerConnectionFuture.createNew(ClientConnectionManagerImpl.java:649)
    at com.hazelcast.client.connection.nio.ClientConnectionManagerImpl$OwnerConnectionFuture.access$300(ClientConnectionManagerImpl.java:605)
    at com.hazelcast.client.connection.nio.ClientConnectionManagerImpl.ownerConnection(ClientConnectionManagerImpl.java:268)
    at com.hazelcast.client.spi.impl.ClusterListenerThread.connectToOne(ClusterListenerThread.java:245)

... что впоследствии приводит к тому, что мой bean-компонент Hazelcast Client не создается, и, следовательно, все ниже по течению, которое полагается на его существование, также взрывается.

SEVERE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hazelcast': Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public static com.hazelcast.core.HazelcastInstance com.hazelcast.client.HazelcastClient.newHazelcastClient(com.hazelcast.client.config.ClientConfig)] threw exception; nested exception is java.lang.IllegalStateException: Cannot get initial partitions!

Как я могу обнаружить и обработать ошибку, выдаваемую ClusterListenerThread во время создания экземпляра (Spring) моего bean-компонента Hazelcast Client?

nb. Я разочарован тем фактом, что компонент Client не создается (несмотря на отсутствие доступных членов), потому что я точно знаю, что уже созданный Client может справиться с тем, что все его члены станут недоступными, и с радостью снова начнет работать, когда один или несколько из этих участников снова становятся доступными.


person John W    schedule 16.04.2015    source источник


Ответы (1)


Что вам нужно сделать, так это настроить connectionAttemptLimit и connectionAttemptPeriod.

Если вы установите для connectionAttemptLimit значение INT_MAX и выберете разумное соединение tAttemptPeriod, клиент практически будет пытаться подключиться к заданному списку участников навсегда каждые X секунд. В настоящее время это больше похоже на обходной путь, потому что при первом открытии HazelcastClient он будет заблокирован, пока один из участников не станет доступным. Еще один способ обхода: вы можете попробовать открыть клиент в другом выделенном потоке.

Команда hazelcast обсуждала здесь полностью поддерживаемую функцию. https://github.com/hazelcast/hazelcast/issues/552

Я добавляю вопрос в качестве ссылки на проблему.

person sancar    schedule 22.10.2015