Azure中的Memcached会话pipe理器:连接被强制closures

我正在使用Memcached会话pipe理器以非粘滞模式处理Tomcat会话。 我在Azure中的部署由一个工作者angular色组成,两个实例连接到运行我的Memcached服务器的Azure虚拟机。

一切工作都很好,我的会话被持久化,并透明地检索两个实例中的任何一个。 当会话闲置约4分钟时出现问题; 所有的事情都指出Azure负载平衡器在一段时间不活动之后closures到虚拟机的间谍caching连接。

我的MSMconfiguration是这样的:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:my-azure-vm.cloudapp.net:11211" sticky="false" sessionBackupAsync="false" sessionBackupTimeout="10000" lockingMode="uriPattern:/path1|/path2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js|ttf|eot|svg|woff)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" customConverter="de.javakaffee.web.msm.serializer.kryo.HibernateCollectionsSerializerFactory"/> 

由spymemcached客户端打印的stacktrace是这样的:

 INFO net.spy.memcached.MemcachedConnection: Reconnecting due to exception on {QA sa=/10.194.132.206:13000, #Rops=1, #Wops=0, #iq=0, topRop=net.spy.memcached.protocol.binary.StoreOperationImpl@1d95da8, topWop=null, toWrite=0, interested=1} java.io.IOException: An existing connection was forcibly closed by the remote host at sun.nio.ch.SocketDispatcher.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(Unknown Source) at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) at sun.nio.ch.IOUtil.read(Unknown Source) at sun.nio.ch.SocketChannelImpl.read(Unknown Source) at net.spy.memcached.MemcachedConnection.handleReads (MemcachedConnection.java:303) at net.spy.memcached.MemcachedConnection.handleIO (MemcachedConnection.java:264) at net.spy.memcached.MemcachedConnection.handleIO (MemcachedConnection.java:184) at net.spy.memcached.MemcachedClient.run(MemcachedClient.java:1298) 

鉴于Azure中的空闲时间限制,是否有其他方法可以使MSM在azure色的云中工作?

没有什么东西可以解决这个问题。 但是你可以inheritanceMemcachedBackupSessionManager,并使用backgroundProcess方法(每秒或每10秒由tomcat调用,不知道这一点)来ping你configuration的memcached。 一个非常简单的实现如下所示:

 package de.javakaffee.web.msm; public class MyMsm extends MemcachedBackupSessionManager { @Override public void backgroundProcess() { super.backgroundProcess(); final MemcachedNodesManager nodesManager = _msm.getMemcachedNodesManager(); // got through all configured node ids and ping each memcached // with a dummy key. // _msm.newSessionId("ping") generates eg ping-n1 for a nodeId n1 // so this will be routed the related memcached node for (String nodeId : nodesManager.getPrimaryNodeIds()) { // use async here so that no error handling is needed _msm.getMemcached().asyncGet(_msm.newSessionId("ping")); } } } 

然后你jar这个类,把jar放在$ CATALINA_HOME / lib中,除了msm jar,并把Manager的类名className="de.javakaffee.web.msm.MyMsm"

如果你喜欢,你也可以fork msm,并添加一个拉的请求,使这个可configuration的:-)