Возможно ли использование нескольких сервлетов с помощью Camel Servlet? - PullRequest
0 голосов
/ 12 марта 2019

Я хочу выставить 3 apis через мое приложение.Шаблон выглядит следующим образом:

  • / api / ui / * (обрабатывается Spring) сопоставляется с сервлетом 1
  • / api / api1 / * (обрабатывается компонентом сервлета Camel)к сервлету 2
  • / api / api2 / * (обрабатывается компонентом сервлета Camel) отображается на сервлет 3

кажется, я не могу сделать это с Camel ...

Вот так я регистрирую сервлет 2:

@Bean
public ServletRegistrationBean camelServletRegistrationBean() {
    final CamelHttpTransportServlet camelServlet = new CamelHttpTransportServlet();
    final ServletRegistrationBean servletBean = new ServletRegistrationBean(camelServlet, "/api/api1/*");
    servletBean.setName("servlet2");
    return servletBean;
}

public class Api1RestInputRoute extends RouteBuilder {


   restConfiguration().component("servlet").componentProperty("servletName", "servlet2");

   rest()
      .consumes(MediaType.TEXT_PLAIN_VALUE)
      .get("/health").to("log:api1");
}

public class Api2RestInputRoute extends RouteBuilder {


   restConfiguration().component("servlet").componentProperty("servletName", "servlet3");

   rest()
      .consumes(MediaType.TEXT_PLAIN_VALUE)
      .get("/health").to("log:api2");
}

Похоже, что restConfigurations устанавливает свойство "servletName" для одного и того же компонента и первые выигрыши.

Я не хочуесть / api / camel / api1 / , / api / camel / api2 / для Camel Servlet ...

Моя версия Apache Camel - 2.21.5

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Не уверен, что это сработает, но вы можете попробовать этот возможный обходной путь: форсировать три отдельных экземпляра компонента сервлета, чтобы вызов метода установки не влиял на все экземпляры.

CDI-версия (но принципы для Spring остаются)

0 голосов
/ 16 марта 2019

Существует множество способов обеспечить настройку с помощью rest dsl в Apache Camel.Таким образом, я потратил много времени на отладку, чтобы выяснить, что нет шансов (в 2.21.5) выбрать сервлет для использования, если вы хотите иметь несколько.

Проблема в том, что Camel наС одной стороны, поддерживается только один-единственный компонент «сервлет», поэтому, если вы добавите ServletComponent «servlet1», это не поможет, в конце концов он все равно будет использовать «сервлет».

Хотя вы можете указать многоRestConfigurations, будет выбрана одна-единственная конфигурация для «сервлета».

И если вы попытаетесь использовать часть запроса RestEndpoint, проблема заключается в том, что созданные ServletEndpoints с правильно установленными servletNames все равно будут конфликтоватьс их URI: "servlet: / health? httpMethodRestrict = GET", и, таким образом, у вас будет только один ...

Для REST мне нужно будет переключиться на Spring: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...