我有几个 ASP.Net 应用程序服务器,我想使用 rabbitMQ(或类似的排队工具,如 redis pub/sub)来使所有服务器上的内存缓存失效。
当应用程序服务器清除它自己的缓存时,场景很简单,将消息发送到消息队列(由 rabbitMQ 声明)并且所有其他服务器正在侦听该队列(在本例中为缓存队列)并且当它们接收到消息时(通过消费者.Received even handler)它们也使自己的内存缓存无效。
为此,我必须将侦听器放在我的 Web 应用程序中(不能放入控制台应用程序或 Windows 服务),因为每个 ASP.net Web 应用程序都有自己的内存缓存,只能从 Web 应用程序本身内部访问(不在外面)。
我在静态类中编写了一个监听方法,这是我的监听方法代码
public static void Listen()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
// cache invalidation goes here
};
channel.BasicConsume(queue: "hello",
autoAck: true,
consumer: consumer);
}
}
我像这样在 global.asax 中的方法中调用该Listen方法Application_Start
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
CacheNotifier.Listen();
}
但是,当我从其他服务器向队列发送消息时,Consumer.Received不会触发接收发送的消息。
而当我将完全相同的Listen方法放在控制台应用程序中并从 Main 方法调用它(侦听方法)时static void Main(string[] args),事件会在消息到达时正确触发,但正如我所说,我不能将侦听器放在单独的控制台应用程序或 Windows 服务中,它必须在我的网络应用程序本身中
首先,我想知道为什么我的监听器不能在 ASP.net Web 应用程序中工作,但可以在控制台应用程序中工作,RabbitMQ 的官方文档也只使用控制台应用程序
其次,我需要一个解决方案,考虑到我的听众必须在我的 asp.net web 应用程序中
任何帮助,将不胜感激