并行调用中的骆驼REST服务问题

时间:2019-01-09 08:54:42

标签: rest apache-camel singleton blueprint-osgi requestscope

我用在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?还是采用另一种方法来克服此问题?

非常感谢!

0 个答案:

没有答案