修改消息正文,或者修改camel路由中的某些数据

ercv8c1e  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(163)

对Camel路线中的某些数据进行小修改的最佳方法是什么?
我正在从Mongo拉入一个BSON文档,需要在http调用中使用它的时间戳,但需要将它从毫秒转换为秒。
我试着设置一个标题。

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

这样我就可以使用Simple表达式将时间戳添加到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,一个聚合策略,返回一个带有我所做的修改的交换。

62lalag4

62lalag41#

您可以使用Lambda、处理器或bean修改body、header或属性。使用处理器时,您需要使用Message.setHeader方法来修改header的值(至少对于值类型和字符串)。Bean方法默认接收body值,因此如果您想传入header,您需要使用简单的语言指定它。

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!";
        }
    }
}

除此之外,您还可以使用表达式语言,如simple或groovy。

eimct9ow

eimct9ow2#

在路由中,您可以将报头设置为毫秒值.setHeader("test").jsonpath("$.startTime")
然后,在处理器中,您可以检索此值:

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

然后,将millisecondsValue的值transform为所需值,并在交换中将其设置回:

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

然后调用.toD("https://test.com/api/markets?resolution=60&start_time=${header.test}"),它将使用秒值

相关问题