/// <summary> /// 單一程序取得Q訊息用 /// </summary> /// <param name="amqpAdapter"></param> /// <returns></returns> internal override string StartDequeue(AMQPAdapter amqpAdapter) { try { var connection = (IConnection)amqpAdapter.GetConnection(); using (var channel = connection.CreateModel()) { channel.QueueDeclare(queueName, true, false, false, null); channel.BasicQos(0, 1, false); //var consumer = new QueueingBasicConsumer(channel); //channel.BasicConsume(queueName, false, consumer); //var messageIsAvailable = consumer.Queue.Dequeue(1 * 1000, out args); var result = channel.BasicGet(queueName, false); if (result != null) { //returnMessage = Encoding.UTF8.GetString(args.Body); IBasicProperties props = result.BasicProperties; byte[] body = result.Body; returnMessage = Encoding.UTF8.GetString(body); channel.BasicAck(result.DeliveryTag, false); NLogService.Instance.Info($"{DateTime.Now} {channel.ChannelNumber} Info: 取得訊息。 QueueName= {queueName} Message: {returnMessage}"); } } return(returnMessage); } catch (TimeoutException e) { Console.WriteLine(e); stopConsuming = true; return(returnMessage); } catch (Exception e) { NLogService.Instance.Error($"{DateTime.Now}Error: TimeoutException={ e.Message} StackTrace: {e.StackTrace}"); Console.WriteLine(e); //OnMessageReceived(new MessageReceivedEventArgs //{ // Exception = e //}); stopConsuming = true; return(returnMessage); } }
/// <summary> /// 有輪圈功能的Consumer /// </summary> /// <param name="amqpAdapter"></param> internal override void Start(AMQPAdapter amqpAdapter) { try { var connection = (IConnection)amqpAdapter.GetConnection(); using (var channel = connection.CreateModel()) { channel.ModelShutdown += Channel_ModelShutdown; while (!stopConsuming) { if (channel.ConsumerCount(queueName) < 2 || channel.MessageCount(queueName) > 10) { //當Consumer少於2台,或是,Message大於10個 channel.QueueDeclare(queueName, true, false, false, queueArgs); channel.BasicQos(0, prefetchCount, false); var consumer = new EventingBasicConsumer(channel); consumer.Received += OnConsumer_ReceivedII; var test = channel.BasicConsume(queueName, noAck, consumer); NLogService.Instance.Info($"{DateTime.Now} Info: Consumer啟動。channel: {channel.ChannelNumber}。QueueName= {queueName}。Message: {returnMessage}"); } else { Thread.Sleep(3000); } } } } catch (TimeoutException e) { Console.WriteLine(e); stopConsuming = true; } catch (Exception exception) { OnMessageReceived(this, new MessageReceivedEventArgs { Exception = exception }); stopConsuming = true; } }
/// <summary> /// 背景Consumer處理服務之間的溝通 /// </summary> /// <param name="amqpAdapter"></param> internal override void StartAsync(AMQPAdapter amqpAdapter) { try { var connection = (IConnection)amqpAdapter.GetConnection(); using (var channel = connection.CreateModel()) { channel.ModelShutdown += Channel_ModelShutdown; while (!stopConsuming) { if (channel.ConsumerCount(queueName) < 2 || channel.MessageCount(queueName) > 10) { channel.QueueDeclare(queueName, true, false, false, queueArgs); channel.BasicQos(0, prefetchCount, false); var consumer = new EventingBasicConsumer(channel); consumer.Received += OnConsumer_ReceivedII; channel.BasicConsume(queueName, noAck, consumer); } else { Thread.Sleep(3000); } } } } catch (TimeoutException e) { Console.WriteLine(e); } catch (Exception exception) { OnMessageReceived(this, new MessageReceivedEventArgs { Exception = exception }); } }
public Client() { _adapter = new RabbitMQAdapter(); _adapter.Connect(); }
/// <summary> /// 單一程序取得Q訊息用 /// </summary> /// <param name="amqpAdapter"></param> /// <returns></returns> internal abstract string StartDequeue(AMQPAdapter amqpAdapter);
/// <summary> /// 背景Consumer處理服務之間的溝通 /// </summary> /// <param name="amqpAdapter"></param> internal abstract void StartAsync(AMQPAdapter amqpAdapter);