我用在Karaf容器上运行的Apache Camel(REST DSL)创建了一个REST服务,该服务接受一个项目列表并返回这些项目的可用性。问题在于,如果并行调用服务,则不会返回正确的结果。例如,假设我们有以下两个调用:
呼叫1 :item1,item2 呼叫2 :item3,item
我期望以下两个答案
响应1 :availableOfItem1,availableOfItem2 响应2 :availableOfItem3,availabilityOfItem4
但是相反,我得到了两个混合可用性的答案
响应1 :availabilityOfItem1,availableOfItem2,availabilityOfItem3,availabilityOfItem4 响应2 :availabilityOfItem1,availableOfItem2,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 来初始化响应对象(列表),然后对于每个请求项,我都从db获取可用性,并将结果放入先前初始化的响应对象( buildResponse ),最后我用方法 getResponse 返回该对象。
问题是bean具有单例作用域,这意味着对于这两个调用,使用相同的bean。因此,呼叫1为item1和item2写入答案,但同时呼叫2在响应中也添加了item3和item4。
是否可以创建请求范围bean?还是采用另一种方法来克服此问题?
非常感谢!