我有一个文件接收位置,它计划在一天中的特定时间运行。如果接收位置无法在该位置找到任何文件,我需要触发警报或邮件。
我知道我可以创建自定义组件,也可以使用 BizTalk 360 来执行此操作。但我正在寻找一些开箱即用的 BizTalk 功能。
BizTalk 不太擅长触发非事件。非事件是没有发生的事情,但仍然代表某种场景。
你可以做的是:
- 在自定义 SQL 表中插入触发接收位置的任何文件的文件名。
- 每天一次(计划任务适配器或通过存储过程轮询),您将触发对 SQL 表的查询,该查询仅在当天未创建记录的情况下创建一条消息。
还要考虑清理:该方法将要求您删除任何现有记录。
另一个选项可能是带有自定义 c# 程序的计划任务,该程序仅在没有输入文件等时才创建一个文件......
顺序车队解决方案应该有效,但我会担心几件事:
- 当其他订阅者关闭时,它可能会消耗好消息,这可能会导致您错过通常认为订阅失败的内容
- 长时间运行的业务流程可能难以管理和维护。 听起来这个会整天/整夜运行。
我喜欢彼得的建议,但我会扩展一下:
创建一个表,如下所示:
CREATE TABLE tFileEventNotify
(
ReceiveLocationName VARCHAR(255) NOT NULL primary key,
LastPickupDate DATETIME NOT NULL,
NextExpectedDate DATETIME NOT NULL,
NotificationSent bit null,
CONSTRAINT CK_FileEventNotify_Dates CHECK(NextExpectedDate > LastPickupDate)
);
还可以为此创建一个过程,每次收到该位置的文件(从自定义管道或业务流程)时都应调用该过程,如下所示
CREATE PROCEDURE usp_Mrg_FileEventNotify
(
@rlocName varchar(255),
@LastPickupDate DATETIME,
@NextPickupDate DATETIME
)
AS
BEGIN
IF EXISTS(SELECT 1 FROM tFileEventNotify WHERE ReceiveLocationName = @rlocName)
BEGIN
UPDATE tFileEventNotify SET LastPickupDate = @LastPickupDate, NextPickupDate = @NextPickupDate WHERE ReceiveLocationName = @rlocName;
END
ELSE
BEGIN
INSERT tFileEventNotify (ReceiveLocationName, LastPickupDate, NextPickupDate) VALUES (@rlocName, @LastPickupDate, @NextPickupDate);
END
END
然后,您可以创建一个具有以下Polling Data Available
语句的轮询端口:
SELECT 1 FROM tFileEventNotify WHERE NextPickupDate < GETDATE() AND NotificationSent <> 1
并编写一个过程以从该表生成消息,然后您可以将其映射到通过SMTP端口(或要使用的任何其他通知机制)发送的电子邮件。 您甚至可以向tFileEventNotify
添加列,例如EmailAddress
或SubjectLine
等。 您可能希望向表中添加一个字段以指示通知是否已发送,具体取决于轮询间隔的大小。 如果您希望每次都发送它,则可以忽略该部分。
一种选择是将 BAM 警报设置为在白天未收到文件时触发。
这是一个开箱即用的解决方案:BizTalk 服务器:检测丢失的消息
基本上,它是一个业务流程,侦听来自该接收端口的任何消息并重置计时器。 如果计时器过期,它可以执行某些操作。