65.9K
CodeProject 正在变化。 阅读更多。
Home

介绍 Boomerang 框架

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (8投票s)

2010年9月28日

CPOL

9分钟阅读

viewsIcon

40682

downloadIcon

230

Boomerang 框架简介

引言

在本文中,我将向您介绍 Boomerang 框架,并展示它如何帮助您构建通知/通信解决方案。

Boomerang 是一个面向专业开发人员和集成商的通知框架,提供稳固的面向服务的底层基础结构和快速开发界面。

背景

在企业环境中,总是需要自动化和改进业务流程和信息管理。各地的 IT 部门都被要求在资源有限或不变的情况下,更快地完成更多工作。

我们遇到的几乎每一个开发项目都要求进行通知、通信或信息分发,范围从简单的发货应用程序打印到技术支持中心的复杂电子邮件线程处理。

基于这些见解,我们着手构建一个灵活、快速且可靠的通知/通信框架,以消除复杂性。我们还希望提供一个面向服务的结构,以便在部署后轻松管理所有通知/通信解决方案。

关于 Boomerang

Boomerang 是一个软件框架,提供通过电子邮件、打印机、传真设备和文件通道分发的通信服务。Boomerang 通过为开发人员和系统集成商提供简单的 SQL 数据库接口来简化集成。Boomerang 可轻松与 Microsoft SQL 报表服务集成。它由 IT 专业人员为 IT 专业人员设计和开发。简单来说,您只需将记录插入通用的 SQL 表即可使 Boomerang“工作”。

Boomerang 的核心由一套强大的后台 Windows 服务组成,这些服务可以快速有效地处理每天数千个输出任务。每个服务都是多线程的,并处理特定的输出类型。有一个用于打印的服务、一个用于电子邮件的服务、一个用于传真,还有一个用于文件任务的服务。服务之间独立工作,尽管一个 Boomerang 任务可能包含多种输出类型。下图描绘了 Boomerang 服务的体系结构。

boomoverview.png

Boomerang 服务采用拉取技术,即数据库表以每个传递服务独立设置的时间间隔进行轮询。

使用 Boomerang

您的应用程序与 Boomerang 服务之间的交互通过数据库接口完成。这意味着任何编程语言都可以使用,只要它提供对 Microsoft SQL Server 的支持。您与 Boomerang 的通信方式完全相同,无论是 ASP.NET 应用程序、运行移动操作系统的条形码设备,还是通过 Ruby on Rails 连接的 TomCat 应用程序(如 Confluence)。

Boomerang 对象

Boomerang 实现的工作单元称为 **事件**。您可以将事件视为应用程序任务。事件由 `EVENT_MASTER` 表中的单个记录表示。这些事件记录不包含传递数据,但可能包含应用程序特定的键,用于将事件与生成它们的源关联起来。这些键的示例可能包括帮助台 ID、应用程序源 ID、客户订单号、客户潜在客户唯一标识符等。

每个事件包含一个或多个 **作业**。作业代表实际的传递单元,例如电子邮件或打印。每个作业声明其自身的传递数据。例如,打印作业至少需要定义一个适用的打印机路径。尽管一个事件由多个作业组成,但不能保证作业的触发顺序。由于 Boomerang 服务的多线程特性,它们很可能会在相应的事件记录被标记为“就绪”后立即同时触发。

某些作业可能会将数据扩展到一或多个辅助表中。例如,电子邮件作业在其单独的 `OUT_EMAIL_RECEPIENT` 表中列出目标收件人。

许多作业将包含 *内容* 或附件,为此设计了一个通用的存储表,名为 `EVENT_CONTENT`。例如,传真作业可能设置为通过传真传输 Microsoft SQL 报表服务报表,在这种情况下,事件内容表将包含相应的 URL 路径,其中已部署了 RDL 报表。

每个作业都在 `EVENT_STATUS` 表中维护其自身的 **状态* 和重复计划。该计划定义了作业是应立即触发还是等待特定时间延迟。它还定义了作业在失败时是否应重试,以及重试次数和间隔。

在处理作业时,无论结果如何,都会生成一个 *事件日志*。一些作业与目标设备建立反馈机制。例如,传真服务将根据从 Microsoft 传真服务器收到的通知来更改作业状态。电子邮件服务将监听来自 SMTP 中继代理的传递报告,并将其与原始电子邮件作业关联起来。

下图描绘了各种 Boomerang 对象(以及它们所托管的表)如何协同工作。

codepr1.jpg

您可以在 Fuel9 网站上找到 Boomerang 数据库的完整描述,该网站在本文底部提供。

基本流程

以下流程演示了如何通过 4 个简单步骤创建 Boomerang 分发。请跟我来,我们开始吧。

创建事件 | 第 1 步

在第一步中,您创建一个新的任务记录。只需在 `EVENT_MASTER` 表中插入一行新记录。`EVENT_MASTER` 中唯一必需的字段是 *gKey*(uniqueidentifier)。此记录将在后续步骤中将输出作业关联起来。`EVENT_MASTER` 中有几个列可用于帮助您组织和管理不同的任务。在本例中,我们将使用 *Created_By* 和 *Str1*。
例如:

------------------------------ Step 1 ---------------------------------------------
declare @gKey uniqueidentifier; set @gKey = newid();

Insert EVENT_MASTER (gKey, Created_By, Str1)
values (@gKey, 'domain\username', 'Weekly Sales Report')

另一个有用的字段可能是 *Source*。如果您维护一个环境中的应用程序列表,并为每个应用程序分配唯一的整数 ID,则 *Source* 列是引用您的应用程序的理想选择。

在上面的示例中,我们声明了一个局部 T-SQL 变量 *@gKey*,其类型已指定,并通过内置的 T-SQL *newid()* 函数为其赋值。我们将在后续步骤中使用此变量。如果您是 T-SQL 初学者,您可以通过在此网站上搜索找到许多关于 T-SQL 变量的有用文章。

创建作业 | 第 2 步

在第二步中,您选择目标,即电子邮件、打印或传真等。如上所述,这将被称为作业。根据作业目标,您将新作业插入到适当的表中。您的选项包括:`OUT_EMAIL`、`OUT_FAX`、`OUT_FILE` 或 `OUT_PRINT`。虽然字段会根据目标的性质略有不同,但作业键 *jKey* 和事件键 *gKey* 是通用的。在本例中,我们选择了发送电子邮件。
例如:

------------------------------ Step 2 ---------------------------------------------
declare @jKey uniqueidentifier; set @jKey = newid();

insert OUT_EMAIL (gKey, jKey, [ReplyTo], [From], Subject, Body)
values (@gKey, @jKey, 'Boomerang_account@domain.com',
'"e-mail display name" <Boomerang_account@domain.com>',
'Weekly Sales Report', 'Message body test test test' )

由于这是一个电子邮件作业,我们还需要为其添加收件人。您可以通过向 `OUT_EMAIL_RECEPIENT` 添加一行或多行来完成此操作。可选的 *Type* 列将收件人指定为 *To (默认)*、*Cc* 或 *Bcc*。电子邮件可以表示为简单的 SMTP 地址或完整的 SMTP 表示法,即 *"name" <email@domain.com>*。不要忘记传递作业引用键 *jKey*。
例如:

insert OUT_EMAIL_RECEPIENT (jKey, [Email])
values (@jKey, 'e-mail_address@domain.com')

添加内容 | 第 3 步

尽管是可选的,但可以轻松地将 SQL 报表服务报表附加到我们的电子邮件中。您可以通过向 `EVENT_CONTENT` 添加一行或多行来完成此操作。可以添加多个附件。与作业和事件类似,附件也由键 *aKey* 标识。如果要添加多个附件,请考虑传递您在以上步骤中使用的相同的 *gKey* 和 *jKey*。`EVENT_CONTENT` 设计用于容纳不同类型的作业,例如电子邮件、传真、打印和文件输出。
例如:

------------------------------ Step 3 ---------------------------------------------
declare @aKey uniqueidentifier; set @aKey = newid();

insert EVENT_CONTENT (gKey, jKey, aKey, Src_Type, Path, [Format])
values (@gKey, @jKey, @aKey, 2, 'SALES/Weekly Sales Report', 'PDF' ) 

默认情况下,报表将作为文件附加到您的电子邮件中。要将报表内联到 HTML 正文中,请向 `EVENT_CONTENT` 表的可选 *IsAttachment* 列传递 0(零)。

如果报表需要输入参数来控制其内容,请将这些参数添加到 `CONTENT_PARAMETER` 中。

例如:

insert CONTENT_PARAMETER (aKey, [Name], [Value]) values (@aKey, 'Week', '12')

释放任务 | 第 4 步

最后一步是释放我们的任务以进行处理。这可以通过更新 `EVENT_MASTER` 中的标志来完成。当在第 1 步插入记录时,*Status* 列默认为 -1(负一)。这指示 Boomerang 服务我们的事件正在处理中,因此暂时忽略。现在是时候将 *Status* 值设置为 0(零)了。
例如:

------------------------------ Step 4 ---------------------------------------------
update EVENT_MASTER set Status=0 where gKey=@gKey 

整个流程

将所有内容放在一起看起来会是这样的

---- Declare keys -----------------------------------------------------------------------
declare @gKey uniqueidentifier; set @gKey = newid();
declare @jKey uniqueidentifier; set @jKey = newid();
declare @aKey uniqueidentifier; set @aKey = newid();

---- New task ---------------------------------------------------------------------------
Insert EVENT_MASTER (gKey, Created_By, Str1)
values (@gKey, 'domain\username', 'Weekly Sales Report');

---- Create e-mail job ------------------------------------------------------------------
insert OUT_EMAIL (gKey, jKey, [ReplyTo], [From], Subject, Body)
values(@gKey, @jKey, 'Boomerang_account@servername.domain.com',
'"e-mail display name" <Boomerang_account@domain.com>',
'Weekly Sales Report', 'Message body test test test');

---- Add recipients to e-mail -----------------------------------------------------------
insert OUT_EMAIL_RECEPIENT (jKey, Email)
values (@jKey, 'e-mail_address@domain.com');

---- Add report attachment as a PDF to e-mail -------------------------------------------
insert EVENT_CONTENT (gKey, jKey, aKey, Src_Type, Path, [Format])
values (@gKey, @jKey, @aKey, 2, 'SALES/Weekly Sales Report', 'PDF');

---- Add parameters to report -----------------------------------------------------------
insert CONTENT_PARAMETER (aKey, [Name], [Value])
values (@aKey, 'Week', '12');

---- Release task to be processed -------------------------------------------------------
update EVENT_MASTER set Status=0 where gKey=@gKey;

本文的附件包含更全面的示例列表,并附有各种选项的说明。

存储过程

虽然 Boomerang 不要求,但存储过程是一种封装业务逻辑的便捷方式。它们可以驻留在 Boomerang 数据库或其他选定的数据库中,并且可以通过数据库触发器调用,也可以在 SQL Agent 计划上运行,或者直接从您的应用程序调用。有关如何管理存储过程的信息,请参阅 Microsoft SQL Server 文档或本网站上的相关文章。

事件调度

Boomerang 作业可以设置为延迟处理时间或在尝试失败后重试。此行为默认为服务设置,但可以通过 `EVENT_STATUS` 表为每个作业单独调整。

或者,您可以使用任何可用的调度工具,例如 Microsoft SQL Server Agent。有关 Microsoft SQL Agent 的更多信息,请参阅 Microsoft SQL Server 文档。

Boomerang 配置

Boomerang 服务附带 Microsoft 管理控制台 (MMC) 管理单元。您可以使用此管理单元配置重要的服务参数以及 Boomerang 数据库。您还可以管理 Boomerang 打印机和连接的传真服务器。Boomerang MMC 管理单元是为了方便您使用而提供的,尽管配置 Boomerang 服务并非必需。

Boomerang 配置组件实现为一个 DCOM Windows 服务。您可以通过支持 Automation 的脚本语言以 XML 格式执行几乎任何 Boomerang 配置任务。敬请期待另一篇关于如何从脚本语言配置 Boomerang 服务的文章。

许多 Boomerang 服务参数也可以通过直接操作 `SYSTEM_VARS` 表进行配置,在某些情况下可能需要重新启动相应的 Boomerang 服务。

监控事件

您可以通过检查 `EVENT_STATUS`(其中包含最后一个作业状态)或查看 `EVENT_LOG` 表来监控任务的进度。有 4 个关键字段可以帮助您识别任务的状态。

表格 Column 注释
EVENT_STATUS 状态 0 作业已就绪并等待处理
1 作业成功完成
2 作业完成时出错
3 作业正在进行中
EVENT_STATUS Closed 0 作业仍然打开,可能正在等待或正在进行中
1 将不再对该作业进行进一步处理
EVENT_LOG 类型 0 表示成功
1 表示逻辑错误,例如缺少收件人或打印机路径
2 表示系统错误,例如 SMTP 传输中断或与 Boomerang 数据库连接丢失
EVENT_LOG Message (文本) 错误描述或成功完成的描述

与系统错误(Type=2)不同,逻辑错误(Type=1)导致的作业将不会重试,无论任何设置,并且 `EVENT_STATUS` 中的任何任意设置都将被忽略。

以下 T-SQL 示例演示了如何获取每个事件的摘要

begin

declare @d datetime, @nxt datetime, @st int, @r int, @files int, _
	@emails int, @prints int, @faxes int, @info varchar(4000);
set @info = '';

-- get status and last processed date
select	@d = max(isnull(s.Processed_On,'')), 
	@st = max(isnull(s.Status,0)), 
	@r = max(isnull(s.Tried_Times,0)), 
	@nxt = max(isnull(s.Run_When,'')),
	@files = sum(isnull(fl,0)),
	@emails = sum(isnull(e,0)),
	@prints = sum(isnull(p,0)),
	@faxes = sum(isnull(fx,0))
from EVENT_MASTER m
left join EVENT_STATUS s on s.gKey=m.gKey
left join 
(
	select jKey,1 fl,0 e,0 p,0 fx from OUT_FILE union all
	select jKey,0 fl,1 e,0 p,0 fx from OUT_EMAIL union all
	select jKey,0 fl,0 e,1 p,0 fx from OUT_PRINT union all
	select jKey,0 fl,0 e,0 p,1 fx from OUT_FAX 
) t on t.jKey=s.jKey
where m.gKey=@gKey
group by m.gKey;

if( @files>0 ) set @info = @info + convert(varchar(10),@files) + ' files, ';
if( @emails>0 ) set @info = @info + convert(varchar(10),@emails) + ' e-mails, ';
if( @prints>0 ) set @info = @info + convert(varchar(10),@prints) + ' prints, ';
if( @faxes>0 ) set @info = @info + convert(varchar(10),@faxes) + ' faxes, ';

set @info = @info + case
	when (@d is null) then '-'
	when @st in (1) then 'last on ' + convert(varchar(50),@d,0)
	when @st in (2) then 'last on ' + convert(varchar(50),@d,0) + ', _
		tried ' + convert(varchar(10),isnull(@r,0)) + ' times'
	when @st in (0,3) then 'last on ' + convert(varchar(50),@d,0) + ', _
		tried ' + convert(varchar(10),isnull(@r,0)) + ' times' + ', _
		next retry ' + convert(varchar(50),@nxt,0)
	else '-' end;

select @info

end

参考文献

  • Boomerang 是 Fuel9 的注册商标。请访问 Fuel9 网站Wikipedia 了解更多关于 Boomerang 的信息。
  • CodeCharge 是 YesSoftware 的注册商标。
  • Confluence 是 Atlassian 的注册商标。

历史

  • 2010 年 9 月 27 日:初次发布
© . All rights reserved.