using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Configuration;
namespace RuleEngine.Tool
{
/// <summary>
/// Sessionmodel实体类
/// </summary>
/// <remarks>如果出现数据未读到的情况,则设置标识本次运行完成后5分钟后再次允许一遍。</remarks>
public class SessionModel
{
private string _sessionNo;
private DateTime _sessionInTime= DateTime.Now;
private int _currentlevel=0;//不为0是代表停止
private int _oncelevel=0;
/// <summary>
/// session标志--一个推理的标志
/// </summary>
public string SessionNo
{
get { return _sessionNo; }
set { _sessionNo = value; }
}
/// <summary>
/// 推理进入时间
/// </summary>
public DateTime SessionInTime
{
get { return _sessionInTime; }
}
/// <summary>
/// 当前推理级别
/// </summary>
/// <remarks> 数据延迟---每次重新执行推理时设置为0,不为0是代表停止</remarks>
public int Currentlevel
{
get { return _currentlevel; }
set { _currentlevel = value; }
}
/// <summary>
/// 曾经级别
/// </summary>
public int Oncelevel
{
get { return _oncelevel; }
set { _oncelevel = value; }
}
}
/// <summary>
/// Session管理类
/// </summary>
public class SessionHelper : IHttpHandler,IRequiresSessionState
{
private HttpSessionState curSession;
private List<SessionModel> list = new List<SessionModel>();
private int oneleveltime = int.Parse(System.Configuration.ConfigurationManager.AppSettings["1"]);
private int twoleveltime = int.Parse(System.Configuration.ConfigurationManager.AppSettings["2"]);
private int threeleveltime = int.Parse(System.Configuration.ConfigurationManager.AppSettings["3"]);
public SessionHelper(HttpSessionState session)
{
this.curSession = session;
}
public void ProcessRequest(HttpContext context)
{
}
public bool IsReusable
{
get { return true; }
}
//3.操作Session 时间。 供Global中定时刷新Global使用。 修改Session等级,负责启动推理流程。
//4.删除Session 把具体中间结果移到备份数据表中。
//5.停止Session
//6.设置30分钟过期的Session,如果规则存在则,对应中间结果设置为停止,并移除中间结果,存入备份库中。Session中也移除,不再进入计算。推送中间结果。
/// <summary>
/// 加入Session List中
/// </summary>
/// <param name="model"></param>
public void Add(string SessionNo)
{
SessionModel model = new SessionModel();
model.SessionNo = SessionNo;
list.Add(model);
curSession["List"] = list;
}
/// <summary>
/// 读取Session List
/// </summary>
/// <param name="SessionNo"></param>
/// <returns></returns>
public SessionModel Query(string SessionNo)
{
list = (List<SessionModel>)curSession["List"];
return list.Find(
delegate(SessionModel m)
{
return m.SessionNo == SessionNo;
});
}
/// <summary>
/// 读取Session索引
/// </summary>
/// <param name="SessionNo"></param>
/// <returns></returns>
public int QueryListIndex(string SessionNo)
{
list = (List<SessionModel>)curSession["List"];
return list.FindIndex (
delegate(SessionModel m)
{
return m.SessionNo == SessionNo;
});
}
public void Oper(SessionModel model)
{
SessionModel m = model;
//操作Session 时间。 供Global中定时刷新Global使用。 修改Session等级,负责启动推理流程。
//操作时间 -- 根据过去等级 进行开始时间与当前时间比对。
if (model.Currentlevel>0)//停止
{
switch(model.Oncelevel)
{
case 1:
if ((DateTime.Now - model.SessionInTime).Minutes.CompareTo(oneleveltime)>=0)
{
model.Currentlevel = 0;
}
break;
case 2:
if ((DateTime.Now - model.SessionInTime).Minutes.CompareTo(twoleveltime)>=0)
{
model.Currentlevel = 0;
}
break;
case 3:
if ((DateTime.Now - model.SessionInTime).Minutes.CompareTo(threeleveltime)>=0)
{
model.Currentlevel = 0;
}
break;
default:
break;
}
}
}
public void Set(string SessionNo)
{
list = (List<SessionModel>)curSession["List"];
int index = QueryListIndex(SessionNo);
SessionModel m = list[index];
//设置等级,不停止推理, 标志+1,当前值为标志值。
if (m.Oncelevel >= 3)
{
}
else
{
m.Oncelevel= m.Oncelevel + 1;
m.Currentlevel = m.Oncelevel;
}
curSession["List"] = list;
}
}
}
本人声明:沐海(http://my.oschina.net/mahaisong) 以上文章是经过本人设计实践和阅读其他文档得出。如果需要探讨或指教可以留言!欢迎交流!