2014-11-21 20:32:36 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Web.Caching;
|
|
|
|
|
using System.Web.Hosting;
|
|
|
|
|
using FSLib.Network.Http;
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
using TrainInfomationProviderService.TrainInfo.Entities;
|
|
|
|
|
|
|
|
|
|
namespace TrainInfomationProviderService.TrainInfo
|
|
|
|
|
{
|
2015-07-16 21:00:51 +08:00
|
|
|
|
using TrainInfomationProviderService.Web;
|
|
|
|
|
|
2014-11-21 20:32:36 +08:00
|
|
|
|
public class TrainInfoManager
|
|
|
|
|
{
|
|
|
|
|
private static readonly object _lockObject = new object();
|
|
|
|
|
private static TrainInfoManager _stationManager;
|
|
|
|
|
|
|
|
|
|
public static TrainInfoManager Instance
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (_stationManager == null)
|
|
|
|
|
{
|
|
|
|
|
lock (_lockObject)
|
|
|
|
|
{
|
|
|
|
|
if (_stationManager == null)
|
|
|
|
|
{
|
|
|
|
|
_stationManager = new TrainInfoManager();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _stationManager;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建 <see cref="TrainInfoManager" /> 的新实例(StationManager)
|
|
|
|
|
/// </summary>
|
|
|
|
|
protected TrainInfoManager()
|
|
|
|
|
{
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 车站管理器对象已新建");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string _dataFilePath;
|
2014-12-01 02:17:13 +08:00
|
|
|
|
string _masterDataStoreFilePath;
|
2014-11-21 20:32:36 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 仓库
|
|
|
|
|
/// </summary>
|
2014-12-01 02:17:13 +08:00
|
|
|
|
public IndexStorage IndexStorage
|
2014-11-21 20:32:36 +08:00
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
2014-11-27 23:25:36 +08:00
|
|
|
|
//if (RunTimeContext.IsWeb)
|
|
|
|
|
//{
|
|
|
|
|
// return HostingEnvironment.Cache["_12306trains"] as IndexStorage;
|
|
|
|
|
//}
|
2014-11-21 20:32:36 +08:00
|
|
|
|
return _storage;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-01 02:17:13 +08:00
|
|
|
|
public TrainDataMasterStore DataStore
|
|
|
|
|
{
|
|
|
|
|
get { return _dataStore; }
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-21 20:32:36 +08:00
|
|
|
|
public void Init()
|
|
|
|
|
{
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 正在初始化");
|
|
|
|
|
|
|
|
|
|
_dataFilePath = PathUtility.Combine(RunTimeContext.DataStorageRoot, "trains.json");
|
2014-12-01 02:17:13 +08:00
|
|
|
|
_masterDataStoreFilePath = PathUtility.Combine(RunTimeContext.DataStorageRoot, "trainDataStore.json");
|
2014-11-21 20:32:36 +08:00
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 目标缓存文件路径:{0}", _dataFilePath);
|
|
|
|
|
|
2014-11-27 23:25:36 +08:00
|
|
|
|
//if (RunTimeContext.IsWeb)
|
|
|
|
|
//{
|
|
|
|
|
// Trace.TraceInformation("[TAININFOMANGER] WEB模式");
|
|
|
|
|
|
|
|
|
|
// InitWeb();
|
|
|
|
|
//}
|
|
|
|
|
//else
|
|
|
|
|
//{
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 服务模式");
|
|
|
|
|
InitService();
|
|
|
|
|
//}
|
2014-11-21 20:32:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region web环境
|
|
|
|
|
|
2014-11-27 23:25:36 +08:00
|
|
|
|
///// <summary>
|
|
|
|
|
///// web环境初始化
|
|
|
|
|
///// </summary>
|
|
|
|
|
//void InitWeb()
|
|
|
|
|
//{
|
|
|
|
|
// Trace.TraceInformation("[TAININFOMANGER] 初始化WEB模式");
|
|
|
|
|
// LoadCache();
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//void LoadCache()
|
|
|
|
|
//{
|
|
|
|
|
// Trace.TraceInformation("[TAININFOMANGER] 正在检查缓存刷新");
|
|
|
|
|
// _storage = null;
|
|
|
|
|
// if (File.Exists(_dataFilePath))
|
|
|
|
|
// {
|
|
|
|
|
// Trace.TraceInformation("[TAININFOMANGER] 正在加载缓存");
|
|
|
|
|
// _storage = JsonConvert.DeserializeObject<IndexStorage>(File.ReadAllText(_dataFilePath));
|
|
|
|
|
// Trace.TraceInformation("[TAININFOMANGER] 缓存加载完成");
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// if (Storage != null)
|
|
|
|
|
// {
|
|
|
|
|
// Trace.TraceInformation("[TAININFOMANGER] 正在加入HttpRuntime缓存");
|
|
|
|
|
// HostingEnvironment.Cache.Add("_12306trains", Storage, new CacheDependency(_dataFilePath),
|
|
|
|
|
// Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.High,
|
|
|
|
|
// (_1, _2, _3) =>
|
|
|
|
|
// {
|
|
|
|
|
// Trace.TraceInformation("[TAININFOMANGER] HttpRuntime缓存已被清除,原因:{0},正在重新加载", _3);
|
|
|
|
|
// LoadCache();
|
|
|
|
|
// });
|
|
|
|
|
// Trace.TraceInformation("[TAININFOMANGER] HttpRuntime缓存加入完成");
|
|
|
|
|
// }
|
|
|
|
|
//}
|
2014-11-21 20:32:36 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 服务模式
|
|
|
|
|
|
|
|
|
|
private Timer _checkStationTimer;
|
|
|
|
|
private IndexStorage _storage;
|
2014-12-01 02:17:13 +08:00
|
|
|
|
TrainDataMasterStore _dataStore;
|
2014-11-21 20:32:36 +08:00
|
|
|
|
|
2014-11-27 23:25:36 +08:00
|
|
|
|
//#if DEBUG
|
|
|
|
|
// private bool _ininitalized = false;
|
|
|
|
|
//#else
|
|
|
|
|
// private bool _ininitalized = false;
|
|
|
|
|
//#endif
|
2014-11-21 20:32:36 +08:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 服务模式初始化
|
|
|
|
|
/// </summary>
|
|
|
|
|
void InitService()
|
|
|
|
|
{
|
2014-12-01 02:17:13 +08:00
|
|
|
|
if (_masterDataStoreFilePath.AsFileInfo().Exists)
|
|
|
|
|
{
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 正在加载车次数据存储");
|
|
|
|
|
_dataStore = JsonConvert.DeserializeObject<TrainDataMasterStore>(File.ReadAllText(_masterDataStoreFilePath));
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 车次数据存储加载完成");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_dataStore = new TrainDataMasterStore();
|
|
|
|
|
}
|
2014-11-21 20:32:36 +08:00
|
|
|
|
if (_dataFilePath.AsFileInfo().Exists)
|
|
|
|
|
{
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 正在加载文件缓存数据");
|
|
|
|
|
_storage = JsonConvert.DeserializeObject<IndexStorage>(File.ReadAllText(_dataFilePath));
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 文件缓存数据加载完成");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_storage = new IndexStorage();
|
|
|
|
|
}
|
2014-12-01 02:17:13 +08:00
|
|
|
|
|
2014-11-21 20:32:36 +08:00
|
|
|
|
var lastestVersion = GetLatestVersionFromWeb();
|
2014-11-27 23:25:36 +08:00
|
|
|
|
//var needUpdate = _storage == null || _storage.Version < lastestVersion;
|
2014-11-21 20:32:36 +08:00
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 最新版本:{0}", lastestVersion);
|
|
|
|
|
|
2014-11-27 23:25:36 +08:00
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 正在刷新缓存");
|
|
|
|
|
RefreshTrainInfo(lastestVersion);
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 缓存数据已刷新");
|
|
|
|
|
|
|
|
|
|
//_ininitalized = true;
|
2014-11-21 20:32:36 +08:00
|
|
|
|
_checkStationTimer = new Timer(_ => CheckTrainVersion(), null, new TimeSpan(0, 30, 0), Timeout.InfiniteTimeSpan);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RefreshTrainInfo(int version)
|
|
|
|
|
{
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 正在刷新车次信息");
|
|
|
|
|
var loader = new WebDataProvider();
|
2015-06-05 18:35:25 +08:00
|
|
|
|
var save = new Action(() =>
|
|
|
|
|
{
|
|
|
|
|
File.WriteAllText(_dataFilePath, JsonConvert.SerializeObject(IndexStorage));
|
|
|
|
|
File.WriteAllText(_masterDataStoreFilePath, JsonConvert.SerializeObject(DataStore));
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 车站信息缓存完成。目标文件 {0}", _dataFilePath);
|
|
|
|
|
});
|
2014-11-21 20:32:36 +08:00
|
|
|
|
try
|
|
|
|
|
{
|
2014-12-01 02:17:13 +08:00
|
|
|
|
IndexStorage.Version = version;
|
2015-06-05 18:35:25 +08:00
|
|
|
|
loader.LoadTrainInfo(IndexStorage, save);
|
2014-12-01 02:17:13 +08:00
|
|
|
|
IndexStorage.RemoveOutdateStorage();
|
2014-11-21 20:32:36 +08:00
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
Trace.TraceError("TAININFOMANGER] 车次信息更新出错:{0}", ex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Storage = new TrainInfoStorage();
|
|
|
|
|
Trace.TraceInformation("[TAININFOMANGER] 车次信息分析完成,车站。正在缓存车站信息");
|
|
|
|
|
|
|
|
|
|
//save
|
2015-06-05 18:35:25 +08:00
|
|
|
|
save();
|
2014-11-21 20:32:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CheckTrainVersion()
|
|
|
|
|
{
|
|
|
|
|
var lastestVersion = GetLatestVersionFromWeb();
|
2014-11-27 23:25:36 +08:00
|
|
|
|
try
|
2014-11-21 20:32:36 +08:00
|
|
|
|
{
|
|
|
|
|
RefreshTrainInfo(lastestVersion);
|
|
|
|
|
}
|
2014-11-27 23:25:36 +08:00
|
|
|
|
catch (Exception)
|
|
|
|
|
{
|
|
|
|
|
}
|
2014-11-21 20:32:36 +08:00
|
|
|
|
_checkStationTimer.Change(new TimeSpan(0, 30, 0), Timeout.InfiniteTimeSpan);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 从网络加载最新的版本号
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public int GetLatestVersionFromWeb()
|
|
|
|
|
{
|
2015-07-16 21:00:51 +08:00
|
|
|
|
var ctx = new HttpWebClient().Create<string>(HttpMethod.Get, "https://kyfw.12306.cn/otn/queryTrainInfo/init", "https://kyfw.12306.cn/otn/queryTrainInfo/init").Send();
|
2014-11-21 20:32:36 +08:00
|
|
|
|
if (!ctx.IsValid())
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
var version = (int)(Regex.Match(ctx.Result, @"train_list\.js\?scriptVersion=([\d\.]+)").GetGroupValue(1).ToSingle() * 100000);
|
|
|
|
|
|
|
|
|
|
return version;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|