Маршрут верблюда Apache не вызывает другой маршрут верблюда

У меня есть три маршрута на верблюдах, которые работают нормально индивидуально, я пытаюсь вызвать второй маршрут после завершения первого маршрута, но каким-то образом он не запускается, как выполняется третий маршрут события, когда я вызываю второй маршрут с помощью URL jetty:http://localhost:8181/mongoSelect, у меня нет ошибки консоль тоже. Я уже пробовал заменить from("jetty:http://localhost:8181/mongoSelect") на компонент direct:. Помогите мне, пожалуйста.

Константы

private static final String SOURCE = "file:\\workspace\\EmailResponseAutomationSTS\\response\\?noop=true";
private static final String DESTINATION = "mongodb:myDb?database=email_response&collection=emailResponse&operation=save";
private static final String QUERY_MONGO_DB = "mongodb:myDb?database=email_response&collection=emailResponse&operation=findAll";

Первый маршрут

from(SOURCE)
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                final EmailResponseModel erm = new EmailResponseModel();
                erm.setBody(exchange.getIn().getBody(String.class));
                exchange.getIn().setBody(erm, DBObject.class);
            }
        })
        .to(DESTINATION)
        .end();

Второй маршрут

from("jetty:http://localhost:8181/mongoSelect")
        .to(QUERY_MONGO_DB)
        .marshal(new JacksonDataFormat())
        .to("direct:redis")
        .end();

Третий маршрут

from("direct:redis").process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {

                final String name = exchange.getIn().getBody(String.class);
                @SuppressWarnings({ "deprecation", "unchecked" })
                List<BasicDBObject> obj = (List<BasicDBObject>) JSON.parse(name);

                for(BasicDBObject model : obj) {
                    String s = model.getString("body");
                    jedis.set("mongoData", s); 
                }
                jedis.close();
            }
        })
        .end();

Я уже пробовал такой подход:

Первый маршрут

from(SOURCE)
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                final EmailResponseModel erm = new EmailResponseModel();
                erm.setBody(exchange.getIn().getBody(String.class));
                exchange.getIn().setBody(erm, DBObject.class);
            }
        })
        .to(DESTINATION)
        .to("direct:mongoSelect")
        .end();

Второй маршрут

from("direct:mongoSelect")
.to(QUERY_MONGO_DB)
.marshal(new JacksonDataFormat())
.to("direct:redis")
.end();

ОБНОВЛЕНИЕ: Что-то странное происходит с моим кодом, когда я вызываю второй маршрут из первого маршрута с использованием компонента direct:mongoSelect, управление перемещается, но нет данных в ответ от .to(QUERY_MONGO_DB), однако, если я использую from("jetty:http://localhost:8181/mongoSelect") вместо from("direct:mongoSelect") во втором маршруте я получаю данные в ответ.

Первый маршрут

from(SOURCE)
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                final EmailResponseModel erm = new EmailResponseModel();
                erm.setEmailBody(exchange.getIn().getBody(String.class));
                exchange.getIn().setBody(erm, DBObject.class);
            }
        })
        .to(DESTINATION)
        .to("direct:mongoSelect");

Второй маршрут

from("direct:mongoSelect")
        .to(QUERY_MONGO_DB)
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                String srt = exchange.getIn().getBody(String.class);
                exchange.getIn().setBody(srt, DBObject.class);
            }
        })
        .to("direct:redis")
        .end();

person Shamim Ahmad    schedule 27.03.2018    source источник
comment
что такое НАЗНАЧЕНИЕ?   -  person pvpkiran    schedule 27.03.2018
comment
@pvpkiran DESTINATION - это константа URI, вопрос обновлен, пожалуйста, посмотрите.   -  person Shamim Ahmad    schedule 27.03.2018
comment
После того, как ваш первый маршрут будет завершен? как вы называете свой второй маршрут? Я не вижу этого   -  person pvpkiran    schedule 27.03.2018
comment
Я попытался отправить управление второму маршруту с помощью .to("direct:mongoSelect"), но у меня это не сработало.   -  person Shamim Ahmad    schedule 27.03.2018
comment
ты можешь вставить эту часть кода   -  person pvpkiran    schedule 27.03.2018
comment
@pvpkiran вопрос обновлен, пожалуйста, посмотрите.   -  person Shamim Ahmad    schedule 27.03.2018
comment
Давайте продолжим это обсуждение в чате.   -  person Shamim Ahmad    schedule 27.03.2018


Ответы (2)


Кажется, вы застряли, вот несколько предложений, чтобы продолжить.

  • Ваш первый маршрут читает из файла и записывает в mongo-db
  • Первоначально он не вызывал второй маршрут.

Если требуется, чтобы второй маршрут был службой HTTP, которая прослушивает http://localhost:8181/mongoSelect, и ваш первый маршрут должен вызывать ее, первый маршрут должен вызывать тот же URL.

.to(DESTINATION) => Mongo-DB write
.to("[call to http://localhost:8181/mongoSelect]")
.end();

Однако, если это не обязательно должна быть служба HTTP, конечная точка direct:mongoSelect должна работать нормально, как предложил @pvpkiran. Но тогда у вас есть другие проблемы:

  • Вы пишете, что у вас нет mongodb-results, если вы используете direct:mongoSelect. Вероятно, это связано с тем, что тело сообщения из первого маршрута все еще существует и поэтому используется в качестве строки запроса для mongodb.
  • Задайте правильное тело сообщения с помощью .setBody() перед чтением из базы данных.

Если mongodb-query в QUERY_MONGO_DB shold прочитает всю коллекцию, используйте .setBody(constant("")) или .setBody([your mongodb-query]), если вы хотите прочитать определенные вещи.

from("direct:mongoSelect")
.setBody(constant(""))
.to(QUERY_MONGO_DB)

Наконец, просто для полноты вы пишете, что получаете результаты от mongo-db, если используете конечную точку HTTP для второго маршрута. Я предполагаю, что вы вызвали второй маршрут с запросом GET, и поэтому сообщение имеет пустое тело. Это означает, что вы вернули всю коллекцию из mongo-db.

person burki    schedule 28.03.2018
comment
@buki Да, мое требование состоит в том, чтобы хранить содержимое файла в mongodb с использованием первого маршрута, работает нормально, второй маршрут мне нужно читать данные из mongodb, это именно то, где проблема, мне не нужно использовать HTTP. Я пробовал ваш второй подход from("direct:mongoSelect") .setBody("") .to(QUERY_MONGO_DB), но .setBody("") имеет исключение времени компиляции, говорящее The method setBody(Expression) in the type ProcessorDefinition<RouteDefinition> is not applicable for the arguments (String). - person Shamim Ahmad; 28.03.2018
comment
Извините, попробуйте .setBody(constant("")) или .setBody (constant (null)). Я не знаю, имеет ли значение для mongodb пустая строка или null. Я тоже обновил свой ответ. - person burki; 28.03.2018

Попробуй это. Это должно сработать.

from(SOURCE)
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                final EmailResponseModel erm = new EmailResponseModel();
                erm.setBody(exchange.getIn().getBody(String.class));
                exchange.getIn().setBody(erm, DBObject.class);
            }
        })
        .to(DESTINATION)
        .to("direct:mongoSelect")
        .end();
Second Route

from("direct:mongoSelect")
        .setHeader(Exchange.HTTP_METHOD, constant("GET")) // Change it based on HTTP method type
        .setHeader("Content-Type",simple("application/json"))
        .setHeader("Accept", simple("application/json"))  
        .to("jetty:http://localhost:8181/mongoSelect")
        .to(QUERY_MONGO_DB)
        .marshal(new JacksonDataFormat())
        .to("direct:redis")
        .end();
person pvpkiran    schedule 27.03.2018
comment
Получено это исключение на консоли org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: com.mongodb.WriteResult to the required type: java.io.InputStream with value WriteResult{n=0, updateOfExisting=false, upsertedId=null} - person Shamim Ahmad; 27.03.2018
comment
Это как-то связано с преобразованием типов данных. Вам нужно об этом позаботиться. Маршрут сейчас называется? - person pvpkiran; 27.03.2018
comment
Да, он вызывается, но я не хочу использовать jetty:http://localhost:8181/mongoSelect, поскольку все три маршрута принадлежат одному классу. Это не способ вызова с использованием какого-либо компонента, такого как direct: - person Shamim Ahmad; 27.03.2018
comment
не понимаю, о чем вы спрашиваете - person pvpkiran; 27.03.2018
comment
Я имею в виду, я не хочу использовать вызов rest-api для доступа ко второму маршруту. Есть ли другой способ получить к нему доступ, например, компонент direct: используется для передачи управления. - person Shamim Ahmad; 27.03.2018
comment
у вас нет доступа ко второму маршруту через rest-api, вы получаете доступ через direct:mongoselect - person pvpkiran; 27.03.2018