Служба не может прочитать сообщения из очереди после перехода на новую машину - PullRequest
0 голосов
/ 28 сентября 2010

Эта служба Windows считывает электронную почту из MSMQ. Он читал почту при развертывании на Windows Server 2003. После перемещения на Windows Server 2008 он прекратил чтение электронной почты. Он не пишет никаких журналов в файл. Когда служба Windows запущена, ничего не происходит.

Пожалуйста, кто-нибудь может сказать мне, что может быть не так. Нужно ли настраивать / изменять какие-либо параметры реестра в Windows Server 2008?

Вот соответствующий метод, при котором регистрация НЕ происходит:

    public void OnStart()
   // protected override void OnStart(string[] args)        
    {
        string queuePath = ConfigurationManager.AppSettings["mqPath"];
        mailFrom = ConfigurationManager.AppSettings["notificationemail"];
        string SMTPSSLConfig = ConfigurationManager.AppSettings["smtpclientssl"];

        if (string.IsNullOrEmpty(queuePath))
        {
            throw new Exception("Message queue path not defined in app.config.");
        }
        if (string.IsNullOrEmpty(mailFrom))
        {
            throw new Exception("Sender email used to send  notifications is not defined in app.config.");
        }
        if (string.IsNullOrEmpty(SMTPSSLConfig))
        {
            throw new Exception("SMTP SSL config not defined in app.config.");
        }
        objSmtpClient = new SmtpClient();
        objSmtpClient.EnableSsl = Convert.ToBoolean(SMTPSSLConfig);

        //QueueService.InsureQueueExists(queuePath);
        msgQ = new MessageQueue(queuePath);
        msgQ.Formatter = new BinaryMessageFormatter();
        msgQ.MessageReadPropertyFilter.SetAll();
        msgQ.ReceiveCompleted += new ReceiveCompletedEventHandler(msgQ_ReceiveCompleted);
        msgQ.BeginReceive();
        try
        {
            if (!MessageQueue.Exists(queuePath))
            {
                MessageQueue.Create(queuePath);
                Log.WriteMessageQueueInitialParamsLog(System.DateTime.Now.ToString()+" :Message queue successfully created at following location:"+queuePath);
            }
            else
            {
                Log.WriteMessageQueueInitialParamsLog(System.DateTime.Now.ToString() + ": Message Queue Path: " + msgQ.Path);
            }                
        }
        catch (Exception ex)
        {
            Log.WriteCommonLog(System.DateTime.Now.ToString() + " :Error checking message queue existence:\n"+GetExceptionMessageString(ex));   
        }

        //eventLog1.WriteEntry(System.DateTime.Now.ToString()+" :EmailService started successfully." );
        Log.WriteMessageQueueInitialParamsLog(System.DateTime.Now.ToString()+" :Message queue started successfully.");

    }       

Полный код на http://pastebin.com/aiECMTVL

1 Ответ

0 голосов
/ 28 сентября 2010

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

Рассмотрите возможность рефакторинга ваших Log методов, чтобы ВСЕГДА вставлять текущую метку времени, чтобы избегали повторения себя везде в вашем коде,

Обновление: если вы не можете заставить его работать, удалите ВСЕ, и у вас есть только один оператор журнала:

protected override void OnStart(string[] args)
{
   Log.Log("In OnStart");
}

Затем добавьте свой код с большим количеством журналирования.

public void OnStart()        
{
    Log.Write("OnStart");

    if (ValidateConfigSettings(out queuePath, out mailFrom, out SMTPSSLConfig))
    { 
        Log.Write("Validated config");
        msgQ = SetupMessageQueue(queuePath);
        Log.Write("Set up the queue obj.");
        msgQ.BeginReceive();
        Log.Write("Begun queue receive.");
        try
        {
            if (!MessageQueue.Exists(queuePath))
            {
                MessageQueue.Create(queuePath);
                Log.Log("Message queue successfully created following location:" + queuePath);
            }
            else                   
                Log.Log("Message Queue Path: " + msgQ.Path);                    
        }
        catch (Exception ex)              
            Log.WriteCommonLog("Error checking message queue existence:\n" + GetExceptionMessageString(ex));                
    }
    else
        Log.Write("Found bad config.");

    Log.Log("Message queue started successfully.");
} 
...