All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.web.HazelcastInstanceLoader Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2024 Hazelcast Inc.
 *
 * Licensed under the Hazelcast Community License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of the
 * License at
 *
 * http://hazelcast.com/hazelcast-community-license
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */

package com.hazelcast.web;

import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.client.config.XmlClientConfigBuilder;
import com.hazelcast.config.Config;
import com.hazelcast.config.ListenerConfig;
import com.hazelcast.config.UrlXmlConfig;
import com.hazelcast.config.XmlConfigBuilder;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.logging.ILogger;
import com.hazelcast.logging.Logger;
import com.hazelcast.web.listener.ClientLifecycleListener;
import com.hazelcast.web.listener.ServerLifecycleListener;

import jakarta.servlet.ServletException;
import java.io.IOException;

final class HazelcastInstanceLoader {

    private static final ILogger LOGGER = Logger.getLogger(HazelcastInstanceLoader.class);

    private HazelcastInstanceLoader() {
    }

    static HazelcastInstance loadInstance(ClusteredSessionService sessionService, WebFilterConfig filterConfig)
            throws ServletException {

        if (filterConfig.getInstanceName() != null) {
            if (filterConfig.isUseClient()) {
                return loadExistingClient(sessionService, filterConfig.getInstanceName());
            } else {
                return loadExistingInstance(sessionService, filterConfig.getInstanceName());
            }
        } else {
            if (filterConfig.isUseClient()) {
                return createClient(sessionService, filterConfig);
            } else {
                return createInstance(sessionService, filterConfig);
            }
        }
    }

    private static HazelcastInstance createInstance(ClusteredSessionService sessionService, WebFilterConfig filterConfig)
            throws ServletException {

        LOGGER.info("Creating a new HazelcastInstance for session replication");

        Config config;
        if (filterConfig.getConfigUrl() == null) {
            config = new XmlConfigBuilder().build();
        } else {
            try {
                config = new UrlXmlConfig(filterConfig.getConfigUrl());
            } catch (IOException e) {
                throw new ServletException(e);
            }
        }

        config.getMapConfig(filterConfig.getMapName()).setMaxIdleSeconds(filterConfig.getSessionTtlSeconds());
        config.addListenerConfig(new ListenerConfig(new ServerLifecycleListener(sessionService)));

        return Hazelcast.newHazelcastInstance(config);
    }

    private static HazelcastInstance createClient(ClusteredSessionService sessionService, WebFilterConfig filterConfig)
            throws ServletException {

        LOGGER.warning("Creating a new HazelcastClient for session replication...");
        LOGGER.warning("make sure this client has access to an already running cluster...");

        ClientConfig clientConfig;
        if (filterConfig.getConfigUrl() == null) {
            clientConfig = new ClientConfig();
        } else {
            try {
                clientConfig = new XmlClientConfigBuilder(filterConfig.getConfigUrl()).build();
            } catch (IOException e) {
                throw new ServletException("Failed to load client config XML file [" + filterConfig.getConfigUrl()
                        + "]:" + e.getMessage(), e);
            }
        }
        if (filterConfig.isStickySession()) {
            int initialBackoffMillis = clientConfig.getConnectionStrategyConfig()
                    .getConnectionRetryConfig().getInitialBackoffMillis();
            double multiplier = clientConfig
                    .getConnectionStrategyConfig().getConnectionRetryConfig().getMultiplier();

            // Limit connection attempts by 1
            clientConfig.getConnectionStrategyConfig().getConnectionRetryConfig()
                    .setMaxBackoffMillis(initialBackoffMillis * (int) multiplier);
        }

        clientConfig.addListenerConfig(new ListenerConfig(new ClientLifecycleListener(sessionService)));

        return HazelcastClient.newHazelcastClient(clientConfig);
    }

    private static HazelcastInstance loadExistingInstance(ClusteredSessionService sessionService, String instanceName)
            throws ServletException {

        LOGGER.info("Using existing Hazelcast instance with name [" + instanceName + "] for session replication");
        HazelcastInstance instance = Hazelcast.getHazelcastInstanceByName(instanceName);
        if (instance == null) {
            throw new ServletException("Hazelcast instance with name [" + instanceName + "] could not be found.");
        }
        instance.getLifecycleService().addLifecycleListener(new ClientLifecycleListener(sessionService));
        return instance;
    }

    private static HazelcastInstance loadExistingClient(ClusteredSessionService sessionService, String instanceName)
            throws ServletException {

        LOGGER.info("Using existing Hazelcast client instance with name [" + instanceName + "] for session replication");
        HazelcastInstance client = HazelcastClient.getHazelcastClientByName(instanceName);
        if (client == null) {
            throw new ServletException("Hazelcast client instance with name [" + instanceName + "] could not be found.");
        }
        client.getLifecycleService().addLifecycleListener(new ClientLifecycleListener(sessionService));
        return client;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy