6 Stimmen

Zeitüberschreitung bei Bloomberg API-Anfrage

Nachdem ich eine ReferenceDataRequest eingerichtet habe, sende ich sie an eine EventQueue weiter

Service refdata = _session.GetService("//blp/refdata");
Request request = refdata.CreateRequest("ReferenceDataRequest");
// append the appropriate symbol and field data to the request
EventQueue eventQueue = new EventQueue();
Guid guid = Guid.NewGuid();
CorrelationID id = new CorrelationID(guid);
_session.SendRequest(request, eventQueue, id);
long _eventWaitTimeout = 60000;
myEvent = eventQueue.NextEvent(_eventWaitTimeout);

Normalerweise kann ich die Nachricht aus der Warteschlange abrufen, aber ich stoße jetzt auf die Situation, dass ich, wenn ich eine Reihe von Anfragen im selben Durchlauf der App mache (normalerweise um den zehnten), eine TIMEOUT EreignisTyp

if (myEvent.Type == Event.EventType.TIMEOUT)
    throw new Exception("Timed Out - need to rethink this strategy");
else
    msg = myEvent.GetMessages().First();

Diese werden im selben Thread gemacht, aber ich nehme an, dass ich irgendwo etwas verbrauche und nicht freigebe.

Hat jemand irgendwelche Hinweise oder Ratschläge?

Auf SO gibt es nicht viele Verweise auf die BLP-API, aber wir hoffen, dass wir diese Situation langsam ändern können.

-1voto

G Sousa Punkte 1

Es klingt, als würden Sie zu viele Anträge auf einmal stellen. BB kann immer nur eine bestimmte Anzahl von Anfragen pro Verbindung verarbeiten. Beachten Sie, dass es nicht hilft, immer mehr Verbindungen zu öffnen, da es auch für jedes Abonnement Grenzen gibt. Wenn Sie eine große Anzahl zeitaufwändiger Anfragen gleichzeitig stellen, kann es sein, dass einige davon eine Zeitüberschreitung verursachen. Außerdem sollten Sie die Anfragen vollständig bearbeiten (bis Sie die RESPONSE-Nachricht erhalten) oder sie abbrechen. Eine ausstehende Teilanforderung vergeudet einen Slot. Da die Aufteilung in zwei Sitzungen Ihnen geholfen zu haben scheint, klingt es so, als würden Sie auch viele Abonnementanfragen gleichzeitig stellen. Verwenden Sie Abonnements als eine Möglichkeit, Schnappschüsse zu machen? Das heißt, Sie melden sich bei einem Instrument an, erhalten die Anfangswerte und melden sich wieder ab. Wenn ja, sollten Sie sich ein anderes Design überlegen. Dies ist nicht die Art und Weise, wie die Abonnements verwendet werden sollen. Eine ausstehende Abonnementanforderung verwendet auch einen Anforderungs-Slot. Deshalb ist es am besten, so viele Abonnements wie möglich in einer einzigen Abonnementliste zusammenzufassen, anstatt viele einzelne Anfragen zu stellen. Ich hoffe, dies hilft Ihnen bei der Nutzung der API.

-1voto

G Sousa Punkte 1

By the way, ich kann nicht sagen, von Ihrem Beispielcode, aber während Sie auf Nachrichten aus der Ereignis-Warteschlange blockiert werden, lesen Sie auch aus der wichtigsten Ereignis-Warteschlange, während (in einer separaten Ereignis-Warteschlange)? Sie müssen alle Nachrichten aus der Warteschlange verarbeiten, insbesondere wenn Sie ausstehende Abonnements haben. Die Antworten können sich sehr schnell stauen. Wenn Sie keine Nachrichten verarbeiten, stößt die Sitzung möglicherweise an die Grenzen der Warteschlange, was der Grund für die Timeouts sein kann, die Sie erhalten. Wenn Sie keine Nachrichten lesen, werden Sie möglicherweise als langsamer Verbraucher eingestuft und erhalten erst dann weitere Daten, wenn Sie mit der Verarbeitung der ausstehenden Nachrichten beginnen. Die Api ist asynchron. Ereignis-Warteschlangen sind nur eine Möglichkeit, bestimmte Anfragen zu blockieren, ohne dass alle Nachrichten aus der Haupt-Warteschlange in einem Kontext verarbeitet werden müssen, in dem das Blockieren in Ordnung ist, und es ansonsten schwierig wäre, den logischen Fluss zu unterbrechen, um Teile asynchron zu verarbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X