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

  由于项目中有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

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

时间: 2024-12-09 07:45:41

自制小工具监控wcf服务是否正常的相关文章

[自制小工具分享] 快速打开 (WIN + R 增强)

我的桌面永远都是乱糟糟的, 想找个找个程序很不容易, 逗鸡眼一样的逗半天,才能找得到. 特别是工作的时候, 想打开个软件, 翻来翻去, 耽误不少时间. 我相信8成长以上的猿类都和我一样, 很多常用的工具,MB急着用的时候,就是不知道在哪个位置. 好几个同学都看我 WIN + R , 然后乱输入一气, 居然把想要的东西给打开了, 很是惊诧. 其实一点都不难, 只是修改了注册表而已. 先看今天我要显摆的东西(PS : 第一版是两年前用WINFORM 写的, 硬盘坏掉后,源码丢失了, 只留了一个EXE

【自制小工具】代码生成器

陆陆续续接触过好几款代码生成工具,发现确实好用,但都会有那么点不完善的地方,所以索性就自己做一个吧. 界面非常简单,反正是自己用的,简单点用起来也方便 上图:左侧是服务器列表(该列表是通过语句获取的,不受 Sql Server 版本影响,除非语法变了     右侧代码生成区 : 功能上内置了 1. 导出实体类(包含属性,方法有 List 转 DataTable, DataTable 转 List,生成实体表) (支持列的筛选) 2. SELECT ,UPDATE ,INSERT,DELETE ,

[自制小工具分享] ResEditor 及 简单的 MVC 多语言示例

ResEditor 的用处前提 1, MVC2, 需要设置字段的显示名称 Display3, 用资源文件 背景:我们的项目是 MVC5 + ORACLE + EF Db First需求分析师兼任数据库设计, 目前有141张表, 70% 的表,字段数在100个以上. 加 Display 特性一般由两个途径:1,直接在实体类上添加2,用伴随类.但是实体类是由 EF 的TT模板自动生成的,虽然可以修改 TT 文件加上 Display 特性到属性上,但是字段的描述不适合直接拿来当Display如果用伴随

WCF服务端开发和客户端引用小结

1.服务端开发(包含寄宿) 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序,可生成一个带.svc后缀名的文件.该文件与webform中的aspx文件类似,有后置代码,这些后置代码是服务接口的实现.这种方式创建的WCF服务都承载在IIS或WAS上. (2)创建WCF服务库 WCF服务库是一个类库,如前所述包含一个服务接口和服务实现,此种方式创建的WCF服务可根据

WCF服务配置编辑器使用

学习wcf,特别是初学者,配置文件很难搞懂,有点复杂,自己手动配置哪有这么多精力啊,这不是吃的太饱了吗,所以学会使用配置编辑器是必须的,下面是学习的流程图. 打开工具的wcf服务配置编辑器,点击文件=>打开=>配置文件(找到你项目所在的app.config配置文件),服务是空的,在点击新建服务,浏览找到dll文件单击文件加入服务类型 点击下一步,在点击下一步,默认选择http在下一步,下一步,之后就是下面的页面了,填写好终结点的地址下一步 完成创建之后便是配置好所谓的ABC了,照着下面的配置就

监控小工具(jconsole)

偶然发现的一个监控小工具 配置好Jmeter运行的环境,在CMD命令中输入:jconsole 即可弹出一个[java监视和管理控制台]

快速创建WCF服务和svcutil.exe工具使用

先简单的创建WCF服务: 系统会自动加上IService1接口 和 Service1 实现类 分别在IService1 和Service1 加上2段代码. 1 [ServiceContract] 2 public interface IService1 3 { 4 [OperationContract] 5 string HelloWorld(); 6 7 [OperationContract] 8 string GetData(int value); 9 10 [OperationContra

WCF服务二:创建一个简单的WCF服务程序

在本例中,我们将实现一个简单的计算服务,提供基本的加.减.乘.除运算,通过客户端和服务端运行在同一台机器上的不同进程实现. 一.新建WCF服务 1.新建一个空白解决方案,解决方案名称为"WCFSolution". 2.解决方案右键->添加->类库项目,类库名称为CalculateWcfService. 3.创建服务契约 WCF采用基于契约的交互方式实现了服务的自制.服务契约:是相关操作的集合.契约就是双方或多方就某个关注点达成的一种共识,是一方向另一方的一种承诺.签署了某个

20个命令行工具监控 Linux 系统性能(转载)

1. top — Linux 系统进程监控 top 命令是性能监控程序,它可以在很多 Linux/Unix 版本下使用,并且它也是 Linux 系统管理员经常使用的监控系统性能的工具.Top 命令可以定期显示所有正在运行和实际运行并且更新到列表中,它显示出 CPU 的使用.内存的使用.交换内存.缓存大小.缓冲区大小.过程控制.用户和更多命令.它也会显示内存和 CPU 使用率过高的正在运行的进程.当我们对 Linux 系统需要去监控和采取正确的行动时,top 命令对于系统管理员是非常有用的.让我们