我正在使用 ProducerTemplate 和 ConsumerTemplate 来处理简单路由测试中的消息发送和接收。我还使用带有 activeMQ 图像的 testcontainer 。下面有一个设置:
@CamelSpringBootTest
@EnableAutoConfiguration
class PushRouterIT extends BaseIT implements AmqContainer {
@Autowired
ProducerTemplate producer;
@Autowired
ConsumerTemplate consumer;
测试方法:
//given //when
producer.sendBody("activemq:queue:test", json);
//then
var result = consumer.receiveBody(topic, TIMEOUT_IN_MILLIS);
assertThat(result).isEqualTo(json);
路由是通过使用配置注释创建的bean来声明的,通过扩展类:RouteBuilder,诸如此类:
from(ROUTE_DEFINITION)
.routeId(CAMEL_MAIN_ROUTE_ID)
.process(PUSH_PROCESSOR_BEAN_NAME)
.choice()
.when()
.jsonpath(CONDITION_1_CHOICE_DEFINITION)
.to(ENDPOINT_1)
.when()
.jsonpath(CONDITION_2_CHOICE_DEFINITION)
.to(ENDPOINT_2)
.otherwise()
.to(DLQ_ENDPOINT)
.end();
使用的版本:
Spring Boot 3.2.2 +
<camel-spring-boot-starter.version>4.3.0</camel-spring-boot-starter.version>
<camel-spring-boot-starter-activemq.version>4.3.0</camel-spring-boot-starter-activemq.version>
<camel-test-junit5.version>4.3.0</camel-test-junit5.version>
<camel-test-spring-junit5.version>4.3.0</camel-test-spring-junit5.version>
<testcontainers.version>1.19.5</testcontainers.version>
所以我面临的问题是,有时我的消费者说他没有收到任何消息。增加超时不起作用。这是否与我正在消费来自主题的消息而消费者模板构造无法很好地处理有关?
我相信您正在经历发送和消费之间的竞争状况。
如果您正在使用来自 JMS 主题的消息,那么您需要在向该主题发送消息之前创建主题使用者。 JMS 主题的语义规定,当该主题上不存在消费者时,发送到该主题的消息将被丢弃。