Bloomberg API请求超时

Uns*_*ced 5 c# bloomberg blpapi eventqueue

设置了ReferenceDataRequest后,我将它发送到EventQueue

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);
Run Code Online (Sandbox Code Playgroud)

通常情况下我可以从队列中获取消息,但我现在遇到的情况是,如果我在应用程序的同一次运行中(通常在第十个左右)发出大量请求,我会看到一个TIMEOUTEventType

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

这些是在同一个线程上进行的,但是我假设我正在消耗并且不释放的某个地方有某些东西.

有人有任何线索或建议吗?

关于SO对BLP的API的引用并不多,但希望我们可以开始纠正这种情况.

Erw*_*yer 5

由于您在初始帖子中包含的代码,我只是想分享一些东西。

如果您长时间请求历史盘中数据(这会导致 Bloomberg API 生成许多事件),请不要使用 API 文档中指定的模式,因为它最终可能会使您的应用程序检索所有事件的速度非常慢. 基本上,不要在 Session 对象上调用 NextEvent()!请改用专用的 EventQueue。

而不是这样做:

var cID = new CorrelationID(1);
session.SendRequest(request, cID);
do {
   Event eventObj = session.NextEvent();
   ...
}
Run Code Online (Sandbox Code Playgroud)

做这个:

var cID = new CorrelationID(1);
var eventQueue = new EventQueue();
session.SendRequest(request, eventQueue, cID);
do {
   Event eventObj = eventQueue.NextEvent();
   ...
}
Run Code Online (Sandbox Code Playgroud)

这可能会导致一些性能改进,尽管已知 API 不是特别确定......


Uns*_*ced 4

我并没有真正抽出时间来解决这个问题,但我们确实找到了解决方法。

根据服务器 API 文档中的一条看似一次性的小评论,我们选择创建第二个会话。一个会话负责静态请求,另一个会话负责实时请求。例如

_marketDataSession.OpenService("//blp/mktdata"); 
_staticSession.OpenService("//blp/refdata");
Run Code Online (Sandbox Code Playgroud)

这意味着一个会话以订阅模式运行,另一个会话则更加同步 - 我认为正是这种二元性才是我们问题的根源。

自从进行更改以来,我们没有遇到任何问题。