热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自制小工具监控wcf服务是否正常

由于项目中有2个使用netTcpBinding的wcf服务经常出现无法提供服务的问题,一直找原因也找不到导致影响严重,更换InstanceContextMode和ConcurrencyMode配置

  由于项目中有2个使用netTcpBinding的wcf服务经常出现无法提供服务的问题,一直找原因也找不到导致影响严重,更换InstanceContextMode和ConcurrencyMode配置也不好使,出现问题后用户反馈,然后我这边在赶紧重启服务就好了,为此先写个小工具实现自动监控服务端程序是否正常如果不正常则实现自动重新启动服务程序功能,这方法只能治标不治本,对wcf了解的朋友可以给出些调试意见。

  程序使用devexpress的chartcontrol控件事实滚动界面,看图:

  

  

  折线图每次显示50个点,然后动态删除和新增点保持50个点,然后每次访问接口判断是否可以访问,以及是否访问超时,如果达到设置的次数则,直接执行外部程序实现重启wcf目的,然后等待一会后继续监控:

加载配置,启动任务:

 1 private void FrmMain_Load(object sender, EventArgs e)
 2         {
 3             DataBaseTaskScanningMessage = new EventWaitHandle(false, EventResetMode.AutoReset);
 4             p1 = this.chartControl1.Series[0].Points;
 5             p2 = this.chartControl1.Series[1].Points;
 6 
 7             _appFilePath = ReportInfo.Monitor.m.Default._appFilePath;
 8             _pointCount = m.Default._pointCount;
 9             _taskTimeSpan = m.Default._taskTimeSpan;
10             _timeOutSpan = m.Default._timeOutSpan;
11             _ntsdPath = m.Default._ntsdPath;
12 
13             Run();
14         }
15 
16         private void Run()
17         {
18             errorCount = 0;
19 
20             t = new Thread(() =>
21             {
22                 try
23                 {
24                     ShowMess("Run......");
25                     taskWait = ThreadPool.UnsafeRegisterWaitForSingleObject(DataBaseTaskScanningMessage, (x, e) => RunSc(), null, _taskTimeSpan, true);
26                     this.btn_start.Invoke((MethodInvoker)(() =>
27                     {
28                         this.btn_start.Enabled = false;
29                         this.btn_stop.Enabled = true;
30                     }));
31 
32                 }
33                 catch (Exception ex)
34                 {
35                     ShowMess("服务启动异常:" + ex.ToString());
36                     Log.LogService.LogError(string.Format("服务启动异常:{0}!", ex.ToString()), "btn_start_Click");
37 
38 
39                     this.btn_start.Invoke((MethodInvoker)(() =>
40                     {
41                         this.btn_start.Enabled = true;
42                         this.btn_stop.Enabled = false;
43                     }));
44                 }
45             });
46             t.IsBackground = true;
47             t.Start();
48         }

 

核心任务,超过3次则放置一个rest.txt文件,当服务端读取到这个文件存在时就会自杀然后重生,这是为了解决当服务端是通过任务计划system权限执行时,监控程序无权限结束进程的问题:

 1   #region 定时任务
 2 
 3         public static WaitHandle DataBaseTaskScanningMessage { get; private set; }
 4         private static RegisteredWaitHandle taskWait;
 5 
 6         public void RunSc()
 7         {
 8             try
 9             {
10                 string dt = DateTime.Now.ToString("mm-ss");
11                 Stopwatch sw = new Stopwatch();
12                 sw.Start();
13                 bool state = (new IMServerAgent()).ConnectionTest();
14                 sw.Stop();
15 
16                 ShowMess(string.Format("执行接口:{0} 结果:{1} 用时:{2}", "Message", state ? "成功" : "=失败=====", sw.ElapsedMilliseconds), !state);
17 
18                 if (sw.ElapsedMilliseconds > _timeOutSpan)
19                     state = false;
20 
21 
22                 if (p1.Count > _pointCount)
23                     p1.RemoveAt(0);
24                 p1.Add(new DevExpress.XtraCharts.SeriesPoint(dt, sw.ElapsedMilliseconds));
25 
26                 sw.Restart();
27                 bool state2 = (new ClientLogInfoAgent()).AddErrorLog("RunSc", "Monitor");
28                 sw.Stop();
29 
30 
31                 ShowMess(string.Format("执行接口:{0} 结果:{1} 用时:{2}", "Log   ", state2 ? "成功" : "=失败======", sw.ElapsedMilliseconds), !state);
32 
33                 if (sw.ElapsedMilliseconds > _timeOutSpan)
34                     state2 = false;
35 
36                 if (p2.Count > _pointCount)
37                     p2.RemoveAt(0);
38                 p2.Add(new DevExpress.XtraCharts.SeriesPoint(dt, sw.ElapsedMilliseconds));
39 
40 
41                 #region 判读是否出现异常
42 
43                 if (!state || !state2)
44                     Interlocked.Increment(ref errorCount);
45                 else
46                     Interlocked.Exchange(ref errorCount, 0);
47 
48                 if (errorCount >= 3)
49                 {
50                     Interlocked.Exchange(ref errorCount, 0);
51                     //异常重启服务
52                     if (File.Exists(_appFilePath))
53                     {
54                         ShowMess("rest......", true);
55                         
56 
57                         string path = @"D:\ReportServer\WebHelp\rest.txt";
58                         if (!System.IO.File.Exists(path))
59                         {
60                             if (!System.IO.Directory.Exists(Path.GetDirectoryName(path)))
61                                 System.IO.Directory.CreateDirectory(Path.GetDirectoryName(path));
62                             System.IO.File.WriteAllText(path, DateTime.Now.ToString());
63                         }
64 
65                         System.Diagnostics.Process.Start(_appFilePath);
66 
67                         System.Threading.Thread.Sleep(5 * 1000);
68                         int wCount = 0;
69                         while (Process.GetProcessesByName("ReportInfo.IMServer").Count() == 0)
70                         {
71                             wCount++;
72                             if (wCount > 100)
73                                 break;
74                             System.Threading.Thread.Sleep(1000);
75                         }
76 
77                     }
78                 }
79 
80                 #endregion
81 
82 
83 
84             }
85             catch (Exception ex)
86             {
87                 p1.Clear();
88                 p2.Clear();
89                 ShowMess("RunSc异常:" + ex.ToString());
90             }
91             finally
92             {
93                 taskWait = ThreadPool.UnsafeRegisterWaitForSingleObject(DataBaseTaskScanningMessage, (x, e) => RunSc(), null, _taskTimeSpan, true);
94             }
95         }
96 
97         #endregion

 

 毕竟不能根本解决问题,只能起到当有问题时第一时间发现,让用户感觉不到问题的存在。

 


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
author-avatar
嘟嘟仔2286768
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有