2

我创建了一个 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?或者采用另一种方法来克服这个问题?

非常感谢!

4

0 回答 0