RouteBuilder Camel

189
24 мая 2018, 12:10

помогите разобраться в маршрутах camel плиз. Читаю читаю и не понимаю, понимаю как через XML, но мне надо сделать через Java класс, и без Spring. Нужно из файла properties составить строку запроса, то есть endpoint. и далее ее выполнить(например http://server:22000/api/token?login=login&pass=pass)

В ответ должен прийти токен. Вот мой класс, все бралось из доки, но мне не ясно это from("direct:start"), что за direct:start, или я должен здесь что-то другое прописать? Например как раз получение адреса? Это я уже просто эксперементирую.

public class PrepareOapiForAuthTokenRoute extends RouteBuilder {
final String applicationProperties = "application.properties";
@Override
public void configure() throws Exception {
    from("direct:start").process(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
            System.out.println("2222");
        }
    });
}
public String gerUrl() throws IOException {
    Properties applicationProps = new PropUtils().readProperties(applicationProperties);
    String user = (String)applicationProps.get("oapi.user");
    String url = (String)applicationProps.get("oapi.url");
    String pass = (String)applicationProps.get("oapi.password");
    String fullUrl = url + "?login=" + user + "&password=" + pass;
    System.out.println(fullUrl);
    return fullUrl;
}
}

Делаю тест вот так, но ничего мне не выходит,даже просто строку, что выполнилось все

public class PaysRouteBuilderTest {
final private static Logger LOG = LoggerFactory.getLogger(PaysRouteBuilderTest.class);

@Test
public void test() {
    RouteBuilder builder = new PrepareOapiForAuthTokenRoute();
    try {
        builder.configure();
    }catch (Exception e) {
        LOG.error("Exception: ",e);
    }
}
}

Сделал вот такой тест, и даже вроде работает и выстраивает строку, но сам процессор не работает, то есть сообщение не выводит

public class PaysRouteBuilderTest extends CamelTestSupport {
final private static Logger LOG = LoggerFactory.getLogger(PaysRouteBuilderTest.class);
final String applicationProperties = "application.properties";

@Test(timeout = 10000)
public void testMethod() throws Exception {
    Thread.sleep(5000); // Нужно, чтобы Camel успел обработать файлы, до завершения теста
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        public void configure() {
            from("direct:start")
                    .setHeader(Exchange.HTTP_METHOD, constant("GET"))
                    .to("http:" + gerUrl()).process(new Processor() {
                        @Override
                        public void process(Exchange exchange) throws Exception {
                            //HttpServletResponse response = exchange.getOut().getBody(HttpServletResponse.class);
                            System.out.println("ghjhh");
                        }
                    });
        }
    };
}
public String gerUrl() {
    Properties applicationProps = null;
    try {
        applicationProps = new PropUtils().readProperties(applicationProperties);
    } catch (IOException e) {
        e.printStackTrace();
    }
    String user = (String)applicationProps.get("oapi.user");
    String url = (String)applicationProps.get("oapi.url");
    String pass = (String)applicationProps.get("oapi.password");
    String fullUrl = url + "?login=" + user + "&password=" + pass;
    return fullUrl;
}
}
Answer 1

Не очень понятно из вопроса в каком контексте должен запускаться маршрут (route), поэтому будем считать, что по шедулеру.

Что такое apache camel direct?

Apache camel direct - это точка некоего "ручного" входа в маршрут.

URI format

direct:someName[?options]

Where someName can be any string that uniquely identifies the endpoint.

Где, someName - это любое строковое название данной точки.

В итоге, маршрут (route), видимо, должен быть такой:

  1. Запустить маршрут, например по таймеру (apache camel timer)
  2. Сформировать/переопределить http-url в бине/процессоре или в самом маршруте (route) через Message Headers в apache camel http
  3. Вызвать http, например через http-компоненту (apache camel http)

Дополняю ответ примером Predicate:

private Predicate predicateExample() {
    return new Predicate() {
        @Override
        public boolean matches(Exchange exchange) {
            return true; //здесь реализуется какая-то логика
        }
    };
}
READ ALSO
ObjectMapper: Не мапит JSON в POJO

ObjectMapper: Не мапит JSON в POJO

Итак,у меня есть метод, который должен получить из запроса JSON, обработать его в POJO и вернуть его

215
Unit тесты для Service-слоя

Unit тесты для Service-слоя

Здравствуйте не так давно задался вопросом на тему того как тестировать сервис-слой в приложенияхПоискав немного информации в интернете...

229
Одноразовое объявление переменной

Одноразовое объявление переменной

В общем, есть код в цикле:

157
Библиотеки криптопро

Библиотеки криптопро

с криптопро я раньше не работалНо сейчас в нашей компании возникла задача реанимировать сервис для подписи файлов

164