Весенняя сессия для Pivotal GemFire ​​Multi-Session - PullRequest
0 голосов
/ 29 августа 2018

Мы пытаемся найти решение для нелипкого сеанса для розничной торговли на разных серверах. Используются следующие серверы: WebLogic 12.2.1.3 и TomcatEE 7.0.5. Мы можем видеть сеансы, сохраняющиеся на разных серверах.

httpServletRequest.getSession() иногда пытается получить сеанс из контейнера, а не из GemFire.

Кроме того, идентификатор сеанса, который мы видим в файлах cookie клиента и журналах сервера, отличается от того, что видно внутри GemFire. Это ожидается?

EDIT: Идентификатор сеанса, созданный внутри GemFire, кодируется в base64 в браузере клиента. Это ответило бы на поставленный выше вопрос.

1 Ответ

0 голосов
/ 01 сентября 2018

Убедитесь, что вы "включили" Spring Session для Pivotal GemFire ​​ во всех экземплярах приложения (Spring Boot), которые вы развернули в WebLogic и TomcatEE. Это так просто, как показано ниже:

@SpringBootApplication
@EnableGemFireHttpSession
class MySpringBootWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }

    ...
}

@EnableGemFireHttpSession является ключевым. Также убедитесь, что экземпляры приложений, развернутые в каждом из WebLogic и TomcatEE, совместно используют один и тот же регион в базовом кластере Pivotal GemFire, при условии, что в WebLogic и TomcatEE существует один кластер GemFire, обслуживающий приложения.

Например, если вы явно задали регион, используя:

@EnableGemFireHttpSession(regionName = "MySessionRegion")

Убедитесь, что все экземпляры приложения используют одно и то же имя региона (т.е. «MySessionRegion»). Кроме того, начиная с SSDG 2.0.5.RELEASE имя региона можно настроить с помощью свойства в файле application.properties Spring Boot:

spring.session.data.gemfire.session.region.name=MySessionRegion

Кроме того, убедитесь, что все приложения настроены для взаимодействия с одним и тем же кластером GemFire. Это зависит от Pool, который регион Spring Session использует для связи с кластером GemFire. Имя пула настраивается с помощью аннотации, например:

@EnableGemFireHttpSession(..., poolName = "SessionPool")

Затем необходимо настроить пул для всех экземпляров приложения для подключения к одному и тому же кластеру GemFire, в идеале с локаторами, например:

@ Конфигурация Класс MyGemFireConfiguration {

@Bean("SessionPool")
PoolFactoryBean sessionPool() {

    PoolFactoryBean sessionPool = new PoolFactoryBean();

    sessionPool.setName("SessionPool");
    sessionPool.setLocators(Arrays.asList(new ConnectionEndpoint("host1", port1),
        new ConnectionEndpoint("host2", port2),
        ...,
        new ConnectionEndpoint("hostN", portN));

    return sessionPool;
}

...

}

В качестве альтернативы, вы можете настроить пул GemFire ​​«DEFAULT», предполагая, что настроенное клиентское состояние сеанса, в котором сохраняется область PROXY, использует пул «DEFAULT», который будет использоваться, когда пул явно не настроен / не назван. Для пример .

Последнее, о чем следует помнить, - это если вы используете топологию GemFire ​​WAN с несколькими сайтами, где каждый сайт обслуживает определенную коллекцию приложений, разделенных сервером приложений, например (то есть WebLogic против TomcatEE). Затем вы должны убедиться, что вы настроили GemFire ​​WAN для координации между несколькими кластерами GemFire. Это выходит за рамки этого ответа, и поэтому я призываю вас взглянуть на это .

Не стесняйтесь делиться любыми примерами кода, конфигурации и / или тестами, которые у вас есть, которые могут пролить свет на проблемы, с которыми вы столкнулись.

...