当前位置: 首页 > 知识库问答 >
问题:

Apache Camel多播notifyBuilder失败

葛修真
2023-03-14

出于某种原因,QUEUE_A并不总是有1个交换--有时它有0,除非我在测试中添加一个thread.sleep(100)。我猜WhenCompleted/WhenDone并不是完全完成,实际上它说它已经完成了。我怎样才能验证它是完全完成的?

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));
    }
}

和endpointbean,在测试时使用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个答案

全飞扬
2023-03-14

问题是,在向WMQ发送消息后,您会尽快浏览WMQ,因此,在使用JMS browsing API时,您可能看不到最后的消息,这取决于代理实现和时间等。

这就是为什么当你在睡眠中等待一段时间时,它似乎会被修复。

 类似资料:
  • 我正在尝试向异步路由发送消息,但它不起作用。我刚刚在github上创建了一个项目来模拟这个问题

  • 我正在使用apache camel cxf开发一个Web服务(肥皂),我遇到了这个错误。 Java . lang . illegalargumentexception:Part { http://blue print . camel . ngt . TN/}返回的类型应为[ltn . ngt . camel . blue print . WB _ subscriptions;,而不是org . A

  • 我有一个restendpoint示例。org,返回表单的json响应 我的路线是这样的 我读过关于轮询消费者的内容,但找不到如何继续轮询endpoint的示例,直到它返回“success”响应。 是否应该使用轮询消费者?如果是这样的话,可以举一个与我的案例相关的例子。用于轮询restendpoint的任何其他资源都非常有用。

  • 多播操作符 在 RxJS 中,默认的 observables 是冷的或者单播的。这些操作符可以使 observable 变成热的或者多播的,以允许副作用可以在多个订阅者之间共享。 内容 publish multicast share :star: shareReplay :star: :star: - 常用 其他资源 热的 Observables vs 冷的 Observables :newspa

  • 我试图在聚合器完成后获得一个回复,但是我得到一个异常,我没有指定任何聚合器子项,但是当我指定一个。to()endpoint我没有收到聚合结果。。。这可能吗? 控制器: 聚合器:

  • 我有一个大小为(1000,30,16,16)的张量。我正在做如何使其正常化的实验。我正在尝试跨案例进行规范化,可能是频率轴等。 以下工作: 我得到: 操作数不能与形状一起广播(1000, 30, 16, 16) (30,) 它似乎在(30,16,16)这样的简单情况下成功地完成了丢失的轴 (16, 16) (16,) (1,) 但是当丢失的轴是右边而不是左边时失败,例如:(1000,30),它不能