/// <summary>
///
/// </summary>
public class RabbitMqWorker
{
//
readonly string rabbitMQ_HostConfig = System.Configuration.ConfigurationManager.AppSettings["RabbitMQ_Host22"];
//
BackgroundWorker bg = new BackgroundWorker();
//
IConnection rabbitMqConnection = null;
/// <summary>
///
/// </summary>
public RabbitMqWorker()
{
string[] arrRabbitConfig = rabbitMQ_HostConfig.Split(',');
rabbitMqConnection = RabbitMQHelper.Instance(arrRabbitConfig[0], int.Parse(arrRabbitConfig[1]), arrRabbitConfig[2], arrRabbitConfig[3], arrRabbitConfig[4]).Connection();
}
/// <summary>
///
/// </summary>
public void Start()
{
Program.loggor.Info("Start RabbitMqWorker");
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.WorkerSupportsCancellation = true;
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
bg.RunWorkerAsync();
}
/// <summary>
///
/// </summary>
public void Stop()
{
if (rabbitMqConnection != null)
{
rabbitMqConnection.Close();
}
if (bg != null && bg.IsBusy)
{
bg.CancelAsync();
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void bg_DoWork(object sender, DoWorkEventArgs e)
{
try
{
System.Threading.Thread.Sleep(1000);
System.Threading.Tasks.Parallel.Invoke(
() => { MessageConsumer("queue.sp.mipo.message"); },
() => { MessageConsumer("queue.sp.mipo.message"); },
() => { MessageConsumer("queue.sp.mipo.message"); },
() => { MessageConsumer("queue.sp.mipo.message"); },
() => { MessageConsumer("queue.sp.mipo.message"); });
/*
System.Threading.Tasks.Parallel.Invoke(
() => { MessageConsumer("queue.sp.mipo.message"); });
*/
}
catch (Exception ex)
{
EMailHelper.ToMail(ex);
Program.loggor.Error("RabbitMqWorker", ex);
}
}
/// <summary>
/// 消息消费者
/// </summary>
/// <param name="queueName"></param>
void MessageConsumer(string queueName)
{
//1.声明信道
using (IModel channel = rabbitMqConnection.CreateModel())
{
//2.声明队列
Dictionary<string, object> args = new Dictionary<string, object>();
args.Add("x-dead-letter-exchange", "exchange.dlx");
args.Add("x-dead-letter-routing-key", "rk.sp.mipo");
channel.QueueDeclare(queueName, true, false, false, args);
//3.绑定队列交换机, 指定路由Key值
//channel.QueueBind(queueName,);
//3.1同一时刻服务器只发一条消息给消费者, 公平分发
channel.BasicQos(0, 1, false);
//4.定义消费者
var consumer = new QueueingBasicConsumer(channel);
//5.监听队列,手动返回完成状态
channel.BasicConsume(queueName, false, consumer);
//6.循环取消息
while (true)
{
var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
//
System.Threading.Thread.Sleep(10);
//I.Todo...消费消息进行逻辑处理
if (RabbitConsumeBll.Instance().Bus(message))
{
//6.1成功后反馈确认状态
channel.BasicAck(ea.DeliveryTag, false);
}
else
{
//6.2失败后反馈拒绝状态
channel.BasicReject(ea.DeliveryTag, false);
}
}
}
}
/// <summary>
/// 后台线程执行完成
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
Program.loggor.Error("RabbitMqWorker", e.Error);
}
}
}