BizTalk 2013 文件接收位置触发器上的非事件



我有一个文件接收位置,它计划在一天中的特定时间运行。如果接收位置无法在该位置找到任何文件,我需要触发警报或邮件。

我知道我可以创建自定义组件,也可以使用 BizTalk 360 来执行此操作。但我正在寻找一些开箱即用的 BizTalk 功能。

BizTalk 不太擅长触发非事件。非事件是没有发生的事情,但仍然代表某种场景。

你可以做的是:

  • 在自定义 SQL 表中插入触发接收位置的任何文件的文件名。
  • 每天一次(计划任务适配器或通过存储过程轮询),您将触发对 SQL 表的查询,该查询仅在当天未创建记录的情况下创建一条消息。

还要考虑清理:该方法将要求您删除任何现有记录。

另一个选项可能是带有自定义 c# 程序的计划任务,该程序仅在没有输入文件等时才创建一个文件......

顺序车队解决方案应该有效,但我会担心几件事:

  1. 当其他订阅者关闭时,它可能会消耗好消息,这可能会导致您错过通常认为订阅失败的内容
  2. 长时间运行的业务流程可能难以管理和维护。 听起来这个会整天/整夜运行。

我喜欢彼得的建议,但我会扩展一下:

创建一个表,如下所示:

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添加列,例如EmailAddressSubjectLine等。 您可能希望向表中添加一个字段以指示通知是否已发送,具体取决于轮询间隔的大小。 如果您希望每次都发送它,则可以忽略该部分。

一种选择是将 BAM 警报设置为在白天未收到文件时触发。

这是一个开箱即用的解决方案:BizTalk 服务器:检测丢失的消息

基本上,它是一个业务流程,侦听来自该接收端口的任何消息并重置计时器。 如果计时器过期,它可以执行某些操作。

最新更新