-4

我在使用 jabber-net 库的 Windows 服务中制作生日通知,该库是 XMPP 和 System.Threading,必须每天向用户发送自动消息,但我在日志中收到错误消息

无法将“System.Threading.Timer”类型的对象转换为“jabber.client.JabberClient”类型。在 SparkSalesCrdBirthdays.SparkBirthDayGreeting.j_OnAuthenticate(对象发件人)

这是我的代码

protected override void OnStart(string[] args)
    {
        this.WriteToFile("Simple Service started {0}");
        JabberClient j = new JabberClient();

        // what user/pass to log in as
        j.User = "user";
        j.Server = "server";  // use gmail.com for GoogleTalk
        j.Password = "pass";
        //j.Resource = "admin";
        // don't do extra stuff, please.
        j.AutoPresence = false;
        j.AutoRoster = false;
        j.AutoReconnect = -1;
        j.KeepAlive = 10;
        j.AutoLogin = true;
        j.AutoStartTLS = false;
        j.PlaintextAuth = true;

        j.OnError += new bedrock.ExceptionHandler(j_OnError);

        // what to do when login completes
        j.OnAuthenticate += new bedrock.ObjectHandler(j_OnAuthenticate);

        // listen for XMPP wire protocol
        if (VERBOSE)
        {
            j.OnReadText += new bedrock.TextHandler(j_OnReadText);
            j.OnWriteText += new bedrock.TextHandler(j_OnWriteText);
        }
        // Set everything in motion
        j.Connect();

        // wait until sending a message is complete
        done.WaitOne();

        // logout cleanly
        j.Close();

        this.ScheduleService();
    }

    protected override void OnStop()
    {
        this.WriteToFile("Simple Service stopped {0}");
        this.Schedular.Dispose();
    }

    private Timer Schedular;

    static void j_OnWriteText(object sender, string txt)
    {
        if (txt == " ") return;  // ignore keep-alive spaces
        Console.WriteLine("SEND: " + txt);
    }

    static void j_OnReadText(object sender, string txt)
    {
        if (txt == " ") return;  // ignore keep-alive spaces
        Console.WriteLine("RECV: " + txt);
    }



private void j_OnAuthenticate(object sender)
    {

       try
        {
            JabberClient j = (JabberClient)sender;

            DataTable dt = new DataTable();
            string birthdaymsg = "";
            string fullname;
            string department;
            string query = "SELECT CONCAT(FirstName, ' ', MiddleName, ' ', LastName) as Fullname, DepartmentDescription FROM vw_EmployeeOrganization  WHERE DATEPART(d, BirthDate) = DATEPART(d,GETDATE()) AND DATEPART(m, BirthDate) = DATEPART(m, GETDATE()) AND DepartmentDescription IN('Client Relations--CDO', 'E-Learning', 'Sales ', 'Client Relations', 'Sales-Davao', 'Sales-CDO', 'Client Relations--Cebu', 'Sales-Cebu')";

            string constr = ConfigurationManager.ConnectionStrings["HRIS"].ConnectionString;
            lstUsers.Clear();

            using (SqlConnection conn = new SqlConnection(constr))
            {

                using (SqlCommand cmd = new SqlCommand(query))
                {

                    cmd.Connection = conn;


                    using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
                    {
                        sda.Fill(dt);

                    }
                }
            }

            foreach (DataRow row in dt.Rows)
            {

                fullname = row["Fullname"].ToString();
                department = row["DepartmentDescription"].ToString();

                birthdaymsg = "Happy Birthday! " + fullname + " from " + department + "." +
                    System.Environment.NewLine + "May today be filled with sunshine and smile, laughter and love.";

                string queryRecipient = "SELECT * FROM tbl_MPAlertUsers";
                string constr2 = ConfigurationManager.ConnectionStrings["Constring"].ConnectionString;

                using (SqlConnection conn2 = new SqlConnection(constr2))
                {
                    using (SqlCommand cmd2 = new SqlCommand(queryRecipient))
                    {

                        cmd2.Connection = conn2;
                        conn2.Open();
                        SqlDataReader reader = cmd2.ExecuteReader();

                        while (reader.Read())
                        {
                            lstUsers.Add(reader["ADname"].ToString());

                        }
                        reader.Close();
                        conn2.Close();



                    }
                }
                //Send to Recipient
                for (int i = 0; i <= lstUsers.Count - 1; i++)
                {

                    if (lstUsers[i].ToString().Trim().Length > 1)
                    {
                        WriteToFile("Trying to send spark to: " + lstUsers[i].ToString());
                        j.Message(lstUsers[i], birthdaymsg);

                    }
                }

                done.Set();
            }
            this.ScheduleService();
        }
        catch (Exception ex)
        {
            WriteToFile("Simple Service Error on: {0} " + ex.Message + ex.StackTrace);

            //Stop the Windows Service.
            using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController("SparkBirthDayGreeting"))
            {
                serviceController.Stop();
            }
        }

    }

 public void ScheduleService()
    {
        try
        {

            Schedular = new Timer(new TimerCallback(j_OnAuthenticate));
            string mode = ConfigurationManager.AppSettings["Mode"].ToUpper();
            this.WriteToFile("Simple Service Mode: " + mode + " {0}");

            //Set the Default Time.
            DateTime scheduledTime = DateTime.MinValue;

            if (mode == "DAILY")
            {
                //Get the Scheduled Time from AppSettings.
                scheduledTime = DateTime.Parse(System.Configuration.ConfigurationManager.AppSettings["ScheduledTime"]);
                if (DateTime.Now > scheduledTime)
                {
                    //If Scheduled Time is passed set Schedule for the next day.
                    scheduledTime = scheduledTime.AddDays(1);
                }
            }

            if (mode.ToUpper() == "INTERVAL")
            {
                //Get the Interval in Minutes from AppSettings.
                int intervalMinutes = Convert.ToInt32(ConfigurationManager.AppSettings["IntervalMinutes"]);

                //Set the Scheduled Time by adding the Interval to Current Time.
                scheduledTime = DateTime.Now.AddMinutes(intervalMinutes);
                if (DateTime.Now > scheduledTime)
                {
                    //If Scheduled Time is passed set Schedule for the next Interval.
                    scheduledTime = scheduledTime.AddMinutes(intervalMinutes);
                }
            }

            TimeSpan timeSpan = scheduledTime.Subtract(DateTime.Now);
            string schedule = string.Format("{0} day(s) {1} hour(s) {2} minute(s) {3} seconds(s)", timeSpan.Days, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds);

            this.WriteToFile("Simple Service scheduled to run after: " + schedule + " {0}");

            //Get the difference in Minutes between the Scheduled and Current Time.
            int dueTime = Convert.ToInt32(timeSpan.TotalMilliseconds);

            //Change the Timer's Due Time.
            Schedular.Change(dueTime, Timeout.Infinite);
        }
        catch (Exception ex)
        {
            WriteToFile("Simple Service Error on: {0} " + ex.Message + ex.StackTrace);

            //Stop the Windows Service.
            using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController("SparkBirthDayGreeting"))
            {
                serviceController.Stop();
            }
        }
    }

    private void WriteToFile(string text)
    {
        string path = "C:\\ServiceLog.txt";
        using (StreamWriter writer = new StreamWriter(path, true))
        {
            writer.WriteLine(string.Format(text, DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt")));
            writer.Close();
        }
    }

我希望有人可以帮助我。我被卡住了:(谢谢。

4

1 回答 1

2

问题是JabberClient' 事件被处理,j_OnAuthenticate计时器事件被处理:

Schedular = new Timer(new TimerCallback(j_OnAuthenticate));
...
JabberClient j = new JabberClient();
j.OnAuthenticate += new bedrock.ObjectHandler(j_OnAuthenticate);

j_OnAuthenticate要做的第一件事就是senderJabberClient

private void j_OnAuthenticate(object sender)
{

   try
   {
       JabberClient j = (JabberClient)sender;
       ...
   }
   catch (Exception ex)
   {
       WriteToFile("Simple Service Error on: {0} " + ex.Message + ex.StackTrace);

       //Stop the Windows Service.
       using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController("SparkBirthDayGreeting"))
       {
            serviceController.Stop();
       }
   }

catch块处理并记录异常。

您将不得不根据sender例如更改代码来做不同的事情

if(sender is JabberClient)
{
    //do something
}
else if(sender is Timer)
{
    //do something else
}

或者给定时器一个不同的回调函数

于 2017-08-31T09:34:44.507 回答