Apache Camel Multicast notifyBuilder失败

时间:2014-12-16 14:53:20

标签: apache-camel

由于某种原因,QUEUE_A并不总是有1个交换 - 有时它有0,除非我在测试中添加一个Thread.sleep(100)。我想当完成时/当完成它实际上已经完成时完全没有完成。如何验证它是否完全完成?

multicast().parallelProcessing().to(QUEUE_A, QUEUE_B, QUEUE_C, QUEUE_D)

测试:

@Test
public void test() {
    NotifyBuilder notify = new NotifyBuilder(context)
            .from(QUEUE_INCOMING)
            .whenCompleted(1)
            .create();
    template.sendBody(QUEUE_INCOMING, streamToString(loadResourceAsStream("/data/TestData.xml")));

    boolean matches = notify.matches(4, SECONDS);
    assertTrue("Notify failed", matches);
    Thread.sleep(100); //Without this, it fails 

    verifyEndpoints(1, context, QUEUE_A, QUEUE_B, QUEUE_C, QUEUE_D);
}

public static void verifyEndpoints(int expectedSize, ModelCamelContext context, String... endpoints) {
    for (String endpoint : endpoints) {
        BrowsableEndpoint be = context.getEndpoint(endpoint, BrowsableEndpoint.class);
        assertThat(String.format("Endpoint exchanges '%s' has wrong size", endpoint), be.getExchanges(), hasSize(expectedSize));
    }
}

端点bean,在测试时使用ActiveMQ,但将在prod中使用WebSphere MQ:

<bean id="wmq" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory">
      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="vm://localhost?broker.persistent=false" />
      </bean>
    </property>
</bean>

1 个答案:

答案 0 :(得分:1)

问题是你在向它发送消息之后尽快浏览WMQ,因此根据代理实现和时间等,当使用JMS浏览api时,你可能看不到最后的消息。

因此,当你等待睡眠时,为什么它似乎会解决。