网站定时任务,动态定时任务
谁能告诉我电脑怎么实现定时自动打开某个网页,然后自动点击网页中的一个按钮?
如果你会js的话建议使用 chrome插件?web-terminal??这个插件可以定义一些定时任务去指定网页执行一段js代码
使用方法:
安装插件
在任何一个网页连续按2下ctrl键 就能打开web-terminal
然后输入 js `console.log(123)` -u 这样就能打开百度网页
如何设置定时执行这段代码呢,可以使用cron命令
cron `00 50 22 * * *` "js `console.log(123)` -u " -a
此任务代表每天的22:50 分执行这段js代码 也就是定时打开百度网页了
如何在一个网站中定时执行一个任务
Quartz定时机制 首先导入jar包到程序内 quartz-all-1.6.0.jar 然后创建一个XML TimeConfig.xml 名字可以自己定义 //你要执行的任务类 //jar类 //将你的类添加到定时器当中 execute //定时执行类里面的哪个方法 0 0/5 * * * ? //定时的语法
各种ASP.NET定时执行任务解决方案收集
方法一
using System;
using System Data;
using System Configuration;
using System Collections;
using System Web;
using System Web Security;
using System Web SessionState;
using System Timers;
using System Net;
using System IO;
using System Text;
using System Threading;
namespace
{
public class Global : System Web HttpApplication
{
protected void Application_Start(object sender EventArgs e)
{
//定义定时器
System Timers Timer myTimer = new System Timers Timer( );
myTimer Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
myTimer Enabled = true;
myTimer AutoReset = true;
}
void myTimer_Elapsed(object source ElapsedEventArgs e)
{
try
{
Log SaveNote(DateTime Now ToString( yyyy MM dd HH:mm:ss ) + :AutoTask is Working! );
YourTask();
}
catch (Exception ee)
{
Log SaveException(ee);
}
}
void YourTask()
{
//在这里写你需要执行的任务
}
protected void Application_End(object sender EventArgs e)
{
Log SaveNote(DateTime Now ToString( yyyy MM dd HH:mm:ss ) + :Application End! );
//下面的代码是关键 可解决IIS应用程序池自动回收的问题
Thread Sleep( );
//这里设置你的web地址 可以随便指向你的任意一个aspx页面甚至不存在的页面 目的是要激发Application_Start
string url =
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest Create(url);
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest GetResponse();
Stream receiveStream = myHttpWebResponse GetResponseStream();//得到回写的字节流
}
}
}
原理 Global asax 可以是中应用程序或会话事件处理程序 我们用到了Application_Start(应用程序开始事件)和Application_End(应用程序结束事件) 当应用程序开始时 启动一个定时器 用来定时执行任务YourTask()方法 这个方法里面可以写上需要调用的逻辑代码 可以是单线程和多线程 当应用程序结束时 如IIS的应用程序池回收 让去访问当前的这个web地址 这里需要访问一个aspx页面 这样就可以重新激活应用程序 Log类是一个记录日志的一个类 下面是测试时生成的日志信息
================================================================
: : :AutoTask is Working!
: : :AutoTask is Working!
: : :AutoTask is Working!
: : :Application End!
: : :AutoTask is Working!
: : :AutoTask is Working!
从日志中发现 当手动回收IIS的应用程序池之后 计划任务还在执行 说明我们的目的达到了
如果将Application_End中的代码注释掉 会发现Application End之后 计划任务停止工作了 如下
================================================================
: : :AutoTask is Working!
: : :AutoTask is Working!
: : :AutoTask is Working!
: : :Application End!
局限性 可以解决应用程序池自动或者手动回收 但是无法解决IIS重启或者web服务器重启的问题 当然这种情况出现的时候不多 而且如果有人访问你的网站的时候 又会自动激活计划任务了
方案二
%@ Application Language= C# %
%@ import Namespace= System IO %
script runat= server
void Application_Start(object sender EventArgs e)
{
// 在应用程序启动时运行的代码
System Timers Timer myTimer = new System Timers Timer( );
myTimer Elapsed += new System Timers ElapsedEventHandler(OnTimedEvent);
myTimer Interval = ;
myTimer Enabled = true;
}
void Application_End(object sender EventArgs e)
{
//? 在应用程序关闭时运行的代码
}
void Application_Error(object sender EventArgs e)
{
// 在出现未处理的错误时运行的代码
}
void Session_Start(object sender EventArgs e)
{
// 在新会话启动时运行的代码
}
void Session_End(object sender EventArgs e)
{
// 在会话结束时运行的代码
// 注意: 只有在 nfig 文件中的 sessionstate 模式设置为
// InProc 时 才会引发 Session_End 事件 如果会话模式设置为 StateServer
// 或 SQLServer 则不会引发该事件
}
private static void OnTimedEvent(object source System Timers ElapsedEventArgs e)
{
//间隔时间执行某动作
//指定日志文件的目录
string fileLogPath = AppDomain CurrentDomain BaseDirectory + SystemLog ;
string fileLogName = SoftPrj_CN_ + DateTime Now ToLongDateString() + _log txt ;
//定义文件信息对象
FileInfo finfo = new FileInfo(fileLogPath + fileLogName);
//创建只写文件流
using (FileStream fs = finfo OpenWrite())
{
//根据上面创建的文件流创建写数据流
StreamWriter strwriter = new StreamWriter(fs);
//设置写数据流的起始位置为文件流的末尾
strwriter BaseStream Seek( SeekOrigin End);
//写入错误发生时间
strwriter WriteLine( 发生时间: + DateTime Now ToString());
//写入日志内容并换行
//strwriter WriteLine( 错误内容: + message);
strwriter WriteLine( 错误内容: );
//写入间隔符
strwriter WriteLine( );
strwriter WriteLine();
//清空缓冲区内容 并把缓冲区内容写入基础流
strwriter Flush();
//关闭写数据流
strwriter Close();
fs Close();
}
}
/script
方案三
%@ Application Language= C# %
%@ Import Namespace= System IO %
%@ Import Namespace= System Threading %
script RunAt= server
string LogPath;
Thread thread;
void WriteLog()
{
while (true)
{
StreamWriter sw = new StreamWriter(LogPath true Encoding UTF );
sw WriteLine(thread Name + : + DateTime Now ToString());
sw Close();
Thread CurrentThread Join( * );//阻止 秒
}
}
void Application_Start(object sender EventArgs e)
{
LogPath = HttpContext Current Server MapPath( log txt );??????? //在应用程序启动时运行的代码
thread = new Thread(new ThreadStart(WriteLog));
thread Name = 写登录日志线程 ;
thread Start();
}
void Application_End(object sender EventArgs e)
{
//? 在应用程序关闭时运行的代码
}
void Application_Error(object sender EventArgs e)
{
// 在出现未处理的错误时运行的代码
}
void Session_Start(object sender EventArgs e)
{
// 在新会话启动时运行的代码
}
void Session_End(object sender EventArgs e)
{
// 在会话结束时运行的代码
// 注意: 只有在 nfig 文件中的 sessionstate 模式设置为
// InProc 时 才会引发 Session_End 事件 如果会话模式设置为 StateServer
// 或 SQLServer 则不会引发该事件
}
lishixinzhi/Article/program/net/201311/13724
iis发布的网站怎么跑定时任务
可以再全局变量实现,不打开页面也可以
Global.asax
C# code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码 这里设置34个小时间隔 122400000 300000
System.Timers.Timer myTimer = new System.Timers.Timer(122400000);//修改时间间隔
//关联事件
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(AutoExec);
myTimer.AutoReset = true;
myTimer.Enabled = true;
}
/// summary
/// 定时执行的代码
/// /summary
private void AutoExec(object sender,System.Timers.ElapsedEventArgs e)
{
var webNewsAction = new WebApp.Common.WebNewsCollector();//新闻采集
webNewsAction.AutoInsert();
}
void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
//如果出错,删除下面代码
//下面的代码是关键,可解决IIS应用程序池自动回收的问题
System.Threading.Thread.Sleep(1000);
////这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start
////string url = "";
string url = "";
System.Net.HttpWebRequest myHttpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
System.Net.HttpWebResponse myHttpWebResponse = (System.Net.HttpWebResponse)myHttpWebRequest.GetResponse();
System.IO.Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流
//在此添加其它代码
}
几种主流的分布式定时任务,你知道哪些?
自从JDK1.5之后,提供了 ScheduledExecutorService 代替TimerTask来执行定时任务,提供了不错的可靠性。
Spring Framework 自带定时任务,提供了cron表达式来实现丰富定时任务配置。新手推荐使用 这个网站来匹配你的 cron表达式 。
单点的定时服务在目前微服务的大环境下,应用场景越来越局限,所以尝鲜一下分布式定时任务吧。
相较于之前两种方式,这种基于Redis的实现可以通过多点来增加定时任务,多点消费。但是要做好防范重复消费的准备。
将定时任务存放到ZSet集合中,并且将过期时间存储到ZSet的Score字段中,然后通过一个循环来判断当前时间内是否有需要执行的定时任务,如果有则进行执行。
具体实现代码如下:
适用场景如下:
优势是:
默认情况下Redis是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启。开启之后定时任务的代码如下:
Spring会监听符合以下格式的Redis消息
基于Redis的定时任务能够适用的场景也比较有限,但实现上相对简单,但对于功能幂等有很大要求。从使用场景上来说,更应该叫做延时任务。
场景举例:
优劣势是:
将定时任务作为单独的服务,遏制了重复消费,独立的服务也有利于扩展和维护。
依赖于MySQL,使用相对简单,可多节点部署,通过竞争数据库锁来保证只有一个节点执行任务。没有图形化管理页面,使用相对麻烦。
依赖于Zookeeper,通过zookeeper的注册与发现,可以动态的添加服务器。
依赖于Zookeeper,集群部署,可以动态的添加服务器。可以手动增加定时任务,启动和暂停任务。
国产,依赖于MySQL,基于竞争数据库锁保证只有一个节点执行任务,支持水平扩容。可以手动增加定时任务,启动和暂停任务。
微服务下,推荐使用xxl-job这一类组件服务将定时任务合理有效的管理起来。而单点的定时任务有其局限性,适用于规模较小、对未来扩展要求不高的服务。
相对而言,基于spring task的定时任务最简单快捷,而xxl-job的难度主要体现在集成和调试上。无论是什么样的定时任务,你都需要确保:
中间件可以将服务解耦,但增加了复杂度