我正在使用 VS 2008 (C#) 开发一个网站。我目前的任务是开发一个应该执行以下任务的模块:
- 每15分钟一个进程需要与数据库通信,以了解是否有新用户通过注册添加到数据库中的“用户”表中
- 如果它找到一个新条目,它应该将该条目添加到一个 xml 文件(比如
NewUsers18Jan2009.xml
)。
为了实现这一点,以下哪一项最合适?
- 线程
- 视窗服务
- 其他
是否有任何样本可以证明这一点?
我正在使用 VS 2008 (C#) 开发一个网站。我目前的任务是开发一个应该执行以下任务的模块:
NewUsers18Jan2009.xml
)。为了实现这一点,以下哪一项最合适?
是否有任何样本可以证明这一点?
将此任务与您的网站分开。网站所做的一切都通过网络服务器。将逻辑放入类库中(以便将来需要广告按需检查时使用),并在控制台应用程序中使用该类。使用 Windows“计划任务”功能并将此控制台应用程序设置为每 15 分钟运行一次。这比通过 IIS 运行计划任务要好得多。
听起来您的任务没有任何 UI 部分。如果是这种情况,请使用 Windows 服务或计划的应用程序。我会选择一项服务,因为它更容易远程控制。
我在这里看不到与网站的连接...
为什么管理员需要每 15 分钟被 ping 一次?可怜的管理员!
我只需在您的用户表中的每个条目上放置一个时间戳,并创建一个快速报告,以允许管理员在需要时查询数据。
我认为你的方法是错误的。你应该做以下两件事之一:
Windows 服务将为您提供一个很好的解决方案 - 或者如果您使用 SQL Server,您可以从 SQL 代理作业触发这种处理。
如果您希望代码成为 Web 应用程序的“一部分”,您可以随时从心跳页面触发逻辑,该页面在调用 url 时运行您的任务 - 然后您可以从服务或代理作业轮询 url。
最简单的方法是在您的应用程序中的 Application_Start 上创建一个 System.Threading.Timer 并将其放在某个静态字段中,这样它就不会被收集。这样,您就可以让您的 Web 应用程序轮询数据库,而无需外部进程。当然,如果您的应用出现故障,计时器也会出现故障。对于轮询逻辑,只需保留最后一个 userId(如果您有增量策略)并通过过滤 WHERE id > lastId 检查新添加的用户。
由于您似乎将某一天的所有用户添加到单个 XML 文件(根据您的帖子),为什么您需要每 15 分钟执行一次?在午夜之后这样做一次还不够吗?
当你这样做时,最好是在 Windows 服务中(如果它必须每 15 分钟运行一次)或在计划在例如 0:15 小时运行一次的命令行应用程序中,你只需要检查“注册”用户的日期,如果过去一天有任何人注册,则将它们添加到列表中,并在处理表结束时将该列表导出到 XML 文件。
马克
创建一个新表(或文本文件)来存储您上次执行“新用户导出”的时间,或者另外仅查找上次导出文件的修改/创建日期。当您的脚本命中您的数据库时,请执行 SQL 命令以获取在上次导出时间之后创建的所有用户。为每个用户吐出新的 XML。
将此脚本设置为作为 Windows 计划任务/cron 作业/甚至可能是数据库触发器运行。
虽然我还投票支持创建 Windows 服务来为您执行此功能,但我认为最简单的方法是在您的“用户”表上放置一个触发器,该触发器会在插入用户时为您创建 xml 文件.
我赞同 Chuck 的回答 - 您可以使用 XML 查询从数据库中提取这些数据并直接发送,无需在系统上创建文件。