我创建了一个 REST 服务,其中运行在 Karaf 容器上的 Apache Camel (REST DSL),它接受项目列表并返回这些项目的可用性。问题是如果服务被并行调用,它不会返回正确的结果。例如,假设我们有以下两个调用:
呼叫 1:项目 1、项目 2 呼叫 2:项目 3、项目 4
我希望有以下两个答案
响应 1:availabilityOfItem1,availabilityOfItem2 响应 2:availabilityOfItem3,availabilityOfItem4
但不是那样,我得到的是混合可用性的两个答案
响应 1:availabilityOfItem1、availabilityOfItem2、availabilityOfItem3、availabilityOfItem4 响应 2:availabilityOfItem1、availabilityOfItem2、availabilityOfItem3、availabilityOfItem4
可能由于我为该服务拥有的相关 bean 会出现此问题,但让我概述一下我在 Camel 上下文中所做的工作。
<camelContext>
<restConfiguration ... />
<rest path="/" consumes="application/json" produces="application/json">
<post uri="/availabilities" type="com.xxx.ArticleListReq">
<to uri="direct:availabilities"/>
</post
</rest>
<route id="route.Availabilities">
<from uri="direct:availabilities"/>
<bean ref="availabilitiesBean" method="init"/>
<split parallelProcessing="true">
<simple>${body.articles}</simple>
...
SQL calls for each item
<bean ref="availabilitiesBean" method="buildResponse"/>
</split>
<bean ref="availabilitiesBean" method="getResponse"/>
</route>
</camelContext>
正如您所注意到的,当服务被调用时,它会转到执行该工作的direct:availabilitie路由。我使用availabilitiesBean来初始化响应对象(List),然后对于每个请求项,我从db获得可用性并将结果放入先前初始化的响应对象(buildResponse),最后我返回该对象使用方法getResponse。
问题是 bean 有一个单例范围,这意味着对于两个调用都使用相同的 bean。因此,调用 1 写入了 item1 和 item2 的答案,但同时调用 2 在响应中添加了 item3 和 item 4。
是否有可能创建请求范围 bean?或者采用另一种方法来克服这个问题?
非常感谢!