精华内容
下载资源
问答
  • 自写的.net类,实现任务管理器的常用功能,同时可获取远程计算机部分信息(需要对方开放相应的远程服务进行授权) 获取系统开机时间、CPU使用率、内存大小、硬盘容量使用情况、网络流量; 获取系统各进程启动时间、...
  • 通过任务管理器用户可以方便查看当前运行程序、进程、用户、网络连接以及系统对内存和CPU资源占用,并可以强制结束某些程序和进程,此外还可以监控系统资源使用状况。 Windows 任务管理器首次出现是在1998年...
  • Task Manager DeLuxe是windows下免费高级任务管理器,它使用标签页方式聚合了很多常用的功能,比如杀死进程、管理服务、删除不需要开机自启动项、查看ip地址和硬件基本信息,也可以用来替代windows自带...
  • 1概述 最近在项目中需要显示实时监控的折线图,通过在网上搜索解决方案,发现了一个开源基于MFC类实现了Windows任务管理器性能使用记录显示。在此基础上进行修改。在这里对该类进行详细分析,...

    1概述

    最近在项目中需要显示实时监控的折线图,通过在网上搜索解决方案,发现了一个开源的基于MFC的类实现了Windows任务管理器性能使用记录的显示。在此基础上进行修改。在这里对该类进行详细的分析,并且把其实现原理进行分析,通过对原理分析,进而通过修改源码能够随心所欲的制作我们需要的使用记录窗口。

    这是该类原主页,是codeproject上的,有兴趣的可以参考下。这是Mehdi Mousavi 先给他的爱人的,外国人都是这么浪漫~~O(_)O~

    CHistogramCtrl, a windows 2000 like histogram control

    下面对该类进行详细分析

    首先我们分析一下任务管理器中显示CPU使用记录的表现,绿色网格在不停的向左滚动,在每次滚动中刷新出新的数据。表面上看上去是显示的曲线,但是实际上如果通过两点连线的方式,把每两个点之间的距离缩小,看上去非常像曲线。所以可以这样理解,每次绿色网格向做滚动时,最右面会出现一个点,这时会从原来的点向新出现的点画线。

    分析完曲线形成的原理,下面想办法实现绿色网格的滚动显示。其实眼睛是可以被欺骗的,下面这种方法便可以实现看上去是滚动的效果。

    看上图,方法时通过复制红色框住的部分然后向左移动一小段距离粘贴显示,然后重绘右边空出的一小条屏幕,这样让人感觉整个屏幕在向左不断的滚动。当然这里需要好好处理一下绿色线条如何重绘。对于复制的方法下面会详细解释。

    2.实现方法

    继续前面的介绍该功能如何实现,其实全部功能都通过一个类来实现的。即为CHistogramCtrl(原文的类),该类中主要封装了一些设置函数然后就是实现的方法。

    其中最重要的函数就是create函数和drawline函数,前者是窗口的创造者,而在后者中实现了滚动效果及折线的显示。下面重点说一下这两部分的实现。

    Create函数

    对于create函数部分大家只需要了解一下其实现的方法即可,实际使用中并不需要对其进行更改。

       该类是继承了CWnd类的,他使用了父类CWndCreate方法创建了一个窗口,实际使用时,我们是通过创建一个静态STATIC来传到这个方法中进而在STATIC中创建出该窗口的。后面使用方法会详细介绍如何使用。

    Drawline函数

    该类中添加了一个定时器句柄,在定时器中定时执行Drawline函数,从而实现滚动效果。

    在介绍Drawline之前,首先是要初始网格,在Invalidate里面进行的。

    for(register i = m_rcClient.left - 1; i < m_rcClient.right; i += 40)

    {//横向宽度为40个像素点

           m_pMemDC->MoveTo(i, m_rcClient.top);

           m_pMemDC->LineTo(i, m_rcClient.bottom);

    }

     

    for(register j = m_rcClient.top - 1; j < m_rcClient.bottom; j += 13)

    {//纵向宽度为13个像素点

           m_pMemDC->MoveTo(m_rcClient.left, j);

           m_pMemDC->LineTo(m_rcClient.right, j);

    }

    其中标红的部分时控制的初始网格宽度,本人希望在后面对这个类进行更改,增加更多的外部接口,从而使用更加方便,即不用过多的更改源代码。下面具体介绍Drawline函数的实现。

    首先就是通过下面这段代码实现前面提到的区域拷贝并复制。

           //该矩形为每次定时器刷新 需要重绘的举行,跟每次刷新的像素数有关,现在是每次刷新10个像素

           CRect bkRect(m_rcClient.right - 20, m_rcClient.top, m_rcClient.right, m_rcClient.bottom);

           CBrush bkBrush;

           bkBrush.CreateSolidBrush(m_crBackGround);

           m_pMemDC->FillRect(bkRect, &bkBrush);

           //获取内存中DC,并将其向左错位复制到显示DC,其实倒数第三个参数就是其错位的像素数,现在错位10个像素

           //通过该机制使得屏幕实现向左推移的效果。

           m_pMemDC->BitBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), m_pMemDC, 20, 0, SRCCOPY);

    其中m_rcClient就是去的整个显示窗口的区域。这段代码的重点就是CDC的一个成员函数BitBlt,该函数实现了从源设备上下文拷贝位图到这个当前设备上下文。可以Google一下该函数,具体用法如下:

    BOOL   BitBlt(   int   x,   int   y,   int   nWidth,   int   nHeight,   CDC*   pSrcDC,   int   xSrc,   int   ySrc,   DWORD   dwRop   );

    返回值:函数成功,返回非零值,否则为0

    参数:   x   指定目标矩形左上角的逻辑x坐标。    

    y   指定目标矩形左上角的逻辑y坐标。    

    nWidth   指定目标矩形和源位图的宽度(逻辑单位)。    

    nHeight   指定目标矩形和源位图的高度(逻辑单位)。    

    pSrcDC   指向CDC对象的指针,标识待拷贝位图的设备上下文。如果dwRop指定不包括源的光栅操作,则它必须为NULL    

    xSrc   指定源位图左上角的逻辑X坐标。    

    ySrc   指定源位图左上角的逻辑Y坐标。    

    dwRop   指定要执行的光栅操作。光栅操作代码定义GDC如何合并输出操作中的颜色,包括当前画刷、可能的源位图和目标位图。

    通过函数参数的介绍可知,程序中BitBlt函数中的倒数第三个参数20正式每次向左移动的像素数。至此实现了拷贝,下面就是剩下那部分区域的重绘了。

    重绘也很简单,无非分两部分,一部分是画网格,另一部分就是画我们所需要的折线。

    画网格:这一部分画横线很简单,跟前面一致就可以了,但是画竖线需要计算一下在那个位置画,因为必须保证画出来后和前面拼接后仍然保持网格状,我认为这是本程序最难处理的部分。代码如下:

           //m_nFirstLinePos 初始为宽度,每次要减去想做错位的像素数,

           m_nFirstLinePos -= 20;

           if(m_nFirstLinePos < 0)

                  m_nFirstLinePos += 40;  

    //画新刷出来的竖线

           int nX = m_rcClient.right - ((m_rcClient.right - m_nFirstLinePos) % 40) - 1;

           m_pMemDC->MoveTo(nX, m_rcClient.top);

           m_pMemDC->LineTo(nX, m_rcClient.bottom);

    这一部分我是通过反复画图,尝试才最终明白原理,原来左面网格是对齐的,通过移动后,会出现左右分别有不完成的网格,而中间是完整的网格,而左边不完整的部分是可以计算的,就是用网格的宽度减去错位的宽度。这时用总的长度减去左半部分不足一个网格的宽度后,再对网格宽度取模,剩下的部分就是右边不足一个网格宽度,用总的减去它,就是最右边那条线应该画的位置,如果在应该重绘的区域内就画出来,如果不在就不画。-1是为了应付如果正好在边框处,这样也可以显示。

    画折线:这部分比较简单了,代码如下:

           for(int k=0; k<m_nLineNum ;k++)

           {

                  m_pMemDC->SelectObject(m_colorPenAll[k]);

                  //要减去 错位的像素

                  m_pMemDC->MoveTo(m_rcClient.right - 25 - 20, m_yPreviousPosAll[k]);

                  m_pMemDC->LineTo(m_rcClient.right - 25, m_yPosAll[k]);

                  m_yPreviousPosAll[k] = m_yPosAll[k];

           }

    原类只实现了一条折线,本类能够实现多条线,其实就是通过设置一下线的数目,然后用一个数组存储各个位置。

    3补充说明一些问题

    原文中提到使用了一个CList存储位置,是为了如果在我们定时器刷新显示的过程中有多个数据传到我们的位置数据结构中,我们会全部保存下来,然后在下次刷新显示时,取所有数据的平均值进行显示。

    本类没有使用,当然这也是根据实际需要进行的,我需要的是最新值,不关心个别值,而且也可以通过控制刷新频率减小误差。

    4使用方法

    原文对使用方法有了很详细的注解,在此不对设置函数进行解释,只对如何将该类显示在我们静态控件中。

    使用起来非常简单。

    1。在对话框中加入一个静态控件,命名为IDC_STATIC_HISTOGRAM,然后在对话框初始化函数中(如果没有自己添加句柄)定义

    CHistogramCtrl  m_ctrlHistogram;

    然后添加如下代码即可显示

    CRect rect;

    // 获取静态控件的举行

    GetDlgItem(IDC_STATIC_HISTOGRAM)->GetWindowRect(rect);

    // 将该矩形转化为客户窗口

    ScreenToClient(rect);

    // 调用Create函数,并将上面的矩形传入

    m_ctrlHistogram.Create(WS_VISIBLE | WS_CHILD

          | WS_TABSTOP, rect, this, IDC_STATIC_HISTOGRAM);

    这是就会在静态框中显示滚动的网格了

    当然如果你要想显示折线,需要定时的使用SetPos()设置每个时刻的位置,形成折线。我的类中重载了该方法,可以设置多条线的位置。

     

    CHistogramCtrl就介绍这么多,等有空后再把该类好好修改下,传上来供大家参考。

    展开全文
  • 的任务管理器

    2012-08-27 22:52:00
    系统只带的任务管理器没有网速监控的功能,而那些各种什么卫士,实在很讨厌安装各种东西,无时无刻不在使用我电脑资源,我老爷机本来就很慢。所以,我写了这么一个小的任务管理器。没有任何...

    一、动因

      当我们忙碌了一整天,准备小打基本小游戏然后睡觉的时候(我打星际争霸,谁有兴趣请加入,我的最爱啊,13年了),而竟然被无奈的各种流氓下载工具,播放器等使用无数的线程进行上载而影响网速的时候,是多么的愤怒!!系统只带的任务管理器没有网速监控的功能,而那些各种什么卫士,实在很讨厌安装各种东西,无时无刻不在使用我的电脑资源,我的老爷机本来就很慢。所以,我写了这么一个小的任务管理器。没有任何多余的功能,一个简单的listctrl,但是却可以总结基本上所有的程序(通过提升用户权限),和显示那个占用了我们的网络宽带。这是最重要的。


    二、基本功能

    看上面的画面大家就知道,我正在使用金山t盘上载资料(这里和大家交流下,我基本上所有的工具,代码,笔记)都上传网络,即使你在一个裸机上也能快速进行恢复和工作。所以什么病毒也不怕啊),双击表头可以进行排序,这里显示每一个具体的进程使用的端口,上下载速度,可执行文件在那里,io/cpu/mem/thread等基本成本。双击任意一个进程就可以关闭该进程。

    三、开发中的一些注意点

    1、主要使用wincap 的抓包功能,抓到所有的包后进行统计,每隔一下段时间进行数据的更新,我对比了一下和金山卫士显示的占用流量,基本一致

    2、在cpu/mem等的统计中主要是使用了windows的性能计数器进行统计,但是这里有一个问题要注意,对cpu使用率等,这些在安装了性能计数器后,需要等待一点时间,然后重复两次收集数据才能得到统计结果,否则都是0

    for(int i = 0;i<counterCount;i++)  
        {  
            pdhStatus = PdhCollectQueryData (hQueryArray[i]);

        }

        Sleep(1000);

        for(int i = 0;i<counterCount;i++)  
        {  
            pdhStatus = PdhCollectQueryData (hQueryArray[i]);

        }

    四、下载地址

    bin: http://files.cnblogs.com/xiongwjw/wyw_process_monitor_bin.zip

    src:  http://files.cnblogs.com/xiongwjw/wyw_process_monitor_src.zip

    转载于:https://www.cnblogs.com/xiongwjw/archive/2012/08/27/2659336.html

    展开全文
  • Quartz任务监控管理

    千次阅读 2014-07-01 17:15:35
    Quartz任务监控管理,类似Windows任务管理器,可以获得运行时实时监控,查看任务运行状态,动态增加任务,暂停、恢复、移除任务等。对于动态增加任务,可以参加我前一篇文章《Quartz如何在Spring动态配置时间》...
    Quartz任务监控管理,类似Windows任务管理器,可以获得运行时的实时监控,查看任务运行状态,动态增加任务,暂停、恢复、移除任务等。对于动态增加任务,可以参加我的前一篇文章《Quartz如何在Spring动态配置时间》,本文在前文的基础上扩展,增加暂停、恢复、移除任务等功能,实现Quartz任务监控管理。 


    先看一下最终实现实现效果,只有两个页面 ,如下 

    在这个页面查看任务实时运行状态,可以暂停、恢复、移除任务等 


    在这个页面可以动态配置调度任务。 


    实现任务监控,必须能将数据持久化,这里采用数据库方式,Quartz对任务的数据库持久化有着非常好的支持。我在这里采用quartz 1.6.5,在Quartz发行包的docs\dbTables目录包含有各种数据库对应脚本,我用的是MySql 5.0,所以选用tables_mysql_innodb.sql建表。 

    建表完成后,配置数据库连接池,分两步: 
    1、配置jdbc.properties文件 
    Java代码  收藏代码
    1. jdbc.driverClassName=com.mysql.jdbc.Driver  
    2. jdbc.url=jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true  
    3. jdbc.username=root  
    4. jdbc.password=kfs  

    2.配置applicationContext.xml文件 
    Java代码  收藏代码
    1. <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
    2.     <property name="locations">  
    3.             <list>  
    4.                 <value>classpath:jdbc.properties</value>  
    5.             </list>  
    6.         </property>  
    7. </bean>  
    8.       
    9.     <!-- 数据源定义,使用c3p0 连接池 -->  
    10. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
    11.     <property name="driverClass" value="${jdbc.driverClassName}" />     
    12.     <property name="jdbcUrl" value="${jdbc.url}" />     
    13.     <property name="user" value="${jdbc.username}" />   
    14.     <property name="password" value="${jdbc.password}" />       
    15.     <property name="initialPoolSize" value="${cpool.minPoolSize}"/>     
    16.     <property name="minPoolSize" value="${cpool.minPoolSize}" />    
    17.     <property name="maxPoolSize" value="${cpool.maxPoolSize}" />    
    18.     <property name="acquireIncrement" value="${cpool.acquireIncrement}" />   
    19.     <property name="maxIdleTime" value="${cpool.maxIdleTime}"/>     
    20. </bean>  

    配置Quartz,也分两步 
    1、配置quartz. properties 
    Java代码  收藏代码
    1. …  
    2. org.quartz.jobStore.misfireThreshold = 60000  
    3. #org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore  
    4. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
    5. org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate  
    6. #org.quartz.jobStore.useProperties = true  
    7. org.quartz.jobStore.tablePrefix = QRTZ_    
    8. org.quartz.jobStore.isClustered = false  org.quartz.jobStore.maxMisfiresToHandleAtATime=1  

    在这里采用JobStoreTX,将任务持久化到数据中,而不再是简单的内存方式:RAMJobStore 

    2、配置applicationContext-quartz.xml 
    Java代码  收藏代码
    1. <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    2.         <property name="dataSource" ref ="dataSource" />         
    3.         <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>  
    4.         <property name="configLocation" value="classpath:quartz.properties"/>  
    5.     </bean>  
    6.       
    7. <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">  
    8.         <property name="jobClass">  
    9.             <value>  
    10.                 com.sundoctor.example.service.MyQuartzJobBean  
    11.             </value>  
    12.         </property>  
    13.         <property name="jobDataAsMap">  
    14.             <map>  
    15.                 <entry key="simpleService">  
    16.                     <ref bean="simpleService"/>  
    17.                 </entry>  
    18.             </map>  
    19.         </property>      
    20. </bean>  

    到些,相关配置全部完成,对于配置的具体描述,可以参加我的前一篇文章《Quartz如何在Spring动态配置时间》

    实现任务动态添加配置 

    请参考com.sundoctor.quartz.service.SchedulerServiceImpl.java中的各种schedule方法,在《Quartz如何在Spring动态配置时间》有具体描述。在这里说一下: 
    添加一个Job在表qrtz_job_details插入一条记录 
    添加一个Simple Trigger在表qrtz_simple_triggers插入一条记录 
    添加一个Cron Trigger 在表qrtz_cron_triggers插入一条记录 
    添加Simple Trigger和Cron Trigger都会同进在表qrtz_triggers插入一条记录,开始看的第一个页面调度任务列表数据就是从qrtz_triggers表获取 

    实现任务实时监控,暂停、恢复、移除任务等 
    在com.sundoctor.quartz.service.SchedulerServiceImpl.java类中 

    暂停任务 
    Java代码  收藏代码
    1. public void pauseTrigger(String triggerName,String group){        
    2.         try {  
    3.             scheduler.pauseTrigger(triggerName, group);//停止触发器  
    4.         } catch (SchedulerException e) {  
    5.             throw new RuntimeException(e);  
    6.         }  
    7. }  

    恢复任务 
    Java代码  收藏代码
    1. public void resumeTrigger(String triggerName,String group){       
    2.         try {  
    3.             scheduler.resumeTrigger(triggerName, group);//重启触发器  
    4.         } catch (SchedulerException e) {  
    5.             throw new RuntimeException(e);  
    6.         }  
    7.     }  

    移除任务 
    Java代码  收藏代码
    1. public boolean removeTrigdger(String triggerName,String group){       
    2.         try {  
    3.             scheduler.pauseTrigger(triggerName, group);//停止触发器  
    4.             return scheduler.unscheduleJob(triggerName, group);//移除触发器  
    5.         } catch (SchedulerException e) {  
    6.             throw new RuntimeException(e);  
    7.         }  
    8.     }  


    其它类的实现请参加《Quartz如何在Spring动态配置时间》,那里有具体说明。 

    到此,基本简单实现了Quartz任务监控管理。其实面这里只是实现了Trigger任务的监控管理,没有实现Job任务的监控管理,实现Job任务的监控管理跟Trigger差不多。用Quartz可以很方便实现多样化的任务监控管理,Trigger任务和Job任务都可进行分组管理。 


    我们知道实现的因难是Job持久化需要序列化,主要是以处下三个问题: 

    一、org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean报 java.io.NotSerializableException异常,需要自己实现QuartzJobBean。 

    二、dao必须要实现序列化接口,Hibernate dao不能直接继承自HibernateDaoSupport,因为HibernateDaoSupport没有实现序列化接口,只能通过SessionFactory构造HibernateTemplate。 

    三、当库里己存在Trigger,应用启动时会从库里加载己存在Trigger,会报java.io.InvalidObjectException: Could not find a SessionFactory named: null等SessionFactory等相关异常。因为应用每次启动的得到的SessionFactory实例是不一样的,当从库里取到的Job进行反序列化时,Job里包含的SessionFactory与当前的SessionFactory不一致,所以为null。当时解决这问题采用了一个比较笨的方法,在SchedulerServiceImpl增加一个初始化方法 

    Java代码  收藏代码
    1. @PostConstruct  
    2. public void init() throws SchedulerException{  
    3.      logger.info("init start....................");  
    4.      scheduler.addJob(jobDetail, true);   
    5.      logger.info("init end.......................");          
    6. }  

    并且增加 
    Java代码  收藏代码
    1. <property name="startupDelay" value="60"/>  

    让QuartzScheduler延时启动,为了保证init()先执行,init()是更新Job,其实只是为了更新当前的SessionFactory到Job中,保持Job里的SessionFactory与当前SessionFactory一致。我后来发现解决这个问题还有一个更好的方法,在org.springframework.scheduling.quartz.SchedulerFactoryBean是可配置的 
    Java代码  收藏代码
    1. <property name="overwriteExistingJobs" value="true"/>  
    2. <property name="jobDetails" >  
    3. <list>  
    4. <ref bean="jobDetail"/>  
    5. </list>     
    6. </property>     

    这样就可以达到与init一样的效果。 

    这三个问题,经过研究探索,现在都己经不是问题了。下面我简单说说这个三个问题的解决办法。 

    第一个问题:org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean报NotSerializableException异常,这个 spring bug 己经在http://jira.springframework.org/browse/SPR-3797找到解决方案,上面有牛人修改过的MethodInvokingJobDetailFactoryBean.java,详细源码请可以参考附件。哇塞,又可以POJO了。 
    Java代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">  
    3. <beans>  
    4.     <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    5.         <property name="dataSource" ref="dataSource"/>  
    6.         <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>  
    7.         <property name="configLocation" value="classpath:quartz.properties"/>       
    8.         <!--这个是必须的,QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动-->  
    9.         <property name="startupDelay" value="30"/>          
    10.         <!--这个是可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了-->  
    11.         <property name="overwriteExistingJobs" value="true"/>  
    12.         <property name="jobDetails" >  
    13.             <list>  
    14.                 <ref bean="jobDetail"/>  
    15.             </list>     
    16.         </property>             
    17.     </bean>      
    18.     <bean id="jobDetail" class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
    19.         <!--shouldRecover属性为true,则当Quartz服务被中止后,再次启动任务时会尝试恢复执行之前未完成的所有任务-->  
    20.         <property name="shouldRecover" value="true"/>  
    21.         <property name="targetObject" ref="customerService"/>  
    22.         <property name="targetMethod" value="testMethod1"/>  
    23.     </bean>      
    24. </beans>  

    注意 <bean id="jobDetail" class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">是修改过的MethodInvokingJobDetailFactoryBean。 

    第三个问题:从SchedulerServiceImpl 中去掉不需要的init() 方法,不用在SchedulerServiceImpl初始化后更新jobDeail。 

    Java代码  收藏代码
    1. @PostConstruct  
    2. public void init() throws SchedulerException{  
    3.     logger.info("init start....................");  
    4.     scheduler.addJob(jobDetail, true);    
    5.     logger.info("init end.......................");       
    6. }  


    第二个问题与第三个是互相关联的,我想到要解决这两个问题的一个方案是Job中不要包含SessionFactory就没一切OK了, 因为SessionFactory是hibernate dao的属性,而hibernate dao是SimpleService的属性,因此SimpleService不能有任何hibernate dao属性了。如此SimpleService业务方法里需要的hibernate dao又如何获取呢?对 spring 的了解,我们知道可以通过ApplicationContext获取到任何spring bean,但是在这里ApplicationContext又怎么获取呢? ... 查看org.springframework.web.context.ContextLoaderListener找到org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext()可以获取到ApplicationContext,增加一个SpringBeanService类,实现序列化接口,通过SpringBeanService可以获取到web己经加载的spring bean 
    Java代码  收藏代码
    1. package com.sundoctor.example.service;  
    2.   
    3. import java.io.Serializable;  
    4.   
    5. import org.springframework.context.ApplicationContext;  
    6. import org.springframework.stereotype.Service;  
    7. import org.springframework.web.context.ContextLoader;  
    8.   
    9. @SuppressWarnings("unchecked")  
    10. @Service("springBeanService")  
    11. public class SpringBeanService implements Serializable{  
    12.   
    13.     private static final long serialVersionUID = -2228376078979553838L;  
    14.   
    15.     public <T> T getBean(Class<T> clazz,String beanName){  
    16.         ApplicationContext context = ContextLoader.getCurrentWebApplicationContext();  
    17.         return (T)context.getBean(beanName);  
    18.     }  
    19. }  


    因为Hibernate Dao不再持久到Job中,所在不再需要实现序列化接口,可以继承HibernateDaoSupport,当然也可以不继承,可以根据自己喜好的方式编写,不再有任何限制 
    Java代码  收藏代码
    1. package com.sundoctor.example.dao;  
    2.   
    3. import org.hibernate.Session;  
    4. import org.slf4j.Logger;  
    5. import org.slf4j.LoggerFactory;  
    6. import org.springframework.orm.hibernate3.HibernateCallback;  
    7. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
    8. import org.springframework.stereotype.Repository;  
    9.   
    10. import com.sundoctor.example.model.Customer;  
    11. import com.sundoctor.example.service.CustomerService;  
    12.   
    13. @Repository("customerDao")  
    14. public class CustomerHibernateDao extends HibernateDaoSupport {  
    15.   
    16.     private static final Logger logger = LoggerFactory.getLogger(CustomerService.class);  
    17.   
    18.     public Customer getCustomer2() {      
    19.         return (Customer) this.getHibernateTemplate().execute(new HibernateCallback() {  
    20.             public Object doInHibernate(Session session) {  
    21.                 Customer customer = (Customer) session.createQuery("from Customer where id = 1").uniqueResult();  
    22.                 logger.info("Customer2={}", customer);  
    23.                 return customer;  
    24.             }  
    25.         });  
    26.     }  
    27.   
    28.     public Customer getCustomer1() {          
    29.         Customer customer = (Customer) this.getHibernateTemplate().get(Customer.class1);  
    30.         logger.info("Customer1={}", customer);  
    31.         return customer;  
    32.     }  
    33.   
    34. }  


    因为hibernate dao 不再实现序列化接口和继承自HibernateDaoSupport,不能再注入到业务类中了。在业务类中注入以上的SpringBeanService,业务方法需要的hibernate dao通过以上的SpringBeanService.getBean获取 
    Java代码  收藏代码
    1. package com.sundoctor.example.service;  
    2.   
    3. import java.io.Serializable;  
    4.   
    5. import org.slf4j.Logger;  
    6. import org.slf4j.LoggerFactory;  
    7. import org.springframework.beans.factory.annotation.Autowired;  
    8. import org.springframework.beans.factory.annotation.Qualifier;  
    9. import org.springframework.stereotype.Service;  
    10.   
    11. import com.sundoctor.example.dao.CustomerHibernateDao;  
    12. import com.sundoctor.example.model.Customer;  
    13.   
    14. @Service("customerService")  
    15. public class CustomerService implements Serializable {  
    16.   
    17.     private static final long serialVersionUID = -6857596724821490041L;  
    18.     private static final Logger logger = LoggerFactory.getLogger(CustomerService.class);  
    19.     private SpringBeanService springBeanService;  
    20.   
    21.     @Autowired  
    22.     public void setSpringBeanService(@Qualifier("springBeanService") SpringBeanService springBeanService) {  
    23.         this.springBeanService = springBeanService;  
    24.     }  
    25.   
    26.     public void testMethod1() {  
    27.         // 这里执行定时调度业务         
    28.         CustomerHibernateDao customerDao =springBeanService.getBean(CustomerHibernateDao.class,"customerDao");  
    29.         Customer customer = customerDao.getCustomer1();  
    30.         logger.info("AAAA:{}", customer);  
    31.   
    32.     }  
    33.   
    34.     public void testMethod2() {  
    35.         // 这里执行定时调度业务  
    36.         CustomerHibernateDao customerDao =springBeanService.getBean(CustomerHibernateDao.class,"customerDao");  
    37.         Customer customer = customerDao.getCustomer2();  
    38.         logger.info("BBBB:{}", customer);  
    39.     }  


    以上代码中hibernate dao 获取方法: 
    Java代码  收藏代码
    1. CustomerHibernateDao customerDao =springBeanService.getBean(CustomerHibernateDao.class,"customerDao")获取方法;  

    附件中的其它源码介绍可以参考《Quartz 在 Spring 中如何动态配置时间》http://www.iteye.com/topic/399980?page=1


    展开全文
  • 基于以上几点原因,我们迫切需要一个可以集中化管理、可配置定时任务管理器 但自己开发一套分布式定时任务系统何其复杂,所以作者采用crontab服务做辅助,使用php实现对定时任务配置管理 使用php管理...
  • Quartz任务监控管理 (1)

    2014-01-06 22:53:14
    Quartz任务监控管理,类似Windows任务管理器,可以获得运行时实时监控,查看任务运行状态,动态增加任务,暂停、恢复、移除任务等。对于动态增加任务,可以参加我前一篇文章《Quartz如何在Spring动态配置时间》...
    Quartz任务监控管理,类似Windows任务管理器,可以获得运行时的实时监控,查看任务运行状态,动态增加任务,暂停、恢复、移除任务等。对于动态增加任务,可以参加我的前一篇文章《Quartz如何在Spring动态配置时间》,本文在前文的基础上扩展,增加暂停、恢复、移除任务等功能,实现Quartz任务监控管理。 


    先看一下最终实现实现效果,只有两个页面 ,如下

    在这个页面查看任务实时运行状态,可以暂停、恢复、移除任务等


    在这个页面可以动态配置调度任务。


    实现任务监控,必须能将数据持久化,这里采用数据库方式,Quartz对任务的数据库持久化有着非常好的支持。我在这里采用quartz 1.6.5,在Quartz发行包的docs\dbTables目录包含有各种数据库对应脚本,我用的是MySql 5.0,所以选用tables_mysql_innodb.sql建表。

    建表完成后,配置数据库连接池,分两步:
    1、配置jdbc.properties文件
    Java代码
    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
    jdbc.username=root
    jdbc.password=kfs

    2.配置applicationContext.xml文件
    Java代码
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <list>
    <value>classpath:jdbc.properties</value>
    </list>
    </property>
    </bean>

    <!-- 数据源定义,使用c3p0 连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="initialPoolSize" value="${cpool.minPoolSize}"/>
    <property name="minPoolSize" value="${cpool.minPoolSize}" />
    <property name="maxPoolSize" value="${cpool.maxPoolSize}" />
    <property name="acquireIncrement" value="${cpool.acquireIncrement}" />
    <property name="maxIdleTime" value="${cpool.maxIdleTime}"/>
    </bean>

    配置Quartz,也分两步
    1、配置quartz. properties
    Java代码

    org.quartz.jobStore.misfireThreshold = 60000
    #org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
    org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
    org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    #org.quartz.jobStore.useProperties = true
    org.quartz.jobStore.tablePrefix = QRTZ_
    org.quartz.jobStore.isClustered = false org.quartz.jobStore.maxMisfiresToHandleAtATime=1

    在这里采用JobStoreTX,将任务持久化到数据中,而不再是简单的内存方式:RAMJobStore

    2、配置applicationContext-quartz.xml
    Java代码
    <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="dataSource" ref ="dataSource" />
    <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
    <property name="configLocation" value="classpath:quartz.properties"/>
    </bean>

    <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass">
    <value>
    com.sundoctor.example.service.MyQuartzJobBean
    </value>
    </property>
    <property name="jobDataAsMap">
    <map>
    <entry key="simpleService">
    <ref bean="simpleService"/>
    </entry>
    </map>
    </property>
    </bean>

    到些,相关配置全部完成,对于配置的具体描述,可以参加我的前一篇文章《Quartz如何在Spring动态配置时间》

    实现任务动态添加配置

    请参考com.sundoctor.quartz.service.SchedulerServiceImpl.java中的各种schedule方法,在《Quartz如何在Spring动态配置时间》有具体描述。在这里说一下:
    添加一个Job在表qrtz_job_details插入一条记录
    添加一个Simple Trigger在表qrtz_simple_triggers插入一条记录
    添加一个Cron Trigger 在表qrtz_cron_triggers插入一条记录
    添加Simple Trigger和Cron Trigger都会同进在表qrtz_triggers插入一条记录,开始看的第一个页面调度任务列表数据就是从qrtz_triggers表获取

    实现任务实时监控,暂停、恢复、移除任务等
    在com.sundoctor.quartz.service.SchedulerServiceImpl.java类中

    暂停任务
    Java代码
    public void pauseTrigger(String triggerName,String group){
    try {
    scheduler.pauseTrigger(triggerName, group);//停止触发器
    } catch (SchedulerException e) {
    throw new RuntimeException(e);
    }
    }

    恢复任务
    Java代码
    public void resumeTrigger(String triggerName,String group){
    try {
    scheduler.resumeTrigger(triggerName, group);//重启触发器
    } catch (SchedulerException e) {
    throw new RuntimeException(e);
    }
    }

    移除任务
    Java代码
    public boolean removeTrigdger(String triggerName,String group){
    try {
    scheduler.pauseTrigger(triggerName, group);//停止触发器
    return scheduler.unscheduleJob(triggerName, group);//移除触发器
    } catch (SchedulerException e) {
    throw new RuntimeException(e);
    }
    }


    其它类的实现请参加《Quartz如何在Spring动态配置时间》,那里有具体说明。

    到此,基本简单实现了Quartz任务监控管理。其实面这里只是实现了Trigger任务的监控管理,没有实现Job任务的监控管理,实现Job任务的监控管理跟Trigger差不多。用Quartz可以很方便实现多样化的任务监控管理,Trigger任务和Job任务都可进行分组管理。

    Quartz很强大,也很简单,只有想不到的,没有做不到的,人有多大胆,地有多高产。
    展开全文
  • Quartz任务监控管理(转)

    千次阅读 2011-03-10 14:13:00
    应网友sohuexe要求,做一个Quartz任务监控管理,类似Windows任务管理器,可以获得运行时实时监控,查看任务运行状态,动态增加任务,暂停、恢复、移除任务等。对于动态增加任务,可以参加我前一篇文章《Quartz...
  • 虽然我们天天戏称它为“Bug 10”,但不可否认是,从立项以来,开发团队就一直在努力为它加入新的功能,其中有不少是相当实用,比如说,他们在1709这个大版本中,为任务管理器加入了GPU性能监控单元,用户可以...
  • iis7远程控制:  最后在提一下,一款电脑远程监控的...完美的界面设计、强大的监控功能、稳定的系统平台,满足了用户实现远程桌面连接的需求。  1、分组功能。  2、导入文本格式选择,杜绝编码错误的发生。 ...
  • System Explorer是一款免费系统资源管理工具。...任务管理器所有的功能以外,它更可以控制电脑中所设定开机程序、 Internet Explorer 插件、系统服务、移除已经安装软件、察看被开启程序、监控网...
  • C#开发操作系统任务进程信息监控 CPU使用率 内存使用率 和操作系统的任务管理器功能基本相同。希望对大家有所帮助。
  • ScrapydWeb:用于Scrapyd集群管理的Web应用程序,支持Scrapy日志分析和可视化。 Scrapyd :cross_mark: ScrapydWeb :cross_mark: LogParser :open_book: 推荐读物 :eyes: 演示版 :star: 特征 查看内容 :...
  • System Explorer是一款免费系统资源管理...任务管理器所有的功能以外,它更可以控制电脑中所设定开机程序、 Internet Explorer 插件、系统服务、移除已经安装软件、察看被开启程序、监控网络使用情...
  • 好了,相信大家通过前面API Hook 专题系列文章学习,应该大概了解APIHook是一项什么样技术了。... 而Windows呢,则没有提供很好防止程序被关的功能,例如注册为服务,但是一样可以通过服务管理器关掉。 那么
  • linux 任务管理总结

    2017-03-05 19:57:57
    前言 最近一直在想linux系统一些基本管理,...window的任务管理器监控进程,cpu,memory等资源,关闭某些进程。对于linux而言需要知道其对于command。 进程查看,ps aux;top;pstree -A(树形显示)top -d 5 – 5秒
  • 在EWM模块中仓库管理员可以在监控...当然在项目中还会有很多客户化的需求在标准监控器的功能中是无法满足的,比如合并打印凭证等等,所以就必须自定义功能按钮来实现。 1. 在后台点击进入Define Object Class Me...
  • 游戏管理器

    2020-12-06 14:52:36
    游戏管理器 特点: 1.在成个游戏生命周期中存在 2.游戏中只能有一个GameManager 3.可以跟踪管理各个子系统状态 GameManager主要完成的任务 1.统一数据管理 2.游戏状态监控与更改 3.游戏行为更改 4.各种资源状态 5....
  • 任务流作用及功能

    2019-06-11 16:23:54
    目前支持组件任务有数据任务、远程命令执行、延时等。 2.为什么需要管理任务流」? 企业数据部门需要同时兼顾多方数据需求,需要一个平台可视化监控全部的任务流,并及时处理异常情况。DataPipeline希望能够...
  • Traffic Monitor是Windows平台上开源免费实时网络速度监视软件。类似于360助手“桌面浮动窗口”形式存在于桌面一角或嵌入在任务栏中。 显示当前网络速度(上传/下载速度)... 尽管“ Windows任务管理器...
  • 监控系统相关常见面试问题1. 什么是监控系统2....单一监控程序: win中的任务管理器,linux中top, vmstat, iostat等 分布式监控程序: zabbix, open-falcon 硬件监控:通过传感器 2. 为什么需要...
  • 随着微电子技术和计算机技术飞速发展,32位高性能、低功耗嵌入式微处理逐渐取代了传统8位单片机,采用多线程多任务的嵌入式操作系统依然成为发展趋势。  当前,嵌入式技术已经广泛应用到远程监控、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 457
精华内容 182
关键字:

任务管理器的监控功能