using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading;
using TRS.Export.BLL;
using TRS.Export.Business;
using TRS.Export.Common;
using TRS.Export.Constant;
using TRS.Export.Entity;
using TRS.Export.FrameEntity.Enums;
using TRS.Export.FrameProvider;
using TRS.Export.Param.Bases;
using TRS.Export.Param.Enums;
using TRS.Export.Scheduler.Interfaces;

namespace TRS.Export.Scheduler.Schedulers.Business
{
public class BusinessTaobaoEventScheduler : IScheduler
{
private readonly TBD_EventLogBLL m_objEventLogBLL = new TBD_EventLogBLL();

private readonly TaobaoEventBusiness m_objEventBusiness = new TaobaoEventBusiness();

private readonly BackupTableBusiness m_objBackupBusiness = new BackupTableBusiness();

private readonly string m_HttpResolve = ConfigurationManager.AppSettings["HttpResolve"];

private readonly string m_PCSReceiveCodes = ConfigurationManager.AppSettings["PCSReceiveCodes"];

private const int top = 1000;

private OrderByEnum orderByEnum = OrderByEnum.Asc;

delegate void AsyncExecute(object obj);

public int SleepInterval { get; set; }

public string[] Args { get; set; }

public BusinessTaobaoEventScheduler()
{
SleepInterval = 500;
}
//Business.BusinessTaobaoEventScheduler|LOGISTICS_DISPATCHED#后缀$0,1,2,3,4/5,6,7,8,9
public void Execute()
{
if (Args == null || Args.Length == 0)
{
return;
}
//Args=LOGISTICS_DISPATCHED#后缀$0,1,2,3,4/5,6,7,8,9
//eventType=LOGISTICS_DISPATCHED#后缀$0,1,2,3,4/5,6,7,8,9
string[] eventType = Args[0].Split('|');
if (eventType == null || eventType.Length == 0)
{
return;
}

if (eventType.Length == 1)
{
if (eventType[0].IndexOf("#") < 0)//以EventType分线程
{
ExecuteByEventType(eventType[0]);
}
else if (eventType[0].IndexOf("后缀") > -1)//以EventType+LogID最后一位分线程
{ //array=0,1,2,3,4/5,6,7,8,9
string[] array = eventType[0].Substring(eventType[0].IndexOf("后缀") + 3).Split('/');
for (int i = 0; i < array.Length; i++)
{
if (StaticConstant.ASYNC)
{
AsyncExecute async = new AsyncExecute(ExecuteBySuffix);

async.BeginInvoke(new string[] { eventType[0].Split('#')[0], array[i] }, AsyncCallback, async);
}
else
{
Thread thread = new Thread(new ParameterizedThreadStart(ExecuteBySuffix));
thread.Name = string.Format("报文解析后台Job-{0}", array[i]);
thread.Start(new string[] { eventType[0].Split('#')[0], array[i] });
}
}
}
else if (eventType[0].IndexOf("的地") > -1)//以EventType+DestinationName分线程
{
string[] array = eventType[0].Substring(eventType[0].IndexOf("的地") + 3).Split('/');
for (int i = 0; i < array.Length; i++)
{
if (StaticConstant.ASYNC)
{
AsyncExecute async = new AsyncExecute(ExecuteByDestinationName);

async.BeginInvoke(new string[] { eventType[0].Split('#')[0], array[i] }, AsyncCallback, async);
}
else
{
Thread thread = new Thread(new ParameterizedThreadStart(ExecuteByDestinationName));
thread.Name = string.Format("报文解析后台Job-{0}", eventType[0].Split('#')[0] + "-" + array[i]);
thread.Start(new string[] { eventType[0].Split('#')[0], array[i] });
}
}
}
}
else
{
for (int i = 0; i < eventType.Length; i++)//以EventType分线程
{
if (StaticConstant.ASYNC)
{
AsyncExecute async = new AsyncExecute(ExecuteByEventType);

async.BeginInvoke(eventType[i], AsyncCallback, async);
}
else
{
Thread thread = new Thread(new ParameterizedThreadStart(ExecuteByEventType));
thread.Name = string.Format("报文解析后台Job-{0}", eventType[i]);
thread.Start(eventType[i]);
}
}
}

Console.ReadKey();
}

public void AsyncCallback(IAsyncResult result)
{
AsyncExecute async = (AsyncExecute)result.AsyncState;

async.EndInvoke(result);
}

public void ExecuteByEventType(object obj)
{
while (true)
{
try
{
string threadName = string.Format("报文解析后台Job-{0}", obj);

new ThreadMonitorBusiness().CallbackThread(threadName);

WhereHelper<TBD_EventLog> where = new WhereHelper<TBD_EventLog>();
where.ApeendAnd(a => a.SuccessFlag == 0 && a.ActionTimes < 5);
where.ApeendAnd(a => a.EventType == obj.ToString());

OrderByHelper<TBD_EventLog> orderBy = new OrderByHelper<TBD_EventLog>(a => a.ActionTime, orderByEnum);

List<TBD_EventLog> lstEventLog = m_objEventLogBLL.Select(where, top, null, orderBy);
if (lstEventLog == null || lstEventLog.Count == 0)
{
Console.WriteLine("当前线程:[{0}],没有数据,等待{1}秒后继续...{2}", threadName, 60, DateTime.Now);
Thread.Sleep(60 * 1000);

continue;
}

foreach (var item in lstEventLog)
{
Execute(item);

Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, 10 / 1000.00, DateTime.Now);
Thread.Sleep(10);
}

Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, SleepInterval / 1000, DateTime.Now);

Thread.Sleep(SleepInterval);
}
catch (Exception ex)
{
new EmailBusiness().SendExceptionEmail(ex);
}
}
}

public void ExecuteByDestinationName(object obj)
{
while (true)
{
try
{
string[] array = obj as string[];
if (array == null || array.Length < 2)
{
break;
}

string threadName = string.Format("报文解析后台Job-{0}-{1}", array[0], array[1]);

new ThreadMonitorBusiness().CallbackThread(threadName);

WhereHelper<TBD_EventLog> where = new WhereHelper<TBD_EventLog>();
where.ApeendAnd(a => a.SuccessFlag == 0 && a.ActionTimes < 5);
if (array.Length > 0)
{
where.ApeendAnd(a => a.EventType == array[0]);
}
if (array.Length > 1)
{
where.ApeendAnd(a => a.DestinationName.In(array[1].Split(',')));
}

OrderByHelper<TBD_EventLog> orderBy = new OrderByHelper<TBD_EventLog>(a => a.ActionTime, orderByEnum);

List<TBD_EventLog> lstEventLog = m_objEventLogBLL.Select(where, top, null, orderBy);
if (lstEventLog == null || lstEventLog.Count == 0)
{
Console.WriteLine("当前线程:[{0}],没有数据,等待{1}秒后继续...{2}", threadName, 60, DateTime.Now);
Thread.Sleep(60 * 1000);

continue;
}

foreach (var item in lstEventLog)
{
Execute(item);

Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, 10 / 1000.00, DateTime.Now);
Thread.Sleep(10);
}

Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, SleepInterval / 1000, DateTime.Now);

}
catch (Exception ex)
{
new EmailBusiness().SendExceptionEmail(ex);
}
}
}

public void ExecuteBySuffix(object obj)
{
while (true)
{
try
{
string[] array = obj as string[];
if (array == null || array.Length < 2)
{
break;
}

string threadName = string.Format("报文解析后台Job-{0}-{1}", array[0], array[1]);

new ThreadMonitorBusiness().CallbackThread(threadName);

WhereHelper<TBD_EventLog> where = new WhereHelper<TBD_EventLog>();
where.ApeendAnd(a => a.ActionTime < DateTime.Now);
where.ApeendAnd(a => a.SuccessFlag == 0 && a.ActionTimes < 5);
if (array.Length > 0)
{
where.ApeendAnd(a => a.EventType == array[0]);
}
if (array.Length > 1)
{

//防止并发处理的小措施
where.ApeendAnd(a => a.LogID.Right(array[1].Split(',')));
}

OrderByHelper<TBD_EventLog> orderBy = new OrderByHelper<TBD_EventLog>(a => a.ActionTime, orderByEnum);

List<TBD_EventLog> lstEventLog = m_objEventLogBLL.Select(where, top, null, orderBy);
if (lstEventLog == null || lstEventLog.Count == 0)
{
Console.WriteLine("当前线程:[{0}],没有数据,等待{1}秒后继续...{2}", threadName, 60, DateTime.Now);
Thread.Sleep(60 * 1000);

continue;
}

foreach (var item in lstEventLog)
{
Execute(item);

Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, 10 / 1000.00, DateTime.Now);
Thread.Sleep(10);
}

Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, SleepInterval / 1000, DateTime.Now);

}
catch (Exception ex)
{
new EmailBusiness().SendExceptionEmail(ex);
}
}
}

public void Execute(TBD_EventLog eventLog)
{
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();

bool pcs = false;
if (!m_PCSReceiveCodes.IsNullOrEmpty())
{
string[] codes = m_PCSReceiveCodes.Split('|');
foreach (var code in codes)
{
if (eventLog.EventContent.IndexOf(code) > -1)
{
//pcs = true;
}
}
}

if (pcs)
{
string eventContent = eventLog.EventContent;
string destinationName = StringHelper.GetValueByCutStr(ref eventContent, "<consoWarehouseCode>", "</consoWarehouseCode>", false, false);

ExecuteSuccess(eventLog.LogID.Value, 1, destinationName);

Console.WriteLine("当前订单为PCS:[{0}],等待{1}秒后继续...{2}", eventLog.TradeOrderId, 000 / 1000.00, DateTime.Now);

return;
}
else
{

}

ResponseParam response = null;

if (!m_HttpResolve.IsNullOrEmpty())
{
string result = new HttpHelper().Execute(m_HttpResolve, "{\"logId\":" + eventLog.LogID + ",\"appKey\":\"trTaoBaoV02\"}");
if (!result.IsNullOrEmpty())
{
response = JsonConvert.DeserializeObject<ResponseParam>(result);
}
}
else
{
response = m_objEventBusiness.TABAO_EVENT(eventLog);
}

watch.Stop();

if (response == null || !response.success)
{
if (response.result == "2" && eventLog.ActionTimes.Value > 3)
{
ExecuteSuccess(eventLog.LogID.Value);
}
else
{
ExecuteFailure(eventLog.LogID.Value, eventLog.ActionTimes.Value, response.msg);
}

Console.WriteLine("交易订单:{0}分析失败!耗时:{1} {2} {3}", eventLog.TradeOrderId, watch.ElapsedMilliseconds / 1000.00, response == null ? "" : response.msg, DateTime.Now);
}
else
{
ExecuteSuccess(eventLog.LogID.Value);

Console.WriteLine("交易订单:{0}分析成功!耗时:{1} {2} {3}", eventLog.TradeOrderId, watch.ElapsedMilliseconds / 1000.00, response == null ? "" : response.msg, DateTime.Now);
}
}

public void ExecuteFailure(long logID, int actionTimes, string exception)
{
TBD_EventLog update = new TBD_EventLog();
update.LogID = logID;
update.ActionTimes = actionTimes + 1;
update.Exception = exception;
update.ActionTime = DateTime.Now;
if (actionTimes >= 4)
{
update.SuccessFlag = -1;
}

m_objEventLogBLL.Update(update);
}

public void ExecuteSuccess(long logID, int it = 0, string destinationName = null)
{
TBD_EventLog update = new TBD_EventLog();
update.LogID = logID;
update.SuccessFlag = 1;
update.ActionTime = DateTime.Now;
update.IT = it;
if (!destinationName.IsNullOrEmpty())
{
update.DestinationName = destinationName;
}

m_objEventLogBLL.Update(update);

ResponseParam response = m_objBackupBusiness.BackupTable(update);
if (response.success == false)
{
update = new TBD_EventLog();
update.LogID = logID;
update.UpdateTime = DateTime.Now;
update.Exception = response.msg ?? "";

m_objEventLogBLL.Update(update);
}
}
}
}

TWX 比较好的多线程使用实例的更多相关文章

  1. (转) C#多线程赛跑实例

    专于:http://blog.csdn.net/lidatgb/article/details/8363035 结合上篇<多线程的基础>,这次我们写一个多线程的赛跑实例,内容很简单:超人和 ...

  2. vc 基于对话框多线程编程实例——线程之间的通信

     vc基于对话框多线程编程实例——线程之间的通信 实例:

  3. C#多线程编程实例 螺纹与窗口交互

    C#多线程编程实例 螺纹与窗口交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = new Thread ...

  4. c# 多线程 创建对象实例

    本次的标题是我在写单例模式的博客时遇到的问题,所以今天专门写了的demo让自己记住怎么简单的使用多线程. 一直纠结的是怎么在for循环中多次实例化对象,好复现单例模式在没有加锁的情况下出现多个实例对象 ...

  5. linux下C语言多线程编程实例

    用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...

  6. Java单线程多实例和多线程多实例

    最近写了一个程序,是采用多线程往redis里面写入数据,想统计一下一共写了多少条数据,于是用了一个static的全局变量count来累加,这块代码抽象出来就是这样的: public class Mul ...

  7. C#多线程编程实例 线程与窗体交互

    C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...

  8. java多线程编程实例

    [转]这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下. 1.三个售票窗口同时出售20张票程序分析:   ...

  9. Java 多线程 简单实例 (Runnable)

    1.多线程实例 package second; public class A implements Runnable { public char stat = '*'; public void run ...

随机推荐

  1. java的double类型如何精确到一位小数?

    java的double类型如何精确到一位小数? //分钟转小时vacationNum = (double)Math.round(vacationNum/60*10)/10.0;overTimeNum ...

  2. 在VerilogHDL中调用VHDL的模块

    最近忽然要用到在VerilogHDL中调用VHDL的模块,从网上找了例程,把自己会忘掉的东西记在这里,. 2选1多路复用器的VHDL描述:entity mux2_1 is port( dina : i ...

  3. [hihoCoder] Trie树

    This is a application of the Trie data structure, with minor extension. The critical part in this pr ...

  4. Android Log工具之Luffy

    Luffy Luffy可以在手机端实时显示你App中的logcat输出.并且具有Log等级与Tag过滤功能.另外Luffy还支持收集Log,保存Log和查看本地log功能. 使用方法 1.Gradle ...

  5. Extjs combobox 实现搜索框的效果

    目的:使用combobox实现一个类似搜索框的效果,即用户输入内容后,出现相关下列列表,提供选择. 实现:extjs3 中combobox自身带这个功能即在remote模式下,store在load的时 ...

  6. ES6通过WeakMap解决内存泄漏问题

    一.Map 1.定义 Map对象保存键值对,类似于数据结构字典:与传统上的对象只能用字符串当键不同,Map对象可以使用任意值当键. 2.语法 new Map([iterable]) 属性 size:返 ...

  7. js中window.open的参数及注意

    IE9下使用window.open时需要注意name参数值不能有"-"出现,否则会出现脚本错误,IE9以及版本测试没有问题   window.open(URL,name,specs ...

  8. java 遍历map的方法

    package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Itera ...

  9. shell中的for、while、until(二)

    1.C语言格式的for命令: for((var; condition;iteration process)) 注意: 1.给变量赋值可以有空格 2.条件中的变量不以美元符开头: 3.迭代过程的算式未用 ...

  10. Java 实现文件随机读写-RandomAccessFile

    现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”.可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实 ...