2

我的骆驼路线是:

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].

如何在 direct:start 端点中接收相同的交换?

4

3 回答 3

1

您收到此错误的原因是您没有配置Routedirect:start.

如果您已经配置了Route,但在原始查询中没有提及它,那么下一步要尝试的是首先启动 Camel 上下文,然后再调用该sendBody方法。

camelContext.start();
template.sendBody("direct:start", "This is a test message"); 

希望这能解决您的问题。

于 2016-02-08T18:04:02.987 回答
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);
}
于 2021-02-23T02:15:18.617 回答
-1

这也发布在 Apache Camel 邮件列表中,正在讨论它的活动。 http://camel.465427.n5.nabble.com/ProducerTemplate-and-direct-start-in-camel-tp5730558.html

于 2013-04-09T05:56:32.263 回答