ProducerTemplate и Direct: start in camel

Мой верблюжий маршрут:

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?


person Tarun Kumar    schedule 09.04.2013    source источник


Ответы (3)


Причина, по которой вы получаете эту ошибку, заключается в том, что вы не настроили Route, начинающийся с direct:start.

Если вы настроили Route, но не упомянули об этом в своем исходном запросе, то следующий шаг, который нужно попробовать, — сначала запустить Camel Context, прежде чем вызывать метод sendBody.

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

Надеюсь, это решит вашу проблему.

person Amar M    schedule 08.02.2016

Я знаю, что это очень старый вопрос. Но пишу это для тех, кто все еще сталкивается с такой проблемой.

Сценарий: в процессе вызова метода http GET я извлекаю некоторые данные из БД в середине процесса и передаю данные в виде сообщения производителю Artemis.

Во-первых, если вы используете верблюда с пружиной, вам вообще не нужно создавать какой-либо контекст верблюда. Потому что 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);
}
person Ankit    schedule 23.02.2021

Это также опубликовано в списке рассылки Apache Camel, где обсуждается его активность. http://camel.465427.n5.nabble.com/ProducerTemplate-and-direct-start-in-camel-tp5730558.html

person Claus Ibsen    schedule 09.04.2013
comment
Я только задал тот же вопрос в списке рассылки верблюда. PS: если вы понизили мой вопрос по той же причине, я чувствую, что вам не следует :) - person Tarun Kumar; 09.04.2013