Проблемы с входящими данными из нескольких мест, где уникальный идентификатор может появиться после сообщения msg..problem - PullRequest
0 голосов
/ 26 мая 2020

Обдумывал и работал над этими последними 48 часами, но ничего не добился. Так что позвольте мне сразу перейти к вопросу.

Я работаю с API.

Я отправляю запрос API как таковой http://localhost: 8080 / Execute .. ..et c .. et c <--- веб-запрос </p>

Это, в свою очередь, возвращает «ID».

API также отправляет через порт UDP номер заказа для этого идентификатора

- Таким образом, API получает запрос и отвечает идентификатором.

Затем

-API отправляет номер заказа, который он связывает с этим идентификатором на UDP-порт ПОСЛЕ выдачи идентификатора

Однако для этого нет установленного времени, это как есть.

Теперь на другом конце этого сервера находится BackEnd Server.

Это постоянно отправляет [Msg Updates] через UDP.

Таким образом, последовательность может go что-то вроде этого.

У меня настроен приемник UDP для порта 1234. У меня есть UDP Список настроен для порта 2222 <- внутренний сервер отправляет сообщения </p>

Я выполняю через API http://localhost: 8080 / execute ... et c (строковый ответ от API сервер) <--- r eceive ID (проходит время в миллисекундах) (UDP-порт 1234) <--- Номер заказа </p>

[Порт 2222] <--- Получает [Msg update] с деталями заказа. </p>

Проблема в [Msg Update] может поступать и поступает быстрее, чем заказ №, связанный с [MsgUpdate].

В настоящее время мое решение выглядит следующим образом, но кажется очень неуклюжим и неуклюжим (вы знаете это чувство, когда ваш код / ​​дизайн заставляет чувствовать себя немного грязным) ну вот через что я сейчас прохожу. Вот мой нынешний способ решения проблемы.

Связи следующие.

1 Уникальный идентификатор ----> 1 Номер заказа.

Несколько состояний заказа ---> 1 OrderNumber (принято, отменено, .... et c)

Входящее сообщение с сервера имеет только OrderNumber и тег (ID), который вы получаете из API.

Итак, вот как я с этим справляюсь ... или пытаюсь.

И, пожалуйста, если вы, ребята, видите лучший способ сделать это, я полностью за это, я выброшу весь этот мусорный раствор в окно в одно мгновение.

Есть ли более чистый и элегантный способ sh этого?

Как видите, вы можете получать [Msg Updates] быстрее, чем получать OrderNumber, И каждое входящее [MsgUpdate] может иметь разные состояния для заказа ...

Например: # 1000 принято, # 1000 отменено, # 1001 принято, # 1001 отклонено [Недостаточно BP], # 1002 отменено, # 1010 частично выполнено

Но вывод состоит в том, что во входящих заказах нет ничего уникального, кроме номера заказа ( # 1001), и он связан только с идентификатором из API, который вы получаете после выполнения, затем нужно дождаться ответа UDP от API, чтобы получить номер заказа (# 1001), и только тогда вы узнаете, что это [1001] ВАШЕ сообщение. тьфу ......

В любом случае мой псевдокод, чтобы дать основную c предпосылку того, что я сделал, чтобы попытаться решить эту проблему.

[Client Class]

private IOrderNumberListener ordListener;
private IBackendListener _blistener;

public Client(IOrdernUmberListener ordListen, IBackendListener backListen)
{
    ordListener = ordListen;
    _blistener = backListen;

    ordListener += IncomingOrderNo;
    _blistener += ReceiveIncomingMsgsFromServer;
}

public string IncomingOrderNo(string exeord)
{
    //Deal with it

}


/// This method will recieve data for everything including things that isn't related to the ID 
private void ReceiveIncomingMsgsFromServer(object sen`enter code here`der, data)
{
    //Process Incoming data
    //So in here is a check for the OrderNumber which doesn't have the ID associated with it.  Just 
      the OrderNumber with details.

    if(data.ordernumber == this.Ordernumber)   <--- this I feel isn't all that great.  

    // QUERY the _blistener.GetOrderDetails(this.OrderNumber);

    //Deal with things here.
}


public string executeOrder(string url)
{
    webrequest..(url)...etc
}

[Back End Server Class]

//UDP Listener Configuration stuff here

......

public event EventHandler<Msg> Update;

private Dictionary<string, msgData> OrderDb = new Dictionary.....etc

private void sendUpdate(data)
{
    //raise event method etc..

}

private process packet(byte[] data)
{
    /// process data


    sendUpdate(processedData);
}

public msgData GetOrderDetails(string ordernumber)
{
    //Check db return orderdetails.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...