Redis发布/订阅版
我目前正在使用Redis 2.6.12版和2.4.5版进行一些性能分析。我编写了一个发布/订阅应用程序,其中有一个窗口服务作为订户。和另一个windows窗体作为发布者 我注意到,在从发布者发送了大约50+条连续消息之后。订户停止响应新消息。发布服务器端没有引发异常 两个版本的Redis都出现了相同的行为 有没有人经历过这种奇怪的行为 这是我的windows窗体(publisher)中的代码: 这是我的订户的代码:Redis发布/订阅版,redis,publish-subscribe,Redis,Publish Subscribe,我目前正在使用Redis 2.6.12版和2.4.5版进行一些性能分析。我编写了一个发布/订阅应用程序,其中有一个窗口服务作为订户。和另一个windows窗体作为发布者 我注意到,在从发布者发送了大约50+条连续消息之后。订户停止响应新消息。发布服务器端没有引发异常 两个版本的Redis都出现了相同的行为 有没有人经历过这种奇怪的行为 这是我的windows窗体(publisher)中的代码: 这是我的订户的代码: using (_redisConsumer = new RedisClient(
using (_redisConsumer = new RedisClient("localhost"))
using (_subscription = _redisConsumer.CreateSubscription())
{
try
{
_subscription.OnSubscribe = channel => _logger.Info(string.Format("Subscribed to '{0}'", channel));
_subscription.OnUnSubscribe = channel => _logger.Info(string.Format("UnSubscribed from '{0}'", channel));
_subscription.OnMessage = (channel, msg) =>
{
_logger.Info(string.Format("Received '{0}' from channel '{1}'", msg, channel));
var ltpm = JsonSerializer.DeserializeFromString<LastTrainProcessedMessage>(msg);
//persist to redis and trigger SignalR call...
_smState.UpdateLastTrainProcessedState(ltpm.ReadingTimestamp, ltpm.Location, SystemMonitorStatus.Normal);
_smState.AddAlerts(ltpm.NumberOfAlerts);
};
_logger.Info(string.Format("Started Listening On '{0}'", _channelName));
_subscription.SubscribeToChannels(_channelName); //blocking
}
catch (Exception ex)
{
_logger.Error(ex);
}
}
使用(\u redisConsumer=new RedisClient(“localhost”))
使用(\u subscription=\u redisConsumer.CreateSubscription())
{
尝试
{
_subscription.onsubscripte=channel=>_logger.Info(string.Format(“订阅了{0}',channel));
_subscription.onunsubscripte=channel=>_logger.Info(string.Format(“从{0}'取消订阅,channel));
_subscription.OnMessage=(频道,消息)=>
{
_Info(string.Format(“从通道“{1}”接收的“{0}”,msg,channel));
var ltpm=JsonSerializer.DeserializeFromString(msg);
//持续到redis并触发信号器调用。。。
_smState.UpdateLastTrainProcessedState(ltpm.ReadingTimestamp、ltpm.Location、SystemMonitorStatus.Normal);
_smState.AddAlerts(ltpm.NumberOfAlerts);
};
_Info(string.Format(“开始侦听{0}'”,_channelName));
_subscription.SubscribeToChannels(_channelName);//阻塞
}
捕获(例外情况除外)
{
_记录器错误(ex);
}
}
谢谢。您是否尝试使用:redis cli psubscribe“*”打开终端,以查看即使在订户挂起时,您的邮件是否仍会发送 问题显然来自
onMessage
侦听器内部,请删除以下行:
_subscription.UnSubscribeFromChannels(_channelName);
_subscription.SubscribeToChannels(_channelName);
它应该可以工作。您好,我已经尝试运行该命令,但仍然可以看到从windows窗体发送的消息。我还添加了pubsub的代码。有机会的时候请看一看。谢谢你的时间。更新了我的答案。我想我发现了问题。我这么做了,但我还是遇到了同样的问题。谢谢你的建议。好吧,这可能是windows端口的问题,你在Redis的官方版本上试过同样的代码了吗?我说的是关于官方版本,我很确定你的代码会在那里工作(只需在虚拟机中运行,并与主机共享6379端口)
_subscription.UnSubscribeFromChannels(_channelName);
_subscription.SubscribeToChannels(_channelName);