none
请教大家一个关于业务流程的问题 RRS feed

  • 问题

  •  

    这个流程是单实例运行的,死循环不断运行

    怎么在侦听形状里接收两个不同类型的消息

     

    流程中两个接收形状沿用相同的相关集但是编译不通过,报错“顺序保护中,端口类型必须相同”

     

    应该如何实现我的需求

    2008年8月28日 7:12

答案

  • 有几点看法:

    1. 从需求看,这个流程可能要接收同类型的消息,并使用同一个orchestration实例处理后续同类型的消息,这样的需求实际上构成了一个Sequential Convoys。
    2. 同样从需求看,流程还可能接收到不同的消息,也需要在同一个orchestration实例处理后续可能不同类型的消息,这样的需求实际上又构成了一个Parallel Convoys。
    3. Sequential Convoys和Parallel Convoys可以在同一个orchestration并存,但是它们不能共享同一个相关集,需要各自设定自己的相关集,这就意味着Sequential Convoys会激活一个orchestration实例并初始化Sequential Convoys的相关集,然后根据相关集初始化的条件接收后续的同类型消息,Parallel Convoys也会激活一个实例并初始化Parallel Convoys的相关集,然后根据相关集初始化的条件接受处理设置为同样相关集的别的接收端口进来的消息。最后的结果可能就是Sequential Convoys的消息运行一个实例,Parallel Convoys的消息运行在另一个实例。
    2008年8月28日 15:27
  • 问题已经解决了,就像图上画的那样,我做了以下改动:

    1.Receive3和Receive1使用同一个消息message1,Receive2使用另外一个消息message2.两个消息是不同类型的

    2.Receive3,Receive1,Receive2共同使用一个相关集,由Receive3来初始化相关集,Receive1和Receive2都来沿用相关集。Receive3,2,1都使用同一个逻辑端口。

    最后的结果是,当这个流程被启动后就会因为Loop1的存在而不停的运行,而loop2下面的listen1下面的两个分支,采用了实例订阅消息的方式,这样就使得当再次发送消息到此业务流程的时候不会再启动一个实例。这样就保证了单实例了。而之前要求在一个单实例内可以反复接收不同类型的消息的功能也实现了。

    2008年8月29日 2:37

全部回复

  • 问题应该出在Port_1到Receive_1的连接上,

    同一个端口消息被多次调用应该是不可行的.而且如果Receive_3已经接收了消息,那Receive_1处应该可以直接使用该消息,不需要重复调用..

    如果确实需要,建议换中方法实现.比如把Port_1的数据接收后再抛出,并以此抛出消息来触发Receive_1

    2008年8月28日 7:50
  • 从Port_1来的消息数目是不定的可能源源不断,所以用了实例订阅,那样做的目的是为了初始化相关集,同一个消息类型方便初始化。

     

    需求是:单实例运行流程如何接收两个不同类型的消息

    用死循环保证实例不断运行,用实例订阅保证单实例运行,用相关集保证实例订阅。

     

    还有什么方法可以实现需求?

    2008年8月28日 8:04
  • 问题其实是这样的:要做一个这样的流程,我们用一个流程接收几种不同类型的消息,然后分别对这几种不同类型的消息做不同的处理。同时一个很重要的功能是当我们接到了上述的任何一种类型的消息的同时,需要去启动一个循环,这个循环是不停止的。最终的目的是要让这个流程单实例运行。

    2008年8月28日 8:14
  • 有几点看法:

    1. 从需求看,这个流程可能要接收同类型的消息,并使用同一个orchestration实例处理后续同类型的消息,这样的需求实际上构成了一个Sequential Convoys。
    2. 同样从需求看,流程还可能接收到不同的消息,也需要在同一个orchestration实例处理后续可能不同类型的消息,这样的需求实际上又构成了一个Parallel Convoys。
    3. Sequential Convoys和Parallel Convoys可以在同一个orchestration并存,但是它们不能共享同一个相关集,需要各自设定自己的相关集,这就意味着Sequential Convoys会激活一个orchestration实例并初始化Sequential Convoys的相关集,然后根据相关集初始化的条件接收后续的同类型消息,Parallel Convoys也会激活一个实例并初始化Parallel Convoys的相关集,然后根据相关集初始化的条件接受处理设置为同样相关集的别的接收端口进来的消息。最后的结果可能就是Sequential Convoys的消息运行一个实例,Parallel Convoys的消息运行在另一个实例。
    2008年8月28日 15:27
  • 问题已经解决了,就像图上画的那样,我做了以下改动:

    1.Receive3和Receive1使用同一个消息message1,Receive2使用另外一个消息message2.两个消息是不同类型的

    2.Receive3,Receive1,Receive2共同使用一个相关集,由Receive3来初始化相关集,Receive1和Receive2都来沿用相关集。Receive3,2,1都使用同一个逻辑端口。

    最后的结果是,当这个流程被启动后就会因为Loop1的存在而不停的运行,而loop2下面的listen1下面的两个分支,采用了实例订阅消息的方式,这样就使得当再次发送消息到此业务流程的时候不会再启动一个实例。这样就保证了单实例了。而之前要求在一个单实例内可以反复接收不同类型的消息的功能也实现了。

    2008年8月29日 2:37
  • 上面这么做,保证了单实例,不过这个需求“同时一个很重要的功能是当我们接到了上述的任何一种类型的消息的同时,需要去启动一个循环”没有得到满足,实际上只有message1这个类型的消息可以启动流程。

    2008年8月29日 3:05
  •  

    你提到的这个需求确实没有做到,不过对于我们来说我上面的做法已经满足要求了。但是有没有办法在做到你提到的这个功能呢?麻烦你给点建议!谢谢

    2008年8月29日 3:15
  •  

    需求“同时一个很重要的功能是当我们接到了上述的任何一种类型的消息的同时,需要去启动一个循环”是你前面的帖子里提的,我觉得这个需求可能做不到。
    2008年8月29日 3:28
  •  

    以上是Young85 做的改进

    2008年8月29日 9:30