2017-08-31 2 views
-3

Je fais une notification d'anniversaire dans le service Windows qui utilise la librairie jabber-net qui est un XMPP et System.Threading qui doit envoyer des messages automatiques à l'utilisateur tous les jours, mais j'obtiens une erreur dans les journaux qui ditImpossible de convertir un objet de type 'System.Threading.Timer' en type 'jabber.client.JabberClient'

Impossible de lancer l'objet de type 'System.Threading.Timer' pour taper 'jabber.client.JabberClient'. à SparkSalesCrdBirthdays.SparkBirthDayGreeting.j_OnAuthenticate (sender Object)

Voici mon code

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(); 
     } 
    } 

J'espère que quelqu'un peut me aider. Je suis coincé :( Merci

+3

Vous avez mis tout le code qui ne sert à rien pour diagnostiquer le problème et supprimé la seule partie pertinente ... ('j_OnAuthenticate' est la seule partie pertinente BTW –

+0

La trace de pile de l'exception indique clairement où l'erreur se produit. Malheureusement, vous avez supprimé exactement cette partie de votre code de votre question. Le message d'erreur btw est assez explicite. –

+0

désolé, je vais l'éditer –

Répondre

2

Le problème est que l » événement JabberClient est traité dans j_OnAuthenticate et l'événement de la minuterie est traitée avec elle.

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

Et j_OnAuthenticate la première chose que vous faites est jeter les sender à JabberClient

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(); 
     } 
    } 

les poignées de bloc catch et enregistre l'exception.

Vous devrez changer le code pour faire des choses différentes en fonction de sender par exemple.

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

Ou donner la minuterie une fonction de rappel différente

+0

je vais essayer cela. Je vous remercie –