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

Я пытаюсь отправить и получить сообщение с темами 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". Таким образом, операция приема не может перехватить соответствующее сообщение, поскольку оно уже обработано.

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

С уважением

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: здесь.

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