/// <summary> /// /// </summary> /// <param name="httpContext"></param> /// <param name="configuration"></param> /// <param name="loggerFactory"></param> /// <returns></returns> public async Task InvokeAsync(HttpContext httpContext, IConfiguration configuration, ILoggerFactory loggerFactory) { //_services.AddTransient<RabbitMQClient, RabbitMQClient>(); var work_queue_types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes().Where(t => t.BaseType != null && t.BaseType.Name == typeof(WorkQueuesBase <>).Name)) .ToArray(); RabbitMQClient client = new RabbitMQClient(configuration); foreach (var type in work_queue_types) { var logger = loggerFactory.CreateLogger(type); object obj = Activator.CreateInstance(type, client, logger); type.InvokeMember("Execute", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null); } var publish_subscribe_types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes().Where(t => t.BaseType != null && t.BaseType.Name == typeof(PublishSubscribeBase <>).Name)) .ToArray(); foreach (var type in publish_subscribe_types) { var logger = loggerFactory.CreateLogger(type); object obj = Activator.CreateInstance(type, client, logger); type.InvokeMember("Execute", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null); } await _next(httpContext); }
/// <summary> /// 订阅消息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="client"></param> /// <param name="exchange"></param> /// <param name="handler"></param> public static void Subscribe <T>(this RabbitMQClient client, string exchange, Action <T> handler) where T : class, new() { var channel = client.Connection.CreateModel(); channel.ExchangeDeclare(exchange: exchange, type: "fanout"); var queueName = channel.QueueDeclare().QueueName; channel.QueueBind(queue: queueName, exchange: exchange, routingKey: ""); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); var msg = Newtonsoft.Json.JsonConvert.DeserializeObject <T>(message); handler(msg); }; channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer); }
private static void Main(string[] args) { RabbitMQClient.RabbitMQClient client = new RabbitMQClient.RabbitMQClient(new RabbitMQConfig() { HostName = "192.168.8.102", Port = 5672, UserName = "******", Password = "******" }); for (int i = 0; i < 20; i++) { Message message = new Message() { a = i.ToString(), b = "a" + i }; Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(message)); client.WorkQueuesPublish <Message>(message, "queue_task"); } for (int i = 20; i < 40; i++) { Message message = new Message() { a = i.ToString(), b = "a" + i }; Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(message)); client.Publish <Message>(message, "logs"); } Console.ReadLine(); }
/// <summary> /// 工作者订阅 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="client"></param> /// <param name="queue"></param> /// <param name="handler"></param> public static void WorkQueuesSubscribe <T>(this RabbitMQClient client, string queue, Action <T> handler) where T : class, new() { var channel = client.Connection.CreateModel(); channel.QueueDeclare(queue: queue, durable: true, exclusive: false, autoDelete: false, arguments: null); channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); T msg = Newtonsoft.Json.JsonConvert.DeserializeObject <T>(message); handler(msg); channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); }; channel.BasicConsume(queue: queue, autoAck: false, consumer: consumer); }
/// <summary> /// 发布消息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="client"></param> /// <param name="msg"></param> /// <param name="exchange"></param> public static void Publish <T>(this RabbitMQClient client, T msg, string exchange) where T : class, new() { using (var channel = client.Connection.CreateModel()) { channel.ExchangeDeclare(exchange: exchange, type: "fanout"); var message = Newtonsoft.Json.JsonConvert.SerializeObject(msg); var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: exchange, routingKey: "", basicProperties: null, body: body); } }
private static void Main(string[] args) { RabbitMQClient.RabbitMQClient client = new RabbitMQClient.RabbitMQClient(new RabbitMQConfig() { HostName = "192.168.8.102", Port = 5672, UserName = "******", Password = "******" }); client.WorkQueuesSubscribe <Message>("queue_task", m => { Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(m)); Thread.Sleep(1500); }); Console.ReadLine(); }
/// <summary> /// 发布消息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="client"></param> /// <param name="msg"></param> /// <param name="queue"></param> public static void WorkQueuesPublish <T>(this RabbitMQClient client, T msg, string queue) where T : class, new() { using (var channel = client.Connection.CreateModel()) { channel.QueueDeclare(queue: queue, durable: true, exclusive: false, autoDelete: false, arguments: null); var message = Newtonsoft.Json.JsonConvert.SerializeObject(msg); var body = Encoding.UTF8.GetBytes(message); var properties = channel.CreateBasicProperties(); properties.Persistent = true; channel.BasicPublish(exchange: "", routingKey: queue, basicProperties: properties, body: body); } }
public QueueTest(RabbitMQClient.RabbitMQClient client, ILogger logger) : base(client, logger, "queue_task") { }
/// <summary> /// 发布订阅模式基类 /// </summary> /// <param name="client"></param> /// <param name="exchange"></param> /// <param name="logger"></param> public PublishSubscribeBase(RabbitMQClient client, ILogger logger, string exchange) { _exchange = exchange; this.client = client; this.logger = logger; }
/// <summary> /// 消息队列基类 /// </summary> /// <param name="client"></param> /// <param name="queue"></param> /// <param name="logger"></param> public WorkQueuesBase(RabbitMQClient client, ILogger logger, string queue) { _queue = queue; this.client = client; this.logger = logger; }