ayant mis en place un référencéré je l'envoie avec une eventeeue normalement, je peux saisir le message de la file d'attente, mais je frappe la situation maintenant que si je fais Un certain nombre de demandes dans la même course de l'application (normalement autour du dixième), je vois un Timeout Code> EventType P>
if (myEvent.Type == Event.EventType.TIMEOUT)
throw new Exception("Timed Out - need to rethink this strategy");
else
msg = myEvent.GetMessages().First();
7 Réponses :
agréable de voir une autre personne sur Stackoverflow profitant de la douleur de Bloomberg API: -)
J'ai honte de dire que j'utilise le modèle suivant (je soupçonne copié à partir du code exemple). Il semble travailler raisonnablement robustablement, mais ignore probablement certains messages importants. Mais je n'ai pas votre problème de délai. C'est Java, mais toutes les langues fonctionnent essentiellement la même chose. P> Ceci peut fonctionner car il consomme tous les messages de chaque événement. P> P>
Merci. C'est une construction très similaire (et aime comme le code exemple) - il n'y a pas de messages inconsumés que je peux voir dans les appels précédents via cette fonction. Si je l'appelle juste une fois, tout va bien, mais c'est à la barrière après plusieurs appels. Je pense que cela pourrait être lié à un abonnement simultané à certains domaines en temps réel, mais il est assez difficile de clouer ...
Partagez-vous la même file d'attente entre les données REF et les données de marché? Cela pourrait être un problème.
Je n'ai jamais vraiment compris de résoudre cette question, mais nous avons trouvé une solution de contournement.
Basé sur une petite, apparemment jetable, commenter dans la documentation de l'API de serveur, nous avons choisi de créer une deuxième session. Une session est responsable des demandes statiques, l'autre en temps réel. par exemple. P>
_marketDataSession.OpenService("//blp/mktdata"); _staticSession.OpenService("//blp/refdata");
Je pense que la question est que vous ouvrez maintenant explicitement le service avant d'obtenir la référence. Nous utilisons si (session.openservice (blPCONStants.blp_ref_data)) retour session.getservice (blPConstants.blp_ref_data); sinon retourne null; code> alors que votre question initiale n'a pas ouvert le service d'abord
Ma lecture de la DOCS convient que vous avez besoin de sessions séparées pour les services "// BLP / MKTDATA" et "// BLP / REFDATA". P>
On dirait que vous faites trop de demandes à la fois. BB ne traitera qu'un certain nombre de demandes par connexion à tout moment. Notez que l'ouverture de plus en plus de connexions ne vous aidera pas, car il existe également des limites par abonnement. Si vous effectuez un grand nombre de demandes de consommation de temps simultanément, certaines délais de délai d'attente. De plus, vous devez traiter complètement la demande (jusqu'à ce que vous receviez un message de réponse) ou les annuler. Une demande partielle qui est remarquable consiste à gaspiller une fente. Depuis la division en deux sessions, semble vous avoir aidé, on dirait que vous apportez également beaucoup de demandes d'abonnement en même temps. Utilisez-vous des abonnements comme un moyen de prendre des instantanés? Cela se trouve souscrire à un instrument, obtenez des valeurs initiales et de désabonnement. Si oui, vous devriez essayer de trouver un design différent. Ce n'est pas la façon dont les abonnements sont destinés à être utilisés. Une demande d'abonnement exceptionnelle utilise également une fente de demande. C'est pourquoi il est préférable de lotter autant d'abonnements que possible dans une seule liste d'abonnement au lieu de faire de nombreuses demandes individuelles. J'espère que cela vous aide à utiliser l'API. P>
D'ailleurs, je ne peux pas dire à votre code d'échantillon, mais lorsque vous êtes bloqué sur des messages de la file d'attente d'événement, lisez-vous également à partir de la file d'attente principale de l'événement (dans une file d'attente d'événement séparée)? Vous devez traiter tous les messages de la file d'attente, surtout si vous avez des abonnements exceptionnels. Les réponses peuvent faire la queue vraiment rapide. Si vous ne traiterez pas de messages, la session peut frapper certaines limites de la file d'attente, ce qui pourrait être la raison pour laquelle vous obtenez des délais d'attente. De plus, si vous ne lisez pas les messages, vous pouvez être marqué un consommateur lent et ne recevez pas plus de données avant de commencer à consommer les messages en attente. L'API est ASYNC. Les files d'attente d'événement ne sont qu'un moyen de bloquer sur des demandes spécifiques sans avoir à traiter tous les messages de la file d'attente principale dans un contexte où le blocage est correct et qu'il serait difficile d'interrompre le flux logique pour traiter des pièces de manière asynchrone. P>
Un client semblait avoir un problème similaire. Je l'ai résolu en faisant des centaines de sessions plutôt que de passer des centaines de demandes en une session. Bloomberg peut ne pas être heureux de cette approche BFI (force brute et ignorance), car nous envoyons les demandes de champs pour chaque session, mais cela fonctionne. P>
Je voulais juste partager quelque chose, grâce au code que vous avez inclus dans votre poste initial.
Si vous faites une demande de données intraday historiques pour une longue durée (qui entraîne de nombreux événements générés par Bloomberg API), Ne pas utiliser le motif spécifié dans la documentation de l'API, car cela pourrait finir par rendre votre application très lente pour récupérer tous les événements. Fondamentalement, n'appelez pas ensuite () sur un objet de session! Utilisez une éventue dédiée à la place. P>
au lieu de le faire: p> fais cela: p> var cID = new CorrelationID(1);
var eventQueue = new EventQueue();
session.SendRequest(request, eventQueue, cID);
do {
Event eventObj = eventQueue.NextEvent();
...
}