Как да се справя с грешката, хвърлена от ClusterListenerThread по време на инстанцирането (от пролетта) на моя компонент 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) на моя компонент Hazelcast Client?

nb. Разочарован съм от факта, че компонентът на клиента не се конструира (въпреки че няма налични членове), защото знам със сигурност, че вече конструиран клиент може да се справи с това, че всички негови членове станат недостъпни, и щастливо ще започне да работи отново, когато един или повече от тези членове стават отново достъпни.


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


Отговори (1)


Това, което трябва да направите, е да конфигурирате connectionAttemptLimit и connectionAttemptPeriod.

Ако зададете connectionAttemptLimit на INT_MAX и изберете разумен connectiontAttemptPeriod, клиентът практически ще се опитва да се свърже с даден списък с членове завинаги на всеки X секунди. В момента това е по-скоро като заобиколно решение, защото когато отворите за първи път HazelcastClient, той ще блокира, докато един от членовете стане достъпен. Допълнително заобиколно решение, можете да опитате да отворите клиента в друга специална тема.

Относно създаването на напълно поддържана функция имаше дискусия от екипа на hazelcast тук. https://github.com/hazelcast/hazelcast/issues/552

Добавям въпрос като препратка към проблема.

person sancar    schedule 22.10.2015