下面是使用的组件
我有一个使用粘性会话的Web应用程序,我想使用apache ignite迁移到非粘性会话。我遵循apache ignite的“ Web会话群集”指南来实施更改。添加了一个负载平衡器,该负载平衡器以循环机制将流量路由到已配置的节点列表。我在端口8080上运行节点1,在端口9090上运行节点2。两个节点都在功能区负载平衡器中配置。
按照指南中的说明进行配置更改后,我能够成功运行单个节点。我可以在visor中使用以下命令查看apache ignite缓存中的会话和值
./ignitevisorcmd.sh cache session-cache -scan
但是当我启动第二个节点并请求命中节点2时,会话将变得无效,并且由于会话信息的不可用,应用程序将引发错误。
我怀疑tomcat的节点2在调用“ apache-ignite” WebSessionFilter.class之前创建了一个新会话,并且tomcat不知道该会话已存在于ignite中。然后,当调用org.apache.ignite.cache.websession.WebSessionFilter时,它将使用org.apache.ignite.cache.websession.WebSessionV2包装新创建的HttpSession,并将其作为新会话推送到缓存存储中。仅供参考,我确实使用SessionListener初始化了带有少量对象的会话。
以下是我在此处发布之前所做的检查/尝试
default-config.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
Alter configuration below as needed.
-->
<bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="cacheConfiguration">
<bean id="igniteCacheConfiguration" class="org.apache.ignite.configuration.CacheConfiguration">
<!-- Cache name. -->
<property name="name" value="session-cache"/>
<!-- Cache mode. -->
<property name="cacheMode" value="PARTITIONED"/>
<property name="backups" value="2"/>
<property name="statisticsEnabled" value="true"/>
<property name="managementEnabled" value="true" />
</bean>
</property>
</bean>
web.xml
<listener>
<listener-class>org.apache.ignite.startup.servlet.ServletContextListenerStartup</listener- class>
</listener>
<filter>
<filter-name>IgniteWebSessionsFilter</filter-name>
<filter-class>org.apache.ignite.cache.websession.WebSessionFilter</filter-class>
</filter>
<!-- You can also specify a custom URL pattern. -->
<filter-mapping>
<filter-name>IgniteWebSessionsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Specify Ignite configuration (relative to META-INF folder or Ignite_HOME). -->
<context-param>
<param-name>IgniteConfigurationFilePath</param-name>
<param-value>default-config.xml </param-value>
</context-param>
<!-- Specify the name of Ignite cache for web sessions. -->
<context-param>
<param-name>IgniteWebSessionsCacheName</param-name>
<param-value>session-cache</param-value>
</context-param>
pom.xml
<ignite.version>2.6.0</ignite.version>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version> ${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-web</artifactId>
<version> ${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-log4j</artifactId>
<version>${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-spring</artifactId>
<version>${ignite.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.0</version>
</dependency>
我需要了解使2个节点进行Web会话所需要做的工作。
答案 0 :(得分:0)
发现问题的根本原因是我们正在使用SessionRequestListeners访问会话信息。这些侦听器在Apache Ignite WebFilter之前被调用,从而导致在Ignite可以在Ignite的缓存中找到该会话之前创建一个新会话。当调用Apache Ignite WebFilter时,由于有一个新会话可用,因此它仅使用现有会话并对其进行缓存。
解决方案-使用过滤器代替关键侦听器,并删除非关键侦听器,并且现在可以正常工作。
例如 删除了org.springframework.web.context.request.RequestContextListener 在IgniteFilter之后按顺序添加了org.springframework.web.filter.RequestContextFilter