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
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 –
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. –
désolé, je vais l'éditer –