求救:关于MQ连接报错2059(应用程序错误)的问题?
sccly 2007-06-29 11:24:37 问题是我在程序中做了一个线程监测与MQ服务器的连接,一旦连接中断则重新连接,但是在现成运行的过程中,偶尔会报2059:应用程序错误,不知道为什么,应该不是连接数已满的问题,请大侠们帮助解决一下,源代码如下:
while (conn_flag && !isRunning)
{
try
{
//线程正在运行
isRunning = true;
//if (count == short.MaxValue - 1)
//{
// count = 0;
//}
//mqmanager.ConnQueueManager();
mqmanager.Initiate();
try
{
count = count + 1;
}
catch (Exception ex)
{
}
try
{
Srv.Writeln(count.ToString());
}
catch (Exception ex1)
{
}
//若连接成功则跳出循环,线程不再运行
//this.conn_flag = true;
//线程取得正常的运行结果,不需要再次运行
isRunning = false;
try
{
Thread.Sleep(1 * 1000);
}
catch (Exception ex2)
{
}
if (count == 1)
{
GlobalVariable.SetGlobalVariable("mq", mqmanager);
Srv.Writeln("连接MQ服务器成功!可以进行读写操作!");
GlobalVariable.WriteEventLog("MQ", "连接MQ服务器成功", EventLogEntryType.Information);
string auto = Srv.Configuration["AutoRun"];
if (bool.Parse(auto))
{
lisThread = new TheadManager("RCVMQ");
lisThread.StartListen();
GlobalVariable.SetGlobalVariable("ListenThread", lisThread);
}
if (GlobalVariable.GetGlobalVariable("player") != null)
{
//停止报警
//SoundPlay play = (SoundPlay)GlobalVariable.GetGlobalVariable("player");
//play.StopPlay();
}
this.isCatch = true;
}
}
//以下为对连接过程中出现异常的处理
catch (MQException ex)
{
count = 0;
if (GlobalVariable.GetGlobalVariable("mq") != null)
{
GlobalVariable.Remove("mq");
}
//modify-07-04-19
//if (GlobalVariable.GetGlobalVariable("ims") != null)
//{
// GlobalVariable.Remove("ims");
//}
if (!isCatch)
{
GlobalVariable.WriteEventLog("MQ", "连接MQ服务器异常 " + "异常代码" + ex.ReasonCode.ToString() + "异常信息" + ex.Message, EventLogEntryType.FailureAudit);
player = (SoundPlay)GlobalVariable.GetGlobalVariable("player");
if (player != null)
{
player.PlaySound();
}
this.isCatch = true;
}
try
{
//出现异常关闭监听线程
TheadManager thread = (TheadManager)GlobalVariable.GetGlobalVariable("ListenThread");
if (thread != null)
{
thread.CloseListen();
}
}
catch
{
Srv.Writeln("监听线程未启动");
}
string name = Thread.CurrentThread.Name;
//Srv.Writeln("连接MQ服务器的过程中出现异常,请查看日志!日志位置位于安装目录下MQ文件夹下"+ex.ToString());
switch (ex.ReasonCode)
{
//连接断开
case 2009:
//队列管理者无效或未知
case 2058:
//队列管理者无效
case 2059:
//意外的错误发生
case 2195:
//服务器正在启动
case 2161:
//服务器正在关闭
case 2162:
//阻塞线程三秒,之后重新连接,重复3次,如果连接不上,置空
//for (int i = 0; i < 3; i++)
{
Srv.Writeln("正在重新连接MQ服务器!若没有恢复请及时联系MQ服务器管理员!" + ex.ToString());
//线程十秒后再次运行
Thread.Sleep(5 * 1000);
fm = new FileManager("MQ\\MQLog.log");
fm.WriteStringToFile(DateTime.Now.ToString() + " 连接MQ服务器的过程中出现问题 " + ex.Message.ToString() + "错误代码:" + ex.ReasonCode + "错误提示:" + ex.ToString());
fm.CloseStreamWriter();
}
//线程一次运行已经结束,但未得到预期的结果,需要再次运行
isRunning = false;
conn_flag = true;
mqmanager.SetQueueManager(null);
break;
//无权访问服务器队列管理者
case 2035:
//线程不需要再次运行,直接写入日志文件,并报警
conn_flag = false;
fm = new FileManager("MQ\\MQLog.log");
fm.WriteStringToFile(DateTime.Now.ToString() + " 无权访问MQ服务器队列管理者 " + ex.Message.ToString() + "错误代码:" + ex.ReasonCode);
fm.CloseStreamWriter();
mqmanager.SetQueueManager(null);
break;
//其他异常
default:
//线程不需要再次运行,直接写入日志文件,并报警
conn_flag = true;
fm = new FileManager("MQ\\MQLog.log");
fm.WriteStringToFile(DateTime.Now.ToString() + " 连接MQ服务器的过程之中出现未知的异常 " + ex.Message.ToString() + "错误代码:" + ex.ReasonCode);
fm.CloseStreamWriter();
mqmanager.SetQueueManager(null);
break;
}
}
finally
{
//关闭MQ服务器队列管理器
mqmanager.CloseManager();
}