业务流程中的BizTalk ESB工具包动态路由

时间:2009-12-01 13:30:57

标签: biztalk esb-toolkit-2.0

我正在尝试通过调用接收管道从业务流程内执行动态行程路由,就像提供的ItinerarySelectReceiveXml重新接收端口一样,来解析给定消息的行程并将其发送到ESB路由的直接绑定端口。该设置类似于ComposedMessageProcessor BizTalk示例。

我的接收管道酷似ItinerarySelectReceiveXml,据我所看到的,除了ESB行程选择器管道组件上(在ResolveParty阶段)我硬编码连接字符串和ItineraryFactName(例如BRI:\政策= MyResolveItineraryRule; useMsg = true; recognMessageFormat = true;和Resolver.Itinerary)这样我就不必使用环回适配器来进行额外的消息框访问。

从表达式形状调用接收管道的代码如下:

//我想要路由的第一条消息只是我传入消息的一个节点

strXPath = "/*[local-name()='BeginConversationMessage' and namespace-uri()='http://MyCompany.BeginConversationMessage.v001']/*[local-name()='BeginConversationMessage' and namespace-uri()='http://MyCompany.BeginConversationMessage.v001']";
BeginConversationMessage = xpath(InboundMsg, strXPath);
RcvPipeOutput = Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteReceivePipeline(typeof(MyCompany.Itinerary_GenericSelector), BeginConversationMessage);

这很顺利,我可以看到正在使用SQL事件探查器解析消息类型的正确行程,我知道行程很好,因为我将它用于此消息类型,并且具有通用行程入口。< / p>

但是我却越来越偏离我的Microsoft.Practices.ESB.Itinerary.PipelineComponents.ItinerarySelector之后有Microsoft.Practices.ESB.PipelineComponents.Dispatcher异常(在解决晚会舞台)

在文档状态下ESB行程选择器管道组件应该使用以下属性中设置的行程的微软的BizTalk Server段:correlationToken,reqRespTransmitPipelineID,interchangeId,receiveInstanceId,epmRRCorrelationToken

例外情况如下:

值不能为空。 参数名称:interchangeId

来源:Microsoft.Practices.ESB.PipelineComponents.Dispatcher

方法:Microsoft.BizTalk.Message.Interop.IBaseMessage执行(Microsoft.BizTalk.Component.Interop.IPipelineContext,Microsoft.BizTalk.Message.Interop.IBaseMessage)

错误来源:Microsoft.Practices.ESB.Itinerary.OM.V1

错误TargetSite:System.Object [] GetItineraryDataForBAM(Microsoft.Practices.ESB.Itinerary.OM.V1.Itinerary,Microsoft.Practices.ESB.Itinerary.IItineraryStep,System.String)

错误StackTrace:at Microsoft.Practices.ESB.Itinerary.OM.V1.BAMItineraryProcess.GetItineraryDataForBAM(行程安排,IItineraryStep步骤,String interchangeId)    在Microsoft.Practices.ESB.Itinerary.OM.V1.BAMItineraryProcess.SubmitToBAM(行程安排,IItineraryStep步骤,IPipelineContext上下文,IBaseMessage消息)    在Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1。&lt;&gt; c__DisplayClassa.b__8()    在Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.AdvanceByOrder(ItineraryMessageDirection messageDirection,String serviceInstanceId,IItineraryStep step,Action submitToBam,Boolean advanceStep)    在Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.Advance(IBaseMessage消息,IPipelineContext上下文,IItineraryStep步骤,Boolean advanceStep)    在Microsoft.Practices.ESB.Itinerary.OM.V1.ItineraryV1.Advance(IBaseMessage消息,IPipelineContext上下文,IItineraryStep步骤)    在Microsoft.Practices.ESB.PipelineComponents.Dispatcher.Execute(IPipelineContext context,IBaseMessage msg)

任何帮助都将不胜感激。

P.S。我还在http://social.msdn.microsoft.com/Forums/en/biztalkesb/thread/28c5befe-4c7f-4dc1-a5e7-8fe5b3ec1c75

将此问题发布到ESB工具包表单中

1 个答案:

答案 0 :(得分:1)

首先,我认为关键是要保留原始邮件的上下文。从管道接收消息时,您需要在构造形状中使用以下语法,以便恢复上下文:

PipelineMessage = null;

RcvPipeOutput = Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteReceivePipeline(
    typeof(MyCompany.Itinerary_GenericSelector), BeginConversationMessage);

RcvPipeOutput.MoveNext();
RcvPipeOutput.GetCurrent(PipelineMessage);
PipelineMessage(*) = BeginConversationMessage(*)

实际上,在业务流程中的中间消息构造期间context of the message needs to be preserved at all times。此外,在离开业务流程之前提升正确的上下文属性非常重要。

这可以通过在业务流程中初始化最后一个发送形状的相关性来完成。确保关联包括正确的属性,包括错误消息中提到的属性。