一次处理Oracle SOA JMS队列

时间:2019-02-07 08:25:13

标签: oracle jms soa bpel soa-suite

我们有一个要求,即一次只需要向后端进程发送一条消息。回叫过程大约需要一个小时,只有回叫后我们才能向该过程发送另一个请求。

我正在尝试通过使用经理bpel进程来实现此目的,该进程将首先保存消息(如果后端中已经处理了某些消息),然后在意识到后端可用时将其发送。这种方法行得通,但是我们的架构师想要一个更清洁的解决方案。他建议使用JMS队列。这个想法是让jms队列一次让陌生人读取消息,仅当我们从后端接收到回调并且知道复合和bpel实例完成后,才继续转到下一个消息。我已经在互联网上搜寻了好几周,但是找不到满足我需求的基于jms的解决方案。

我已经尝试过此link的建议,但是打开订单单位和确认属性没有任何作用。

2 个答案:

答案 0 :(得分:1)

尝试这种方法!! 使用事件驱动的bpel进程。

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

  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进程,   否则跳过世界。

  3. 标记flag == FALSE
  4. 调用后端系统
  5. 一个小时后收到回叫。
  6. 设置标志== TRUE

答案 1 :(得分:0)

您好,Jonar,

在我公司,我们始终使用JMS队列进行异步消息传递。您可以将延迟计时器构建为例如将复合时间设置为1小时15分钟,它在大多数情况下都可以工作,但它的效果令人感到混乱。整个想法是,将消息放入其队列目标(由JMS队列指定)时,任何异步过程都将启动。当项目组合中的JMS适配器可以自由处理队列时,它将从队列中提取消息。您的目标是将消息放在队列中,然后使用适配器从中提取消息。因为您指定了它在适配器中侦听的队列,它将知道要提取的消息。

以下约翰·布朗·埃文斯(John-Brown Evans)的博客文章阐述了第一步的整个过程。这可能有点乏味,但我发现它很有帮助。它使用的是SOa Suite 11g,而不是如今更常用的12c,但是其基本原理保持不变。

Awesome JMS queue tutorial

我希望这对您有用!

干杯

Jesper