1

我们有一个要求,我们一次只需要向后端进程发送一条消息。这个过程的回调大约需要一个小时左右,只有在回调之后我们才能向该进程发送另一个请求。

我试图通过使用一个管理器 bpel 进程来实现这一点,如果后端已经有一些东西正在处理,它将首先保存消息,然后在它意识到后端是免费的时发送它。这种方法可行,但我们的架构师想要一个更清洁的解决方案。他建议使用 JMS 队列。这个想法是让 jms 队列中的消息一次由一个 amanger 读取,只有在我们收到来自后端的回调并且我们知道复合和 bpel 实例已完成时才移动到下一个。我已经在互联网上搜索了数周,但我找不到满足我要求的基于 jms 的有效解决方案。

我已经尝试过有关此链接的建议,但打开顺序单元和确认属性无济于事。

4

2 回答 2

1

试试这个方法!!使用事件驱动的 bpel 流程。

使用数据库标志作为您的下一个触发器。(标志为真)

  1. jms 适配器从队列接收第一条消息。这里使用适配器中的延迟,因为您希望 bpel 长时间运行。使用以下设置。

    <binding.jca config="MyServiceInboundQueue_jms.jca"> <property name="minimumDelayBetweenMessages">10000</property> <property name="singleton">true</property> </binding.jca>

  2. 如果 db 中的 flag == TRUE 会导致 db 适配器继续执行 bpel 进程,否则跳过 bpel。

  3. 标记标志==假
  4. 调用后端系统
  5. 一个小时后收到回调。
  6. 设置标志==真
于 2019-02-27T17:29:46.090 回答
0

嗨乔纳,

在我的公司,我们总是将 JMS 队列用于异步消息传递。例如,您可以在复合设置中使用延迟计时器构建为 1 小时 15 分钟,它在大多数情况下都可以工作,但它非常混乱。整个想法是让任何异步进程在将消息放在其队列目标(由 JMS 队列指定)上时启动。项目组合中的 JMS 适配器将在空闲处理队列时从队列中提取消息。您的目标是将消息放入队列并使用适配器从中提取消息。它将知道要接收哪条消息,因为您指定了它在适配器中侦听的队列。

John-Brown Evans 的以下博客文章说明了从第一步开始的整个过程。这可能有点乏味,但我发现它很有帮助。它使用 SOa Suite 11g 而不是现在更常用的 12c,但其基本原理保持不变。

很棒的 JMS 队列教程

我希望这对你有用!

干杯,

杰斯珀

于 2019-02-28T11:24:44.560 回答