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. less-符号之逗号,空格,父级选择器

    Less符号 逗号 example: .test() { box-shadow+: inset 0 0 10px #555; } .study { .test(); box-shadow+: 0 0 ...

  2. Java基础语法 - 面向对象 - 类的主方法main方法

    主方法是类的入口点,它指定了程序从何处开始,提供对程序流向的控制.Java编译器通过主方法来执行程序. 主方法的语法如下: /* a.主方法是静态的,如果要直接在主方法中调用其它方法,则该方法必须也是 ...

  3. jq封装选项卡写法

    jq普通选项卡写法: var tabTag=$('#tabon'); var tabon=tabTag.find('li');//菜单栏 var tabCon=$(".hidden" ...

  4. 解决:IDEA unable to import maven project see logs for details问题+java http请求报java.net.SocketException: Permission denied:connect 问题

    背景:用IDEA写了一个java发送http请求的maven项目. 运行时,项目报java.net.SocketException: Permission denied:connect问题: 修改po ...

  5. 解决putty自动断开的问题

    解决putty自动断开的问题 putty窗口上右键>change settings.打开后如下,修改seconds of keepalives,让putty每隔若干秒发送心跳包

  6. 【我的Android进阶之旅】解决Android Studio启动时报错:Java 1.8 or later is required.

    错误描述 在公司电脑上运行Android Studio 2.2已经有一段时间了,但是自己的笔记本上还是用的Android Studio 1.5,今天晚上下了一个Android Studio 2.2压缩 ...

  7. Keras网络层之“关于Keras的层(Layer)”

    关于Keras的“层”(Layer) 所有的Keras层对象都有如下方法: layer.get_weights():返回层的权重(numpy array) layer.set_weights(weig ...

  8. Android之网络----使用HttpClient发送HTTP请求(通过get方法获取数据)

    [正文] 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层 ...

  9. c# 图片加密解密的实例代码

    c# 图片加密解密的实例代码. 代码: using System; using System.Collections.Generic; using System.Text; using System. ...

  10. 吴超老师课程---Hadoop的分布式集群安装

    1.hadoop的分布式安装过程 1.1 分布结构 主节点(1个,是hadoop0):NameNode.JobTracker.SecondaryNameNode            从节点(2个,是 ...