Проблема с сервисом REST Camel при параллельных вызовах - PullRequest
0 голосов
/ 09 января 2019

Я создал службу REST с Apache Camel (REST DSL), работающим в контейнере Karaf, который принимает список элементов и возвращает их доступность. Проблема в том, что если служба вызывается параллельно, она не возвращает правильные результаты. Например, предположим, что у нас есть два следующих вызова:

Звоните 1 : item1, item2 Звоните 2 : item3, item4

Я бы ожидал следующих двух ответов

Ответ 1 : доступность элемента 1, доступность элемента 2 Ответ 2 : доступность элемента 3, доступность элемента 4

Но вместо этого я получаю два ответа со смешанными возможностями

Ответ 1 : доступность элемента 1, доступность элемента 2, доступность элемента 3, доступность элемента 4 Ответ 2 : доступность 1, доступность 2, доступность 3, доступность 4

Возможно, эта проблема возникает из-за связанного компонента, который у меня есть для службы, но позвольте мне дать вам обзор того, что я сделал в контексте верблюда.

<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: наличный , который выполняет эту работу. Я использую availableabilitiesBean , чтобы инициализировать объект ответа (Список), затем для каждого элемента запроса я получаю доступность из базы данных и помещаю результат в объект ответа, который был ранее инициализирован ( buildResponse ) и в конце я возвращаю этот объект методом getResponse .

Проблема в том, что бин имеет одноэлементную область видимости, и это означает, что для обоих вызовов используется один и тот же бин. Итак, вызов 1 записывает ответ для item1 и item2, но в то же время вызов 2 добавляет в ответ также item3 и item 4.

Есть ли возможность создать бин области действия запроса? Или использовать другой подход, чтобы преодолеть эту проблему?

Большое спасибо!

...