在某个时间(一周)之前,我的应用程序运行正常。所有调度程序都运行良好。那时我们使用MSMQ进行队列定位。
现在,我们实现并将所有MSMQ转移到RabbitMQ。 RabbitMQ(优先级)工作正常,但现在石英调度程序停止工作了吗?
我们使用石英版1.0.2.3 RabbitMQ版本3.6.0
任何人都可以帮我解决这个问题吗?
RabbitMQ代码段:
var factory = GetConnectionFactory();
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
IDictionary<String, Object> args = new Dictionary<String, Object>();
channel.BasicQos(0, 1, false);
args.Add("x-max-priority", 3);
channel.QueueDeclare(queueName, true, false, false, args);
var consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume(queueName, false, "", args, consumer);
while (true)
{
var ea = consumer.Queue.Dequeue();
string message = Encoding.UTF8.GetString(ea.Body);
ProcessMessageFromQueue(message);
Log.Info("Message Received from " + queueName + ": " + message + " , ChannelId : " + channel.NextPublishSeqNo + " ,ea:" + ea.DeliveryTag);
channel.BasicAck(ea.DeliveryTag, false);
//MessageQueueMessage messageQueueMessage = Utility.DeserializeObject<MessageQueueMessage>(message);
DeleteRedisVAriableByKey(message);
}
}
}
计划程序片段 -
NameValueCollection properties = null;
ISchedulerFactory sf = null;
IScheduler sched = null;
JobDetail jobDetail = null;
Quartz.CronTrigger trigger = null;
properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "RemoteServer";
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "5";
properties["quartz.threadPool.threadPriority"] = "Normal";
sf = new StdSchedulerFactory(properties);
sched = sf.GetScheduler();
sched.Start();
jobDetail = new JobDetail("MyJOb", "default", typeof(MyClass));
trigger = new CronTrigger("MyTrigger", "default", ConfigurationManager.AppSettings["CronExpression"]);
sched.ScheduleJob(jobDetail, trigger);
提前致谢!!
答案 0 :(得分:0)
这是线程的问题。
我们有一个no的参数。石英线。假设,它的值是10。
我们在石英开始工作时启动一个rabbitmq队列。
你在上面的代码中看到,在rabbitmq start方法中,有while循环。 所以它永远不会结束。
在第二次触发作业后,它会再创建一个消费者,但它永远不会结束。
经过一段时间线程接近线程限制。
一旦线程达到线程限制,就不会创建新线程。它停止了我们的调度程序。