Member 11837253 Ответов: 1

Служба Windows получает сообщение MSMQ только в первый раз при запуске службы


Я впервые работаю как с windows service, так и с MSMQ. Я пытаюсь читать сообщения из очереди. Когда я запускаю свою службу windows, я получаю только первое сообщение, а следующее сообщение не может быть прочитано, служба все еще работает. если я перезапущу службу, она будет считывать первое сообщение из очереди. Пожалуйста, дайте мне знать, как исправить эту проблему.

Что я уже пробовал:

MessageQueue msMq = null;

protected override void OnStart(string[] args)
    {
        
        JobModel j = new JobModel();
        msMq = new MessageQueue(queueRequestName);
        msMq.ReceiveCompleted += MsMq_ReceiveCompleted1;
        try
        {            
            if (msMq != null)
            {                    
                msMq.Formatter = new XmlMessageFormatter(new Type[] { typeof(JobModel) });
                var message = (JobModel)msMq.BeginReceive();        

            }
        }      
        catch (Exception eee)
        {
            Console.Write(eee.ToString());
        }
        
    }
   private void MsMq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            var msMq = (MessageQueue)sender;
            var msg = msMq.EndReceive(e.AsyncResult); 
            //ToDo: process message          
            msMq.BeginReceive();
        }

1 Ответов

Рейтинг:
4

Christiaan van Bergen

Используйте то, что продолжает слушать. Метод Receive в MessageQueue сделает это.

Например:

var mq = new System.Messaging.MessageQueue(@".\Private$\SomeQueue");
while (mq.CanRead) // or any other loop condition
{
    var msg = mq.Receive();
    //do something with your message here
}

Метод Receive будет блокироваться до тех пор, пока сообщение не будет получено, после чего он удалит сообщение из очереди и вернет его.

ХТ христиан


Christiaan van Bergen

Имейте вокруг него петлю while-loop, иначе он все равно не будет продолжать прослушивание после обработки сообщения.

Member 11837253

- Добавил Я, но безуспешно. Я изменил код
общественности частичного класс service1 : например
{
private const string MqName = @".\private$\RequestQueue";
частная статический объект messagequeue _mq;

частная статический объект messagequeue МQ
{
получить
{
если (_mq == нуль)
{
если (!MessageQueue.Существует(MqName))
Объект messagequeue.Create(MqName);
_mq = new MessageQueue(MqName, QueueAccessMode.ReceiveAndAdmin);
_mq.Formatter = новый BinaryMessageFormatter();
}
вернуться _mq;
}
}
общественные службы service1()
{
метод InitializeComponent();
соток.ReceiveCompleted += новый ReceiveCompletedEventHandler(mq_ReceiveCompleted);
}

частная mq_ReceiveCompleted недействительным(объект отправителя, ReceiveCompletedEventArgs е)
{

MessageQueue cmq = (MessageQueue)отправитель;
пробовать
{
Сообщение сообщение = а.EndReceive(электронная.Asyncresult, к);
}
ловить
{
}
а.Освежить();
а.BeginReceive();
}


защищенное переопределение void OnStart(string[] args)
{
while(mq != null)
соток.BeginReceive();
}
частная MsMq_ReceiveCompleted недействительным(объект отправителя, ReceiveCompletedEventArgs е)
{
var msMq = (MessageQueue)отправитель;
ВАР МСГ = Майкрософт.EndReceive(электронная.Asyncresult, к);
служба msmq.BeginReceive();
}
охраняемых переопределить недействительными, то onStop()
{
if (mq != null)
соток.Закрывать();
вернуть;

}
}

Member 11837253

Служба Windows собирает сообщения только тогда, когда я ее запускаю, и после этого она перестает слушать

Christiaan van Bergen

Вы не реализуете код, который я вам показал. В вашем методе OnStart используйте mq.Receive(), я также объяснил, почему вы должны использовать этот метод. Попробуй, если это все еще не сработает, мы возьмем его оттуда.

Christiaan van Bergen

Нет, все правильно. Потому что вам нужно что-то сделать с реальным сообщением, которое вы получаете. Опять же, посмотрите на пример. Там написано: var msg = mq.Receive();
Так что сделайте что-нибудь с посланием.