Показаны сообщения с ярлыком EventHub. Показать все сообщения
Показаны сообщения с ярлыком EventHub. Показать все сообщения

суббота, 12 мая 2018 г.

ProcessTask Setup in SubSystem

QuikTradeTerminal:

private void SetupProcessTask()
        {
            ProcessTask = new ProcessTask<IEventArgs1>();
            ProcessTask.Init();
            ProcessTask.TimeInterval = 1000;
            ProcessTask.Parent = this;
            ProcessTask.IsEveryItemPushProcessing = true;

// Item Processing
            ProcessTask.ItemProcessingAction = args =>
            {
                try
                {
                    args.Action(args);
                }
                catch (Exception e)
                {
                    SendException(e);
                }
            };
        }

private void SendReplyEventArgs(TransactionReplyItem tr)
        {
            var eargs = new EventArgs1
            {
                Process = "QuikTransactionsProcess",
                Category = "QuikTransactions",
                Entity = "TransactionReplyItem",
                Operation = "AddOrUpdate",
                Object = tr,
                Action = TransactionReplyResolve
            };
            ProcessTask?.EnQueue(eargs);
        }

public void TransactionReplyResolve(IEventArgs1 args)
        {
            var trReply = (TransactionReplyItem)args.Object;
            var dwTransId = trReply.TransId;
            var replyMessage = trReply.ReplyMessage;
            var nResult = trReply.Result;
            var nExtendedErrorCode = trReply.ExtendedErrorCode;
            var nReplyCode = trReply.ReplyCode;
            var dOrderNum = trReply.OrderNum;

            TransactionReplyEvent?.Invoke((int)nResult, (uint)dwTransId, dOrderNum);
...
    

Tickers:

public bool IsProcessTaskInUse { get; set; }

[XmlIgnore]
public GS.ProcessTasks.ProcessTask<string> ProcessTask { get; private set; }

        private void SetupProcessTask()
        {
            ProcessTask = new ProcessTask<string>();
            ProcessTask.Init();
            ProcessTask.TimeInterval = 1000;
            ProcessTask.Parent = this;
            ProcessTask.IsEveryItemPushProcessing = true;

// ItemS Processing
         ProcessTask.ItemsProcessingAction = QuoteStringsProcessing;
        }

        public void Start()
        {
            if(IsProcessTaskInUse)
                ProcessTask?.Start();
        }
        public void Stop()
        {
            if (IsProcessTaskInUse)
                ProcessTask?.Stop();
        }

public void QuoteStringsProcessing(IEnumerable<string> quotestrings)
        {
            try
            {
                foreach (var s in quotestrings)
...

EventLogs:

// Setup in .xml file
        public bool IsProcessTaskInUse { get; set; }
        private void SetupProcessTask()
        {
            ProcessTask = new ProcessTask<IEventLogItem>();
            ProcessTask.Init(this);
            ProcessTask.Parent = this;
            ProcessTask.TimeInterval = 1000;
            ProcessTask.IsEveryItemPushProcessing = false;
            ProcessTask.ItemProcessingAction = evli =>
            {
                try
                {
                    AddItem(evli);
                }
                catch (Exception e)
                {
                    SendException(e);
                    //Evlm2(EvlResult.FATAL, EvlSubject.PROGRAMMING,
                    //    GetType().Name, "ProcessTask", "Exception", e.Message);
                }
            };
        }
        [XmlIgnore]
        public GS.ProcessTasks.ProcessTask<IEventLogItem> ProcessTask { get; private set; }
        public void Start()
        {
            if(IsProcessTaskInUse)
                ProcessTask?.Start();
        }
        public void Stop()
        {
            if (IsProcessTaskInUse)
                ProcessTask?.Stop();
        }

public void Push(IEventLogItem queueItem)
        {
            if (IsProcessTaskInUse)
                ProcessTask.EnQueue(queueItem);
            else
                EvlQueue.Push(queueItem);
        }

EventHub:

 public bool IsProcessTaskInUse { get; set; }
        private void SetupProcessTask()
        {
            ProcessTask = new ProcessTask<IEventArgs>();
            ProcessTask.Init();
            ProcessTask.TimeInterval = 1000;
            ProcessTask.Parent = this;
            ProcessTask.IsEveryItemPushProcessing = true;
            ProcessTask.ItemProcessingAction = FireEventOperation;
        }
        [XmlIgnore]
        public GS.ProcessTasks.ProcessTask<IEventArgs> ProcessTask { get; private set; }
        public void Start()
        {
            if(IsProcessTaskInUse)
                ProcessTask?.Start();
        }
        public void Stop()
        {
            if (IsProcessTaskInUse)
                ProcessTask?.Stop();
        }
...

 protected void FireEventOperation(Events.IEventArgs args)
        {
            try
            {
                var key = args.Key;
                var evhubitem = GetByKey(key);
                if (evhubitem != null)
                    evhubitem.FireEvent(args.Sender, args);
...

public void FireEvent(object sender, Events.IEventArgs eventArgs)
        {
            EventHandler?.Invoke(sender, eventArgs);
...

воскресенье, 11 мая 2014 г.

Update 140511_002

1. Замена Repostotory32 на Repostotory33
Ввел такую конструкцию для защиты от ошибок EntityFramework
            catch (System.ComponentModel.Win32Exception e)
            {
                SendException(ve, method, e);
                return false;
            }
            catch (System.Data.SqlClient.SqlException e)
            {
                SendException(ve, method, e);
                return false;
            }
            catch (System.Data.EntityException e)
            {
                SendException(ve, method, e);
                return false;
            }
            catch (Exception e)
            {
                SendException(ve, method, e);
                throw;
            }
2. В EventHub2 ввел возможность передать срочное сообщение IsHighPriority,
даже когда EventHub работает в режиме IsQueueEnabled
В Events.EventArgs ввел bool IsHighPriority.

3. Все Exceptions летят с IsHighPriority = true, то есть без очереди.

4. Убрал (Пока) регистрацию Exceptions  в БД.
TradeStorage.Add():

5. Добавил регистрацию Exceptions в файлы.
GSException.SaveInFile(string dir, Eargs ea);

6. Element1 - умеет вынимать из Exception InnerException и регистрировать их в IEnumerable<Eargs>. Этот массив Exception затем регистрируется в отдельный файл GSException.SaveInFile(string dir, Eargs ea);

вторник, 19 ноября 2013 г.

GS.Trade Updates 131119_003

Изменения в релизе 131119_003
1. Заменил контейнер с Containers3 на Containers5
2. Dictionary используется в EventHub, Transactions, List используется в Orders, Trades
3. Планирую в ордерах, сделках и транзакциях перейти на HashSets
4. В транзакциях Иногда в TransactionReply время между Sended - Completed = 0. - разбираюсь.
5. В механизм отправки транзакций вставил очередь на BlockingCollection. Эта Очередь позволяет отслеживать количество отправляемых транзакций в секунду. В Open такое ограничение = 20 ордеров в секунду. А также теперь в Квик можно отправлять Ордера из разных потоков одновременно - очередь все разруливает. 

среда, 13 ноября 2013 г.

EventHub - Updates

EventHub - Updates

1. Инициализация через Билдер из xml файла.

EventHub = Builder.Build<EventHub>(@"Init\EventHub.xml", "EventHub");

<?xml version="1.0" encoding="utf-8"?>
<EventHub xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Name</Name>
  <Code>Code</Code>
  <EventHubItems>
    <EventHubItem>
      <Entity>Transaction</Entity>
      <Category>Transactions</Category>
    </EventHubItem>
    <EventHubItem>
      <Entity>Order</Entity>
      <Category>Orders</Category>
    </EventHubItem>
    <EventHubItem>
      <Entity>Status</Entity>
      <Category>Order</Category>
    </EventHubItem>
    <EventHubItem>
      <Entity>Order</Entity>
      <Category>UI.Orders</Category>
    </EventHubItem>
  </EventHubItems>
</EventHub>