我们正在使用SignalR将消息从服务器推送到客户端。我们正在使用服务器广播的一些内容:
我们的一个开发人员开始使用StockTicker示例,我们将其扩展为推送所有不同的消息类型。这是我们的一般方案:
private void RunJobs()
{
_jobs = GetAllJobs();
while (true)
{
bool workDone = false;
for (int i = 0; i < _jobs.Count; i++)
{
var j = _jobs.ElementAt(i);
bool workToDo = j.MessageAvailable();
workDone = workDone || workToDo;
if (workToDo)
{
var message = j.GetMessage();
_threadPool.QueueWorkItem(ProcessJob, j, message);
}
}
if (!workDone)
{
Thread.Sleep(_sleepTime);
}
}
}
/// <summary>
/// Method called by threads to process queued up Work Item (ISignalRJob)
/// </summary>
/// <param name="job">Job to run.</param>
private void ProcessJob(ISignalRJob job, QueueMessage message)
{
try
{
job.ProcessMessage(message);
}
catch (Exception e)
{
//handle exception
}
}
当每个作业处理时,它执行如下操作:
protected override void ProcessMessage(QueueMessage message)
{
var nqm = JsonConvert.DeserializeObject<NotificationQueueMessage>(message.Body);
var notification = webService.GetNotification(notification.Id);
foreach(var userConnectionId in GetUserConnectionIds(nqm.UserId)){
_signalRConnectionContext.Clients.Client(userConnectionId).pushNotification(notification);
}
}
在一个线程中,监视一系列消息队列。如果消息出现,请从队列中弹出消息,然后启动一个新线程来处理消息(ProcessJob)。然后,作业将执行构建客户端消息所需的任何服务调用/ db调用,然后将消息推送到客户端。
该服务似乎有效,但客户端会定期停止接收消息,尽管我已经验证它们是从服务器发送的。是否有可能在多个线程中推送到客户端连接会使其处于错误状态?
我是否应该将QueueMessage处理的结果返回给主SignalR线程,并将它们全部同步返回?