客户端运行服务器端程序
服务器端有个数据爬虫,本身会定时运行。但是有时候客户端需要立即在服务器端运行该爬虫程序。
<解决办法一>有个非即时性的解决办法,就是用客户端将需求写入一个任务表中,服务器定时扫描该表,有任务就执行。可以在任务计划程序中定义一个计划,每分钟扫描一次任务表。但是有时候一分钟的交互仍然较长,开始思考有没有更即时的方案。
<解决办法二>尝试写一个网页,在客户端将任务post过去,在客户端运行。但是爬虫在运行时,总是会报一个“远程服务器强制关闭了一个连接”的错误。不确定是否是该爬虫所连接的服务器本身的限制,暂未深度研究。
<解决办法三>于是开了个脑洞,仍然是将需求写入一个任务表中,然后通过触发器运行爬虫程序。但是SQL SERVER运行程序第一需要足够权限,这个方案不安全;第二是会等待爬虫程序结束,且不能有任何交互。限制仍然较多。于是想到用触发器来定制一个SQL SERVER的作业,并且在该作业中设置完成后写入WINDOWS应用程序日志。
然后在任务计划程序中定义触发器为“发生事件时”,该事件即SQL SERVER发送的通知级事件,事件来源选择SQLSERVERAGENT即可。
难点在于触发器如何定制SQL SERVER作业。在此给出触发器的定义(注意要先新建一个名为WindowsEventWritter的作业):
SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE name = 'WindowsEventWritter' SELECT @date = CONVERT(char(8),DATEADD(s,20,GETDATE()),112), @time = REPLACE(CONVERT(varchar(10),DATEADD(s,20,GETDATE()),8),':','') EXEC msdb.dbo.sp_add_jobschedule @job_id = @jobId, @name = 'InstantCall', @enabled = 1, @freq_type = 1, @freq_interval = 0, @freq_subday_type = 0, @freq_subday_interval = 0, @freq_relative_interval = 0, @freq_recurrence_factor = 0, @active_start_date = @date, @active_end_date = 99991231, @active_start_time = @time, @active_end_time = 235959
注意这里的作业运行计划推迟了20秒,是因为如果直接用GETDATE(),那么该计划可能无法被启用(因为超过了当前时间)。