Проблема с сервисом REST Camel при параллельных вызовах

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

Вызов 1: пункт1, пункт2 Вызов 2: пункт3, пункт 4

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

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

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

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

Вероятно, эта проблема возникает из-за связанного компонента, который у меня есть для службы, но позвольте мне дать вам обзор того, что я сделал в контексте 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>

Как вы можете заметить, когда сервис вызывается, он идет по прямому маршруту, который выполняет свою работу. Я использую availableabilitiesBean для инициализации объекта ответа (List), затем для каждого элемента запроса я получаю доступность из базы данных и помещаю результат в объект ответа, который был ранее инициализирован (buildResponse), и в конце я возвращаю этот объект с помощью метода getResponse.

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

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

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

0 ответов

Другие вопросы по тегам