Повторное подключение клиента Apache Ignite при перезапуске сервера

Я использую Apache Ignite для кэширования и запускаю сервер на одном узле, только инициализируя клиент Ignite с помощью этого кода: -

public class IgniteUtil {

    private static final Log logger = LogFactory.getLog(IgniteUtil.class.getName());


    public static boolean initializeIgniteClient() {

        try{    
            String hostName="localhost:47500..47509";

            logger.info("Connecting to Apache ignite Server with host:port=" + hostName);           
            TcpDiscoverySpi spi = new TcpDiscoverySpi();
            IgniteConfiguration cfg = new IgniteConfiguration();
            TcpDiscoveryVmIpFinder finder =new TcpDiscoveryVmIpFinder();
            List<String>addressList=new ArrayList<>();
            addressList.add(hostName);
            finder.setAddresses(addressList);
            spi.setIpFinder(finder);

            spi.setJoinTimeout(600);
            cfg.setDiscoverySpi(spi);
            cfg.setPeerClassLoadingEnabled(true);
            Ignition.setClientMode(true);
            URL xml = U.resolveIgniteUrl("log4j2.xml", false);
            IgniteLogger log = new Log4J2Logger(xml);
            cfg.setGridLogger(log);
            Ignition.start(cfg);
            if(!Ignition.ignite().cluster().forServers().nodes().isEmpty())
            {           
                logger.info("Connecting to Apache ignite Server SUCCESS with hostName="+hostName);
                return true;
            }else{
                logger.error("Connecting to Apache ignite Server FAILED with hostName="+hostName);
                return false;
            }
        }catch(Exception e)
        {
            logger.error("Connection to Apache ignite Server failed...",e);
            e.printStackTrace();
            return false;
        }

    }

Предположим, что когда сервер ignite выходит из строя, выдается исключение и предпринимается попытка повторного подключения клиента с использованием приведенного ниже кода. Каждая попытка переподключения сервера дает задержку около 20 секунд, пока сервер не отключится. Как мне решить эту проблему наилучшим образом?

catch(Exception e)
        {
            if(e instanceof CacheException) {
                if (e.getCause() instanceof
                        IgniteClientDisconnectedException)
                {
                    Ignition.stop(true);
                    IgniteUtil.initializeIgniteClient();
                    logger.info("Reattempt failed");
                }else if (e.getCause() instanceof
                        IgniteClientDisconnectedCheckedException) {
                    Ignition.stop(true);
                    IgniteUtil.initializeIgniteClient();
                    logger.info("Reattempt failed");
                }else if (e.getCause() instanceof
                        NodeStoppingException) {
                    Ignition.stop(true);
                    IgniteUtil.initializeIgniteClient();
                    logger.info("Reattempt failed");
                }else{
                    // nothing to do as not related to ignite server shutdown       
                    e.printStackTrace();
                }
            } else if(e instanceof IllegalStateException) {
                Ignition.stop(true);
                IgniteUtil.initializeIgniteClient();
                logger.info("Reattempt failed");
            }else{
                // nothing to do as not related to ignite server shutdown           }
                e.printStackTrace();
            }
        }

person Raja Sonvaniya    schedule 01.09.2017    source источник


Ответы (1)


Если сервер выйдет из строя, клиент выбросит IgniteClientDisconnectedException, у него есть будущее, которое будет завершено, когда клиент снова подключится к серверу: IgniteClientDisconnectedException.reconnectFuture().get().

person Mitya XMitya    schedule 01.09.2017
comment
это будет блокировать, я думаю, не разрешит другие операции, если они не выполняются в отдельном потоке ... В соответствии с моим пониманием OP хочет продолжать попытки переподключения с каждым попаданием в кеш, пока сервер не появится и приложение не продолжит работать .... которые проверяют, работает ли сервер или не занимает 20 секунд при фактическом повторном подключении ... должен быть лучший способ для этой проверки, пока ошибка с зажиганием не будет устранена issues.apache.org/jira/browse/IGNITE-2766 - person user2572801; 02.09.2017
comment
Будет ли IgniteClientDisconnectedException.reconnectFuture (). Get () приостановить приложение до тех пор, пока я не подключусь к серверу? если да, то это не требование, приложение должно работать, даже если сервер не работает. Если возможно, укажите любую другую альтернативу. Спасибо. - person Raja Sonvaniya; 04.09.2017
comment
Вам не нужно блокировать это будущее, это просто удобный способ дождаться повторного подключения. Если вы не ждете, любая операция Ignite вызовет исключение до тех пор, пока клиент не будет повторно подключен, поэтому вам просто нужно обработать это исключение способом, который удовлетворяет вашим требованиям. - person Valentin Kulichenko; 05.09.2017