MQSCorrelationSetOrchestration(BizTalk Server 示例)

MQSCorrelationSetOrchestration 示例演示如何使用 MQSeries 相关标识符将发送至 MQSeries 队列的消息重新与正在运行的业务流程关联。 业务流程使用 MQMD_CorrelIdMQMD_MsgID 属性设置 MQSeries 相关标识符和消息标识符值。 MQSeries 队列管理器将 MessageID 值复制到消息的 CorrelationID 属性。

必备条件

此示例假定已在运行BizTalk Server的同一服务器上安装了 IBM WebSphere MQSeries。

本示例的用途

本示例将演示如何在发送至 IBM WebSphere MQSeries 服务器的消息中设置消息标识符和相关标识符。 这是一种可用于将消息重新与正在运行的业务流程实例关联的方法。 当 MQSeries 队列管理器收到消息时,它会将 MessageID 值复制到消息的 CorrelationID 属性。 然后,在业务流程中使用此 CorrelationID (MQMD_CorrelId) ,将 MQSeries 上的响应消息与用于将消息发送到 MQSeries 的实例相关联。

此示例的设计方式和原因

本示例将演示一个方案,在该方案中可以将业务流程正在处理的文档发送至 MQSeries 队列(可能用于其他处理),然后返回正在运行的业务流程。

本示例所在的位置

<Samples Path>\AdaptersUsage\MQSeriesAdapter\MQSCorrelationSetOrchestration

下表显示了本示例中的文件及其用途说明:

File 说明
MQSCorrelationSetOrchestration.btproj

MQSCorrelationSetOrchestration.sln
应用程序的项目和解决方案文件。
MQSCorrelationSetOrchestration.odx 应用程序的业务流程。
MQSCorrelationSetOrchestration.snk 强命名密钥文件。
Setup.bat 生成并初始化本示例。

如何使用本示例

如果作为整个工作流的其中一个步骤,您需要将消息发送至 MQSeries 服务器,请引入本示例中采用的逻辑。

通过 WebSphere MQ Explorer 创建 MQSeries 队列

  1. 单击“ 开始”,指向 “程序”,指向“ IBM WebSphere MQ”,然后单击“ WebSphere MQ 资源管理器”。

  2. 双击“ 队列管理器”,然后双击默认队列管理器。 默认队列管理器通常名为 QM_<machine_name> 其中 machine_name 是计算机的名称。

  3. 右键单击“ 队列”,指向“ 新建”,然后单击“ 本地队列”。

  4. 在“ 创建本地队列 ”对话框的“ 队列名称”中,键入“MQCorrelation”,然后单击“ 确定”。

创建接收位置和 MQSeries 队列

  1. 打开 BizTalk Server 管理控制台。

  2. 依次展开“BizTalk Server管理”、“BizTalk 组”、“应用程序”,然后展开所需的应用程序。

  3. 右键单击“ 接收端口”,指向“ 新建”,然后单击“ 单向接收端口”。

  4. “单向接收端口属性 ”对话框中的“ 名称 ”框中,键入“MQIn”,然后单击“ 确定”。

  5. 在左窗格中,单击“ 接收位置 ”选项卡,然后单击“ 新建”。

  6. 在“ 接收位置属性 ”对话框的“ 名称 ”框中,键入“MQIn”。

  7. 在“ 传输类型 ”框中,选择“ MQSeries”。

  8. 在“ 接收处理程序 ”框中,选择“ BizTalkServerApplication”。

  9. “接收管道 ”框中,选择“ Microsoft.BizTalk.DefaultPipelines.PassThruReceive”。

  10. 单击 “配置”

  11. 在“ MQSeries 传输属性 ”对话框的“ 轮询间隔 ”框中,键入“10”。

  12. 在“ 队列定义 ”框中,单击省略号 (...) 按钮。

  13. 在“ 队列定义 ”对话框的“ 服务器名称 ”框中,键入计算机名称。

  14. 在“ 队列管理器 ”框中,选择默认队列管理器。

  15. 在“ 队列 ”框中,键入“MQCorrelation”,然后单击“ 导出”。

  16. 在“ 导出 ”对话框中,单击“ 创建队列”,然后单击“确定”或“ 完成” ,直到退出所有对话框。

创建到 MQSeries 的发送端口

  1. 右键单击“ 发送端口”,指向“ 新建”,然后单击“ 静态单向发送端口”。

  2. 在“ 发送端口属性 ”对话框的“ 名称 ”框中,键入“MQOut”。

  3. 在“ 传输类型 ”框中,选择“ MQSeries”。

  4. 在“ 发送管道 ”框中,选择“ Microsoft.BizTalk.DefaultPipelines.PassThruTransmit”。

  5. 单击 “配置”

  6. 在“ MQSeries 传输属性 ”对话框的“ 队列定义 ”框中,单击省略号 (...) 按钮。

  7. 在“ 队列定义 ”对话框的“ 服务器名称 ”框中,键入计算机名称。

  8. 在“ 队列管理器 ”框中,选择默认队列管理器。

  9. 在“ 队列 ”框中,键入“MQCorrelation”,然后单击“ 确定”。

  10. 单击“ 确定” ,直到退出所有对话框。

启用接收位置并启动发送端口

  1. 在BizTalk Server管理控制台中,单击“接收端口”。

  2. 在详细信息窗格中,右键单击 MQIn 接收位置,然后单击 “启用”。

  3. 在详细信息窗格中,右键单击 MQOut 发送端口,然后单击 “启动”。

创建应用程序使用的文件夹

  1. C:\ 驱动器上,创建名为“temp”的文件夹(如果尚不存在)。

  2. C:\temp 目录下,创建名为“Pickup”和“Dropit”的文件夹。

生成和部署此示例

  1. 在命令窗口中,导航到下面的文件夹:

    <Samples Path>\AdaptersUsage\MQSeriesAdapter\MQSCorrelationSetOrchestration

  2. 运行 Setup.bat 文件,该文件将执行以下操作:

    1. 为项目创建强名称密钥。

    2. 编译并部署业务流程项目。

    3. 使用文件适配器创建发送端口和接收端口。

绑定并启动业务流程

  1. 在BizTalk Server管理控制台中,展开“业务流程”文件夹。

  2. 在详细信息窗格中,右键单击 MQSCorrelationSetOrchestration 业务流程,然后单击“ 绑定”。

  3. 将业务流程端口绑定到下列发送端口和接收位置:

    业务流程端口 消息传送端口/接收位置
    FileReceivePort MQSCorrelationSetOrchestration.FileReceivePort
    MQSeriesResponseReceivePort MQIn
    MQSeriesRequestSendPort MQOut
    FileSendPort MQSCorrelationSetOrchestration.FileSendPort
  4. 单击“ 主机”。

  5. 在“ 主机 ”框中,选择“ BizTalkServerApplication”,然后单击“ 确定”。

  6. “发送端口”中,右键单击“ MQSCorrelationSetOrchestration.FileSendPort”,然后选择“ 启动”。

  7. “接收位置”中,右键单击“ MQSCorrelationSetOrchestration.FileReceivePort ”,然后选择“ 启用”。

  8. 右键单击业务流程,然后单击“ 启动”。

    注意

    启动业务流程还将自动登记该业务流程。

测试应用程序

  1. 将文件放入 C:\Temp\Pickup 文件夹中。

  2. 检查 C:\Temp\Dropit 文件夹中的文件。

    注意

    如果禁用 MQIn 接收位置,可以在 WebSphere MQ 资源管理器中检查消息,并查看消息和相关标识符是否已设置。 为此,请启动 WebSphere MQ 资源管理器 并检查放置在 MQCorrelation 队列中的消息。 消息和相关标识符显示在“消息属性”对话框的“标识符”选项卡上。

    注意

    在生产方案中,您将希望为发送到 MQSeries 队列的每个消息分配一个唯一 ID。 可以通过修改业务流程中的表达式形状完成该操作。 更改以下行以将这些属性设置为唯一的 24 字节 ID:

    MQSeriesRequestSendMessageModified(MQSeries.MQMD_MsgId) = "111213141516171819202122232425262728293031323334";

    MQSeriesRequestSendMessageModified(MQSeries.MQMD_CorrelId) = "111213141516171819202122232425262728293031323334";

    如果要为这些属性设置唯一的 24 字节 ID,请参阅 为发送到 MQSeries 的消息创建唯一的 24 字节 ID 部分。

为发送到 MQSeries 的消息创建唯一的 24 字节 ID

  1. 在 Visual Studio 中创建新的 C# 类库项目。

  2. 将以下代码粘贴到该类的 .cs 文件中:

    using System;  
    using System.Collections.Generic;  
    using System.Text;  
    using System.Security.Cryptography;  
    
    namespace MQId  
    {[Serializable]  
        public class GetId  
        {  
            RNGCryptoServiceProvider randomCryptoString = new RNGCryptoServiceProvider();  
    
            public string getGuidstr()  
            {  
                byte[] newGuid = GetRandomData(24);  
                return ConvertToHex(newGuid);  
            }  
    
            private byte[] GetRandomData(int keySize)  
            {  
                byte[] randomData = new byte[keySize];  
                randomCryptoString.GetBytes(randomData);  
                return randomData;  
            }  
    
            private string ConvertToHex(byte[] key)  
            {  
                StringBuilder hexString = new StringBuilder();  
                for (int i = 0; i < key.Length; ++i)  
                {  
                    hexString.Append(String.Format("{0:X2}", key[i]));  
                }  
                return hexString.ToString();  
            }  
        }  
    }  
    
  3. 在项目属性“应用程序”页上指定 MQId的默认命名空间GetId程序集名称

  4. 指定强名称密钥文件以在项目属性“签名”页上对程序集 进行签名 ,然后生成项目。

  5. 使用全局程序集缓存工具 (gacutil.exe) 将编译的程序集加载到已编译 dll 文件的> GAC (gacutil /i < 名称) 。

  6. 对于本示例,在 BizTalk 项目中添加对 GetId 程序集的引用。

  7. 向本示例中使用的业务流程中添加两个变量:

    变量名(标识符) 类型
    GetId MQId.GetId
    strGuid System.String
  8. 将以下代码粘贴到本示例的业务流程中使用的表达式形状,该代码应该覆盖现有代码:

    GetId = new MQId.GetId();  
    strGuid = GetId.getGuidstr();  
    MQSeriesRequestSendMessageModified = MQSeriesRequestSendMessage;  
    MQSeriesRequestSendMessageModified(MQSeries.MQMD_MsgId) = strGuid;  
    MQSeriesRequestSendMessageModified(MQSeries.MQMD_CorrelId) = strGuid;  
    
  9. 停止并删除BizTalk Server管理控制台中的业务流程(如果已部署)。 然后按照 生成和部署此示例绑定并启动业务流程测试应用程序部分中的步骤进行操作。

    注意

    使用此方法为发送到 MQSeries 的消息创建唯一的 24 字节 ID 并不能够百分百保证所有发送的消息的 ID 唯一,但出现重复消息 ID 的可能性非常低。 如果业务需要百分百保证消息 ID 不重复,则您将需要使用另一个自定义代码来确保此功能。

本示例中使用的类或方法

本示例不显式使用任何类或方法。

另请参阅

使用“请求-答复”关联消息
MQSeries 适配器示例