做一个B/S的项目,要求有30天试用期,如果试用期总时间Total达到limit(总时间限制)就停止Tomcat服务器要求用户输入SN号注册后才能再次使用。
   现在有两个问题:
   1、需要在Tomcat服务器使用期间,每隔30分钟就判断下当前时间是不是在上次验证的时间之后,如果是就将(当前时间-上次验证时间的差值)加到Total里,然后再判断Total总时间是否超过limit限制,如果超过就停止Tomcat服务器,如果没有,允许用户继续使用。
    我的操作:因为要用到定时触发,所以我用Quartz框架,没有用Spring,用了quartz的plugin ,用一个jobs.xml设置了一个CronTrigger 0 0/30 * * * ?。每隔三十分钟触发Job一次。
在测试时,我将机器的系统时间提前,按照逻辑判断,系统时间早于上次验证的时间,要停止Tomcat服务器,可是由于Quartz是按照时间的触发点触发事件的,没有到达触发的时间点的话,就会一直等待,这样Job中的逻辑判断就不能被执行,如此一来,用户启动Tomcat后,只要提前系统时间,就可以延长试用期限,直到触发时间到才进行逻辑判断。
    问题:如何防止用户修改机器时间来延长试用期?
 2没什么描述的:如何用Java实现对Tomcat服务的启动和关闭?
  个人感觉,用Runtime.getRuntime().exec("cmd.exe /c %CATALINA_HOME%\\bin\\shutdown.bat"),
    可我在环境变量里设置了CATALINA_HOME,用
Process proc = Runtime.getRuntime().exec("cmd.exe /c echo %CATALINA_Home%");
 BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = br.readline;
可结果却是:%CATALINA_HOME% ,但在命令提示符下能正常得到。
把:%CATALINA_HOME%直接写成绝对路径,仍然不行!
请大家给以帮助,如果讨论结果理想,会加分!!

解决方案 »

  1.   

    自己计时,增加一个时间控制表(只需要一个字段),用quartz执行,每一小时判断表中的小时字段是否等于30*24,如果不等于则加一,否则关闭服务器,也可以只让他访问公共资源(做法与验证session相似)。
    如果不是停服务器,登陆时,判断这个时间控制表。
      

  2.   

    怎么判断?
    这还是存在第一个问题啊!
    如果quartz的启动时间是2008-09-19 16:00:00
    用户将机器时间提前到2008-09-01 16:00:00那
    这段时间差quartz不会被触发,判断自然不能执行
      

  3.   

    1、直接在网上获取世界时间,或者访问你们的服务器某个链接返回时间,不直接获取系统时间。
    2、好像要加一个-c什么的参数的,忘记了,可以上google查一下。
      

  4.   

    public SimpleTrigger(String name, String group, int repeatCount,long repeatInterval)quartz 的trigger有一个构造方法是设置repeatInterval的,你只注册一个timer, 时间设在1970年前,每30s repeat一次就行了。用户不可能把时间改到1970年以前吧。
      

  5.   

    回6:
    你说的timer应该就是一个SimpleTrigger吧?
    时间设在1970前, 是不是SimpleTrigger.setStartTime(Date startTime) 
    您 可以试一下,如果startTime设在1970年,那永远也不会触发的,
    而且更改时间也是一样的问题
      

  6.   

    不知这样是否可行
    当给客户使用系统的时候,初始化到数据库里一个默认的时间,比如是0,然后quartz每隔30分钟执行一次,把0+30,然后存入数据库中,然后再过30分钟,再取出30+30,知道最后超过时间总和,提示。至于控制tomcat启动与关闭的,可以使用嵌入tomcat来实现,用java程序模拟实现server.xml中的各个节点。似乎很简单,网上有这样的资料
      

  7.   


    这样啊,那你可以把start time设成2007年。然后在你的顶目初始化的时候(或者是某个业务逻辑必经的方法内)比较一下系统时间,如果小于2007年就报错。
      

  8.   

    我的思路和您相似,我把时间存在系统文件中,可是仍然不能避免修改系统时间。
    只要修改了系统时间后,quartz就会一直等到下次的触发时间到了才会执行+30的操作,这样从用户修改的系统时间到quartz下一次的触发时间这段时间就不会被记录,也就相当于用户增加了试用时间。
    不过您说的tomcat方面我不太清楚,能详细点么?我的[email protected],可以的话,交流下。回10:
    如果quartz的start time比当前的时间早,那这个job就永远不会被触发!