Одновременная отправка и получение

Я пытаюсь отправлять и получать сообщения в темы JMS и из них.

<testcase name="DeliveryToPT3PLIT">
        ...
        <actions>
            ...              
            <send endpoint="fromEndpoint">
                <message>
                    <resource file="com/roche/icc/citrus/messages/input/PT-3PLWoBatchSplit.xml"/>
                </message>
                <header>
                    ...
                </header>
            </send>

            <receive endpoint="toEndpoint">
                <description>Receive asynchronous message from topic</description>
                <message>
                        <resource file="com/roche/icc/citrus/messages/output/PT-3PLWoBatchSplit.xml"/>
                </message>
                <header>
                    ...
                </header>
            </receive>
        </actions>
    </testcase>

Кажется, что эти операции идут одна за другой. Проблема в том, что мое приложение работает очень быстро, и когда я отправляю сообщение в первую тему, оно почти сразу появляется на "toEndpoint". Таким образом, операции приема не удается поймать соответствующее сообщение, поскольку оно уже обработано.

Есть ли способ сделать эти операции одновременно?

С Уважением


person Gandalf    schedule 28.12.2017    source источник


Ответы (1)


При использовании тем JMS следует отметить одну вещь, поскольку они работают в режиме публикации/подписки, вы должны сначала подписаться, чтобы получить сообщение.

Это означает, что вам нужно подписаться на тему, прежде чем сообщение будет опубликовано. Кроме того, если вы говорите, что ваше приложение работает быстро, вам может потребоваться подождать несколько миллисекунд перед отправкой сообщения. Вот пример Java DSL того, что, я думаю, может сработать для вас. (Примечание: я протестировал этот пример с темой JMS)

parallel().actions(
    sequential().actions( // Thread #1
            ...
            receive(action -> action.endpoint(toEndpoint).payload("message to be received"))),
    sequential().actions( // Thread #2
            sleep(500),
            send(action -> action.endpoint(fromEndpoint).payload("message to be sent"))));

Обратите внимание на контейнер действий parallel(). Он будет выполнять каждое действие внутри него в отдельном потоке. Каждый sequential() представляет серию действий, что позволяет сгруппировать их вместе. Поскольку оба контейнера sequential() находятся внутри parallel(), действия внутри каждого из них будут выполняться в разных потоках.

Итак, что здесь происходит: вы разделяете свои действия на два потока. В первом потоке вы ждете сообщения. Во втором потоке вы сначала переводите его в спящий режим на 500 миллисекунд, после чего отправляете сообщение.

Мне жаль, что у меня нет примера XML, но я все равно надеюсь, что это поможет.

Также не забудьте установить для свойства pub-sub-domain значение true на ваших конечных точках. См. документацию Citrus по темам JMS: здесь.

person Liviu Ilea    schedule 28.12.2017
comment
Спасибо за предложение! Оно работает! XML будет выглядеть так: ‹действия›‹параллельные›‹последовательные›‹получение›...‹/получение›‹/последовательные›‹последовательные›... - person Gandalf; 28.12.2017