我在使用 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();
}
}
我希望有人可以帮助我。我被卡住了:(谢谢。