我的骆驼路线是:
from("direct:start")
.to("http://myhost/mypath");
我用过:
ProducerTemplate template;
template.sendBody("direct:start", "This is a test message");
发送交换。我得到以下例外:
No consumers available on endpoint: Endpoint[direct://start].
我如何直接接收相同的交换:start endpoint?
答案 0 :(得分:1)
您收到此错误的原因是您尚未配置从Route
开始的direct:start
。
如果您已配置Route
,但未在原始查询中提及,那么下一步尝试是在调用sendBody
方法之前首先启动Camel Context。
camelContext.start();
template.sendBody("direct:start", "This is a test message");
希望这可以解决您的问题。
答案 1 :(得分:0)
我知道这是一个非常古老的问题。但是为仍然遇到此类问题的任何人写这篇文章。
场景:在调用 http GET 方法的过程中,我在该过程中从 DB 获取一些数据并将数据作为消息发送到 artemis 生产者。
首先,如果您在 spring 中使用骆驼 - 您根本不需要创建任何骆驼上下文。因为 spring 足够聪明,可以为您创建具有以下依赖项的骆驼上下文。
一些必要的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-artemis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
<version>2.24.2</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jaxb-starter</artifactId>
<version>2.24.2</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jms</artifactId>
<version>2.24.2</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson-starter</artifactId>
<version>2.24.2</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>2.24.2</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-amqp</artifactId>
<version>2.24.2</version>
</dependency>
为了解决这个问题,我创建了一个类,它扩展了骆驼库中的 RouteBuilder 类。在这个构建器中,我创建了一个虚拟消费者并使用它向实际生产者发送消息。我的目的地是 artemis 生产者端点。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.apache.camel.LoggingLevel;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.jackson.JacksonDataFormat;
import org.apache.camel.spi.DataFormat;
import org.springframework.stereotype.Component;
@Component
public class MyRouteBuilder extends RouteBuilder {
private DataFormat marshalDataFormat;
public MyRouteBuilder(ObjectMapper objectMapper) {
objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
marshalDataFormat = new JacksonDataFormat(objectMapper, MyClass.class);
}
@Override
public void configure() throws Exception {
from("direct:imaginary-consumer")
.marshal(marshalDataFormat)
.log(LoggingLevel.INFO, "Message ready to send is ${body}")
.to("producer:message-data")
.log(LoggingLevel.INFO, "Message has been sent successfully to topic.");
}
}
下面的代码片段位于任何携带消息正文的实现类中。此方法获取消息数据并将其发送到我们在 MyRouteBuilder 类中创建的虚构/虚拟消费者。路由器类被调用并将消息发送到目的地(此处为生产者)。它也可以是 http 端点。
@Autowired
private ProducerTemplate producerTemplate;
public void sendMessage(Map<String, MyClass> messageBody) {
producerTemplate.sendBody("direct:imaginary-consumer", messageBody);
}
答案 2 :(得分:-2)
这也发布在Apache Camel邮件列表中,其中讨论了它的活跃性。 http://camel.465427.n5.nabble.com/ProducerTemplate-and-direct-start-in-camel-tp5730558.html