Apache camel schreiben rabbitmq

Ich versuche, Daten aus einer Datei Lesen und in Sie schreiben ein rabbitmq Warteschlange mit apache camel, aber am Ende mit dem Fehler

    Exception in thread "main" org.apache.camel.FailedToCreateRouteException: Failed to create route route1 at: >>> To[rabbitmq://localhost:15672?queue=hello] <<< in route: Route(route1)[[From[file://target/?fileName=doctor.txt&chars... because of Failed to resolve endpoint: rabbitmq://localhost:15672?queue=hello due to: No URI path as the exchangeName for the RabbitMQEndpoint, the URI is rabbitmq://localhost:15672?queue=hello
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:945)
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:187)
    at org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:794)
    at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:2184)
    at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:1916)
    at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:1777)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:1745)
    at test.RMQCamelSender.main(RMQCamelSender.java:38)
Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: rabbitmq://localhost:15672?queue=hello due to: No URI path as the exchangeName for the RabbitMQEndpoint, the URI is rabbitmq://localhost:15672?queue=hello
    at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:545)
    at org.apache.camel.util.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:71)
    at org.apache.camel.model.RouteDefinition.resolveEndpoint(RouteDefinition.java:202)
    at org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:106)
    at org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:112)
    at org.apache.camel.model.SendDefinition.resolveEndpoint(SendDefinition.java:61)
    at org.apache.camel.model.SendDefinition.createProcessor(SendDefinition.java:55)
    at org.apache.camel.model.ProcessorDefinition.makeProcessor(ProcessorDefinition.java:500)
    at org.apache.camel.model.ProcessorDefinition.addRoutes(ProcessorDefinition.java:213)
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:942)
    ... 8 more
Caused by: java.lang.IllegalArgumentException: No URI path as the exchangeName for the RabbitMQEndpoint, the URI is rabbitmq://localhost:15672?queue=hello
    at org.apache.camel.component.rabbitmq.RabbitMQComponent.createEndpoint(RabbitMQComponent.java:50)
    at org.apache.camel.component.rabbitmq.RabbitMQComponent.createEndpoint(RabbitMQComponent.java:31)
    at org.apache.camel.impl.DefaultComponent.createEndpoint(DefaultComponent.java:122)
    at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:525)
    ... 17 more

Folgenden sind meine Implementierungen von Klassen, die Erstellung von camel Kontext und rabbitmq Warteschlange.

RMQCamleSender.java

package test;

import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import test.Producer;

public class RMQCamelSender {
    public static void main(String[] argv) throws Exception {

        Producer queueProd = new Producer();
        queueProd.setupConnection();
        System.out.println(queueProd.toString());

        CamelContext context = new DefaultCamelContext();

        context.addRoutes(new RouteBuilder() {

            public void configure() throws Exception {
                System.out.println("hello world");
                from("file://target/?fileName=doctor.txt&charset=utf-8")
                        .process(new Processor() {
                            public void process(Exchange msg) throws Exception {
                                System.out.println(msg.getIn().getBody(
                                        String.class));

                            }

                        }).to("rabbitmq://localhost:15672?queue=hello");

            }
        });

        context.start();
        Thread.sleep(4000);
        context.stop();
    }
}

Producer.java

package test;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;

public class Producer {
    public static final String QUEUE_NAME = "hello";
    public static Connection connection;

    public void setupConnection() throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");

        connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    }

}

Das Programm funktioniert gut, wenn ich bin nicht mit Kamel und versucht, an der Warteschlange mit standard-rabbitmq Bibliothek.

InformationsquelleAutor coder006 | 2016-08-02



2 Replies
  1. 1

    Die Fehlermeldung ist ziemlich bezeichnend: Sie vermissen den Austausch Namen in Ihre endpoint-URI, es darf nicht leer sein, da die offizielle Dokumentation Camel sagt, es hat zu Folgen das gegebene format:

    rabbitmq://hostname[:port]/exchangeName?[Optionen]

    Schlage ich vor, Sie versuchen, mit den amq.direct exchange (für mehr details, siehe die offizielle RabbitMQ-Dokumentation), etwa so:

    public void configure() throws Exception {
        System.out.println("hello world");
        from("file://target/?fileName=doctor.txt&charset=utf-8")
            .process(new Processor() {
                public void process(Exchange msg) throws Exception {
                    System.out.println(msg.getIn().getBody(String.class));
                }
    
            }).to("rabbitmq://localhost:5672/amq.direct?routingKey=hello");
    }
    

    Darüber hinaus sind Sie mit 15672 port, der standardmäßig den port für RabbitMQ web-management-Konsole, ich denke, Sie haben sich nicht geändert die Standardeinstellungen der port muss 5672. Sie haben auch die Verwendung der routingKey – parameter anstelle des queue man da in RabbitMQ Semantik, die Sie veröffentlichen exchange:routingKey und verbrauchen nur aus Warteschlangen.

  2. -1

    Müssen Sie den rabbitmq-exchange-Namen. Es fehlt hier;

    .to("rabbitmq://localhost:15672?queue=hello");
    

    Es sollte so etwas wie dieses:

    .to("rabbitmq://localhost:15672/exchangeName?routingKey=hello");
    

    Auch, wenn Sie schicken, um sich auszutauschen, warum wollen Sie geben Sie einen queue? Sie müssen nur geben Sie die routing-Taste und der exchange sendet an die Warteschlange, wenn es eine Bindung für die routing-Taste.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.