当前位置: 首页 > 知识库问答 >
问题:

使用Apache Ignite的Web会话集群。命中第二台服务器时会话无效

郏博瀚
2023-03-14
    null
./ignitevisorcmd.sh
cache session-cache -scan

但是,当我启动第二个节点并请求hits节点2时,会话会变得无效,应用程序会由于会话信息不可用而抛出错误。

我怀疑tomcat的节点2在“apache-ignite”websessionfilter.class被调用之前创建了一个新的会话,而tomcat并不知道ignite中已经存在一个会话。然后,当调用org.apache.ignite.cache.websession.websessionFilter时,它用org.apache.ignite.cache.websession.websessionv2包装新创建的HttpSession,并作为新会话推送到缓存存储区。请注意,我确实使用SessionListener用很少的对象初始化会话。

以下是我在这里发布之前所做的检查/试验

    null
<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>
    <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>

我需要了解什么需要做,使web会话工作与2个节点。

共有1个答案

羊毅庵
2023-03-14

发现问题的根本原因是我们使用了访问会话信息的SessionRequestListeners。在Apache Ignite WebFilter之前调用这些侦听器,从而在Ignite能够在Ignite的缓存中找到会话之前创建一个新会话。由于在调用Apache Ignite WebFilter时有一个新的会话可用,所以它只是使用现有的会话并缓存它。

解决方案-使用过滤器代替关键监听器,并删除非关键监听器和它的工作现在。

例如,删除了org.springframework.web.context.request.requestcontextlistener,在IgniteFilter之后按顺序添加了org.springframework.web.filter.requestcontextfilter

 类似资料:
  • 我需要一种跨不同dropwizard web服务共享会话的方法。在Jetty中,有一种方法可以做到这一点,即使用JDBCSessionManager和jdbcssessionmanager(http://wiki.eclipse.org/Jetty/Tutorial/Session_Clustering). 问题是dropwizard(0.7.1)没有公开所需org.eclipse.jetty.s

  • 我读过关于命名空间属性的文章。我尝试使用此功能: 它工作得很好。 作为一项改进,我希望覆盖会话服务,因此它将在任何地方使用,并使用依赖注入,而不是将会话服务耦合到addProduct函数中。 为此,我编辑了我的services.yaml 然后我更新CartController: 现在我得到了以下错误消息: 检测到服务“会话”的循环引用,路径:“会话”- 这个错误应该在这个问题上得到解决:#3626

  • 本文向大家介绍ASP.NET如何使用web服务的会话状态,包括了ASP.NET如何使用web服务的会话状态的使用技巧和注意事项,需要的朋友参考一下 在web服务中要用到ASP.NET中的会话对象,有2件事情需要做。   1.WebService 类需要继承System.Web.Services.WebService类   2.WebMethod中的EnableSession属性值应该设置为true

  • 目前,我正在尝试在Google云上创建一个Kubernetes集群,其中包含两个负载平衡器:一个用于后端(在Spring boot中),另一个用于前端(在Angular中),其中每个服务(负载平衡器)与两个副本(POD)通信。为了实现这一点,我创建了以下入口: 上面提到的入口可以使前端应用程序与后端应用程序提供的REST API进行通信。但是,我必须创建粘性会话,以便每个用户都与同一个POD进行通

  • 在我的Vaadin应用程序中,当Vaadin在“session Timeout”消息之后没有使会话无效时,我遇到了一个问题。收到此消息后,用户有时可以单击链接或刷新页面,并继续工作,就像他们仍在登录一样。我使用以下参数: Last参数(session-timeout)也在context.xml(session-timeout=900)和web.xml(session-config/session-

  • 我需要一起处理相同的消息集,为此,我尝试了Azure服务总线会话启用功能。为了测试这一点,我创建了一个非常简单的应用程序,一个消息在队列中成功提交,然而,当试图在“ReceiveSessionMessage”函数中接收消息时,消息会话不会返回,程序会在这一行之后退出。 我无法找出确切的根本原因,任何帮助都将不胜感激。谢谢 等待会话客户端。AcceptMessageSessionAsync();]