支持批处理的接收适配器的接口

接收适配器总是成批提交消息。 批是一个可用于除提交以外的各种操作的数据库操作单位。 例如,接收适配器可以在同一批中提交一组消息,挂起一组消息,并删除另外一组消息。 将这些单独的操作放在同一批中可以尽可能减少所需的数据库往返次数,优化性能,因而是一种大力提倡的做法。

进程内的和独立的接收适配器需要实现以下接口才能将各批消息提交到服务器上:

  • IBTTransport

  • IBTTransportControl (进程内适配器仅)

  • IBTTransportConfig

  • IBaseComponent

  • IPersistPropertyBag

  • IBTBatchCallBack

    以下步骤说明接收适配器在向服务器提交消息时进行的一系列操作。

  1. 接收适配器通过调用 IBTTransportProxy 接口的 GetBatch 方法从传输代理获取批。 在调用 GetBatch 时,适配器传入指向其 IBTBatchCallback 接口实现的指针。

  2. 适配器通过调用 IBTTransportBatch 接口的 SubmitMessage 方法,将消息一次一个添加到批处理中。 如果这是双向操作(如 solicit-response messaging),则调用此同一接口的 SubmitResponseMessage 方法来提交响应消息。

  3. 将所有消息添加到批处理后,适配器会调用 IBTTransportBatch 接口的 Done 方法,将批处理提交到传输代理。 由于接收适配器本质上是异步的,因此适配器可以立即获取新批,并在调用 “完成”后开始提交其他消息。

  4. 处理批处理后,消息引擎使用传输代理调用适配器的 BatchComplete 回调方法,以便进行实际调用。 包含提交状态的 BTBatchOperationStatus 对象的数组将传递到适配器。 每个对象对应于一个操作类型,包含操作的总体状态以及操作所针对的每个消息的状态。 以下系列步骤说明适配器在分析批处理状态时需要进行的操作:

    1. 检查作为参数传递给 BatchComplete 方法的总体批处理状态 HRESULT 值。 如果该值显示错误,则意味着批中至少有一个操作不成功。 因此整个批作为一个实体提交失败。 之后适配器应尝试发现有问题的消息,并只将原来未造成错误者作为一批重新提交。

      如果总体批状态为成功,则意味着提交给传输代理的所有消息都已保留到磁盘上。 然而,这并非意味着管道已成功处理了所有消息。 可能会有在管道中失败的消息被挂起。 对于在管道中失败的消息,由于数据已写入磁盘,所以返回的总体批状态是成功的。

    2. 检查 参数中 operationStatus 每个操作类型的状态。 如果状态为S_OK,则此操作的提交成功,无需进一步检查状态。 如果状态设置为 BTS_S_EPM_MESSAGE_SUSPENDED 部分消息已暂停。 BTS_S_EPM_SECURITY_CHECK_FAILED 表示某些消息在需要身份验证的接收端口中进行身份验证失败。 如果返回 E_FAIL ,或者返回值小于零的任何 HRESULT,则此操作的消息提交将失败。

    3. 检查操作类型的各个消息的状态。 对于提交操作类型,如果提交成功,则每条消息的状态设置为 S_OK 。 如果消息已暂停,则返回BTS_S_EPM_MESSAGE_SUSPENDED。 如果消息在需要身份验证的接收端口上进行身份验证失败,则返回BTS_S_EPM_SECURITY_CHECK_FAILED。 如果已发布的消息没有订阅者,则E_BTS_NO_SUBSCRIPTION返回。 如果返回 E_FAIL ,或者返回值小于零的任何 HRESULT,则消息提交失败。

    4. 根据你的适配器,你可能希望挂起返回 E_FAIL 或任何失败的 HRESULT 的消息。

  5. BatchComplete 方法需要返回S_OKE_FAIL以指示执行结果。 如果 BatchComplete 方法返回 E_FAIL 或任何负 HRESULT,则传输代理将记录错误。

    下图显示在创建支持批处理的接收适配器时的对象交互。

    显示创建批处理支持的接收适配器所涉及的对象交互的图像。
    接收适配器提交一批消息的工作流

另请参阅

适配器变量
开发接收适配器
实例化和初始化接收适配器
进程内接收适配器的接口
独立接收适配器的接口
支持批处理的事务性接收适配器的接口
同步请求-响应接收适配器的接口