同时发送和接收

时间:2017-12-28 10:31:52

标签: citrus-framework

我正在尝试向JMS主题发送消息和从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>

似乎这些行动一个接一个地进行。问题是我的应用程序工作得非常快,当我向第一个主题发送消息时,它出现在&#34; toEndpoint&#34;几乎立即。因此,接收操作无法捕获适当的消息,因为它已经被处理过。

有没有办法同时进行此操作?

此致

1 个答案:

答案 0 :(得分:2)

关于使用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。请参阅有关JMS主题的Citrus文档:here