Измените тело сообщения или иным образом измените некоторые данные в верблюжьем маршруте.

avatar
BenW
9 августа 2021 в 03:33
289
2
1

Как лучше всего внести небольшие изменения в некоторые данные в маршруте Camel?

Я загружаю документ BSON из Mongo. Мне нужно использовать отметку времени из него в HTTP-вызове, но мне нужно преобразовать ее из миллисекунд в секунды.

Я попытался установить заголовок.

.setHeader("test").jsonpath("$.startTime")

Что позволяет добавлять отметку времени к URL-адресу с помощью простого выражения.

.toD("https://test.com/api/markets?resolution=60&start_time=${headers.test}")

Но я не могу найти способ изменить значение заголовка.

Я также пытался использовать процесс

.process(new Processor() {
    public void process(Exchange exchange) throws Exception {
        DocumentContext message = JsonPath.parse(exchange.getMessage().getBody());
        String time = message.read("$.startTime").toString();
        time = "111100000";  
        // do something with the payload and/or exchange here
       //exchange.getIn().setBody("Changed body");
   }
})

Но здесь обмен не возвращается. Я основывался на том, как использовал расширенный EIP со стратегией агрегации, которая возвращала Exchange с внесенными изменениями. Этот процесс, похоже, не работает таким образом.

Источник

Ответы (2)

avatar
Pasi Österman
9 августа 2021 в 07:41
1

Вы можете изменить тело, заголовок или свойство с помощью Lambda, процессора или bean-компонента. С процессором вам нужно использовать метод Message.setHeader, чтобы изменить значение заголовка, по крайней мере, для типов значений и строк. Методы компонента получают значение тела по умолчанию, поэтому, если вы хотите передать заголовок, вам нужно будет указать его, используя простой язык.

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

public class SetHeaderTest extends CamelTestSupport {

    @Test
    public void testGreeting() throws Exception {

        MockEndpoint resultMockEndpoint = getMockEndpoint("mock:result");
        resultMockEndpoint.expectedMessageCount(3);

        template.sendBodyAndHeader("direct:modifyGreetingLambda", 
            null, "greeting", "Hello");

        template.sendBodyAndHeader("direct:modifyGreetingProcessor", 
            null, "greeting", "Hello");

        template.sendBodyAndHeader("direct:modifyGreetingBean", 
            null, "greeting", "Hello");
    
        resultMockEndpoint.assertIsSatisfied();
    }

    @Override
    protected RoutesBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder(){

            @Override
            public void configure() throws Exception {
                
                from("direct:modifyGreetingLambda")
                    .routeId("modifyGreetingLambda")
                    .setHeader("greeting").exchange(exchange -> {   
                        String modifiedGreeting = (String)exchange.getMessage().getHeader("greeting");
                        modifiedGreeting += " world!";
                        return modifiedGreeting;
                    })
                    .log("${headers.greeting}")
                    .to("mock:result");

                from("direct:modifyGreetingProcessor")
                    .routeId("modifyGreetingProcessor")
                    .process(new Processor(){

                        @Override
                        public void process(Exchange exchange) throws Exception {
                            String modifiedGreeting = (String)exchange.getMessage().getHeader("greeting");
                            modifiedGreeting += " world!";
                            exchange.getMessage().setHeader("greeting", modifiedGreeting);
                        }
                    })
                    .log("${headers.greeting}")
                    .to("mock:result");

                from("direct:modifyGreetingBean")
                    .routeId("modifyGreetingBean")
                    .setHeader("greeting").method(new ModifyGreetingBean(), 
                        "modifyGreeting('${headers.greeting}')")
                    .log("${headers.greeting}")
                    .to("mock:result");
            }
        };
    }

    public class ModifyGreetingBean {
        public String modifyGreeting(String greeting) {
            return greeting + " world!";
        }
    }
}

Помимо этого, вы также можете использовать языки выражений, такие как простые или заводные.

avatar
lbma
10 августа 2021 в 08:46
1

В маршруте вы можете установить заголовок со значением в миллисекундах .setHeader("test").jsonpath("$.startTime").

Затем в процессоре вы можете получить это значение:

String milliSecondsValue = (String) exchange.getIn().getHeader("test");

Затем вы преобразуете значение milliSecondsValue в желаемое значение и возвращаете его на биржу:

exchange.getIn().setHeader("test", secondsValue);

После этого вызовите .toD("https://test.com/api/markets?resolution=60&start_time=${header.test}") и он будет использовать значение секунд