• 淘海外分发Job 多线程demo


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

    namespace TRS.Export.Scheduler.Schedulers.Pushs
    {
    public class PushsTaobaoApiSourceScheduler : IScheduler
    {
    private readonly string PCS_API = ConfigurationManager.AppSettings["PCSReceiveAPI"];

    private readonly string TWX_API = ConfigurationManager.AppSettings["TaoBaoOrderAPI"];

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

    private readonly string TWX_REJECT_CODES = ConfigurationManager.AppSettings["TWXRejectCodes"];

    private readonly string PCS_RECEIVE_OPEN = ConfigurationManager.AppSettings["PCSReceiveOpen"];

    private readonly string TWX_RECEIVE_OPEN = ConfigurationManager.AppSettings["TWXReceiveOpen"];

    private readonly TaoBaoAPISourceBLL m_objSourceBLL = new TaoBaoAPISourceBLL();

    private readonly TaoBaoAPISource_SucessBLL m_objSourceSucessBLL = new TaoBaoAPISource_SucessBLL();

    private readonly string PATH = @"D:Beyond.TWX.JobApp.LogPushsTaobaoApiSource";
    string ExceptionTel = ConfigurationManager.AppSettings["ExceptionTelNumbers"];

    public int SleepInterval { get; set; }

    public string[] Args { get; set; }

    public PushsTaobaoApiSourceScheduler()
    {
    SleepInterval = 2000;
    }

    public void Execute()
    {

    if (Args == null || Args.Length == 0)
    {
    Console.WriteLine("参数不能为空!");
    return;
    }

    string threadName = string.Format("报文解析后台Job-{0}", "后缀");
    string[] arrays = Args[0].Split('/');

    while (true)
    {
    List<Task> tasks = new List<Task>();
    foreach (var value in arrays)
    {
    tasks.Add(Task.Factory.StartNew(() =>
    {
    ExecuteTask(value);
    }));
    }

    Task.WaitAll(tasks.ToArray());

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

    Thread.Sleep(SleepInterval);
    }
    }

    public void ExecuteTask(string suffix)
    {
    string threadName = string.Format("报文解析后台Job-{0}", suffix);

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

    var where = new WhereHelper<TaoBaoAPISource>(a => a.DoWith.In(0, 2, 3) && a.ActionTime < 4 && a.ID.Right(suffix.Split(',')));

    List<TaoBaoAPISource> list = m_objSourceBLL.Select(where, 100);
    foreach (var item in list)
    {
    ExecuteTask(item);
    }
    }

    public void ExecuteTask(TaoBaoAPISource source)
    {

    try
    {
    Task<ResponseParam> task_pcs = Task.Factory.StartNew<ResponseParam>(() => { return ExecuteTaskPcs(source); });

    Task<ResponseParam> task_twx = Task.Factory.StartNew<ResponseParam>(() => { return ExecuteTaskTwx(source); });

    Task.WaitAll(task_pcs, task_twx);

    if (!task_pcs.Result.success && task_pcs.Result.msg_code == "PCS" || !task_twx.Result.success && task_twx.Result.msg_code == "TWX")
    {
    if (task_pcs.Result.success)
    {
    source.DoWith = 2;
    }

    if (task_twx.Result.success)
    {
    source.DoWith = 3;
    }

    ExecuteDoWith(source);

    Console.WriteLine("编号:{0}分发失败,开始重新尝试!", source.ID);
    }
    else
    {
    ExecuteBackup(source);

    Console.WriteLine("编号:{0}分发成功,已经备份数据!", source.ID);
    }
    }
    catch (Exception ex)
    {
    if (ex != null)
    {
    //日志记录异常
    LogHelper.Info(ex.Message + " " + ex.Source + " " + ex.StackTrace, PATH);
    //发送短信
    SendMessageParam param = new SendMessageParam()
    {
    Destination = "中国",
    Mobile = String.IsNullOrEmpty(ExceptionTel) ? "13728938720" : ExceptionTel,
    Message = "分发job出现异常"
    };
    string req_content = JsonConvert.SerializeObject(param);
    ResponseParam response = new SendMessageAPI().Send(req_content);
    }

    }
    }

    #region 分发报文调用PCS接口
    public ResponseParam ExecuteTaskPcs(TaoBaoAPISource source)
    {
    Stopwatch watch = new Stopwatch();
    watch.Start();

    ResponseParam resonse = new ResponseParam();

    if (source.DoWith == 2)
    {
    resonse.success = true;
    resonse.msg_code = "PCS";
    resonse.msg = string.Format("编号:{0}分发PCS系统成功,不能重复分发!", source.ID);

    Console.WriteLine("{0}!耗时:{1} {2} {3}", resonse.msg, 0, "", DateTime.Now);

    return resonse;
    }

    string urlDecode = source.ApiContent.UrlDecode();
    string[] pcs_codes = PCS_RECEIVE_CODES.Split('|');
    foreach (var code in pcs_codes)
    {
    if (urlDecode.IndexOf(code) > -1)
    {
    resonse.success = true;

    break;
    }
    }

    if (!resonse.success)
    {
    resonse.msg_code = "TWX";
    resonse.msg = string.Format("编号:{0}不是PCS系统订单!", source.ID);
    }
    else
    {
    resonse.msg_code = "PCS";

    string result = new HttpHelper().Execute(PCS_API, source.ApiContent);
    if (!result.IsNullOrEmpty())
    {
    resonse.msg = string.Format("编号:{0}分发PCS系统成功", source.ID);
    resonse.success = result.IndexOf("true") > -1;
    }
    else
    {
    resonse.msg = string.Format("编号:{0}分发PCS系统失败", source.ID);
    resonse.success = false;
    }
    }

    watch.Stop();

    Console.WriteLine("{0}!耗时:{1} {2} {3}", resonse.msg, watch.ElapsedMilliseconds / 1000.00, "", DateTime.Now);

    return resonse;
    }
    #endregion

    #region 分发报文到TWX接口
    public ResponseParam ExecuteTaskTwx(TaoBaoAPISource source)
    {
    Stopwatch watch = new Stopwatch();
    watch.Start();

    ResponseParam resonse = new ResponseParam();

    if (source.DoWith == 3)
    {
    resonse.success = true;
    resonse.msg_code = "TWX";
    resonse.msg = string.Format("编号:{0}分发TWX系统成功,不能重复分发!", source.ID);

    Console.WriteLine("{0}!耗时:{1} {2} {3}", resonse.msg, 0, "", DateTime.Now);

    return resonse;
    }

    string urlDecode = source.ApiContent.UrlDecode();
    string[] twx_codes = TWX_REJECT_CODES.Split('|');
    foreach (var code in twx_codes)
    {
    if (urlDecode.IndexOf(code) > -1)
    {
    resonse.success = true;

    break;
    }
    }

    if (resonse.success)
    {
    resonse.success = false;
    resonse.msg_code = "PCS";
    resonse.msg = string.Format("编号:{0}不是TWX系统订单!", source.ID);
    }
    else
    {
    resonse.msg_code = "TWX";

    string result = new HttpHelper().Execute(TWX_API, source.ApiContent);
    if (!result.IsNullOrEmpty())
    {
    resonse.msg = string.Format("编号:{0}分发TWX系统成功", source.ID);
    resonse.success = result.IndexOf("true") > -1;
    }
    else
    {
    resonse.msg = string.Format("编号:{0}分发TWX系统失败", source.ID);
    resonse.success = false;
    }
    }

    watch.Stop();

    Console.WriteLine("{0}!耗时:{1} {2} {3}", resonse.msg, watch.ElapsedMilliseconds / 1000.00, "", DateTime.Now);

    return resonse;
    }
    #endregion

    public ResponseParam ExecuteBackup(TaoBaoAPISource source)
    {
    ResponseParam response = new ResponseParam();

    string content = source.ApiContent.UrlDecode();
    string tradeOrderId = StringHelper.GetValueByCutStr(ref content, "<tradeOrderId>", "</tradeOrderId>", false);
    if (string.IsNullOrEmpty(tradeOrderId))
    {
    tradeOrderId = StringHelper.GetValueByCutStr(ref content, "<logisticsOrderCode>", "</logisticsOrderCode>", false);
    }

    string columns = "ID,ApiContent,CreateTime,FinishTime,TradeOrderID";
    string values = "@ID,@ApiContent,@CreateTime,@FinishTime,@TradeOrderID";
    string strTableName = string.Format("TaoBaoAPISource_Sucess_Log{0}", DateTime.Today.ToString("yyMM"));
    string commandText = string.Format(SqlConstants.SQL_INSERT_FORMAT, strTableName, columns, values);
    string connectionString = ConfigurationManager.AppSettings["SqlServer0"];

    var param = new { ID = source.ID, ApiContent = source.ApiContent, CreateTime = source.CreateTime, FinishTime = DateTime.Now, TradeOrderID = (tradeOrderId ?? "").Trim() };

    int effect = DapperSqlHelper.Execute(commandText, param, connectionString);

    response.success = effect > 0;
    if (response.success)
    {
    m_objSourceBLL.Delete(source);
    }

    return response;
    }

    public void ExecuteDoWith(TaoBaoAPISource source)
    {
    TaoBaoAPISource update = new TaoBaoAPISource();
    update.ID = source.ID;
    update.DoWith = source.DoWith;

    if (source.DoWith != 0)
    {
    update.ActionTime = source.ActionTime + 1;
    }

    m_objSourceBLL.Update(update);
    }
    }
    }

  • 相关阅读:
    mybatis中的foreach条件参数过多时,#和$效率比较
    Error creating bean with name 'persistenceExceptionTranslationPostProcessor' defined in class path resource [org/springframework/boot/autoconfigure/dao/PersistenceExceptionTranslationAutoConfiguration
    ConfigurationProperties cannot be resolved to a type
    Java 注解 初探 (一)
    无题
    [转载]A cycle was detected in the build path of project
    20段代码
    在tomcat5中发布项目时,用IP地址+端口不能访问项目,而用localhost加端口时可以访问成功
    Cannot get connection for URL jdbc:oracle:thin:调用中无效参数
    mysql中表分类MyISAM和InnoDB的区别
  • 原文地址:https://www.cnblogs.com/chengjun/p/9166712.html
Copyright © 2020-2023  润新知