Как создать сервлет Java DSL с использованием Camel в формате .war, который можно развернуть и запустить в Tomcat? - PullRequest
2 голосов
/ 14 февраля 2020

Последние несколько дней я искал, как сделать ниже, не имея никаких знаний в Tomcat или Camel, и я удивлен, что не нашел хороших ресурсов по этому вопросу:

Make a. файл war, который будет развернут в Tomcat (например, из приложения Manager), который примет запрос по указанному URI /test и перенаправит запрос внутренней службе в PHP, которая работает на localhost:8222/index.php?q=test.

Мне удалось получить рабочий пример переадресации запроса на другой URL, построив поверх camel-archetype-java, и маршрутизатор выглядит так:

package camelinaction;

import org.apache.camel.builder.RouteBuilder;

public class MyRouteBuilder extends RouteBuilder {

    public void configure() {
        String targetUrl = "https://another.service.com/api/test";
        from("jetty:http://127.0.0.1:25566/test?matchOnUriPrefix=true")
                .to("jetty:" + targetUrl + "?bridgeEndpoint=true&throwExceptionOnFailure=false");
    }

}

, и мне также удалось создать файл .war из примера camel-example-servlet-tomcat, что в Camel и успешно развернуть его в tomcat. Этот пример не имеет никакого кода Java в своей папке проекта и состоит в основном из просто файлов *. 1018 * и страницы. html, которая обслуживается сервлетом Camel, когда запрашивает соответствующий путь сервлета, который обслуживается. котом Основа c xml этого проекта выглядит следующим образом:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <camelContext xmlns="http://camel.apache.org/schema/spring">

    <route id="helloRoute">
      <!-- incoming requests from the servlet is routed -->
      <from uri="servlet:hello"/>
      <choice>
        <when>
          <!-- is there a header with the key name? -->
          <header>name</header>
          <!-- yes so return back a message to the user -->
          <transform>
            <simple>Hi I am ${sysenv.HOSTNAME}. Hello ${header.name} how are you today?</simple>
          </transform>
        </when>
        <otherwise>
          <!-- if no name parameter then output a syntax to the user -->
          <transform>
            <constant>Add a name parameter to uri, eg ?name=foo</constant>
          </transform>
        </otherwise>
      </choice>
    </route>

  </camelContext>

</beans>

Как бы кто-то мог объединить два примера / функции для достижения конечной цели получения запроса от tomcat для перенаправления с верблюдом в другую конечную точку?

1 Ответ

1 голос
/ 16 февраля 2020

Поскольку вы уже развертываете эту WAR в контейнере сервлета, который может обрабатывать HTTP, нет необходимости использовать компонент camel-jetty, но он может использовать компоненты camel-servlet и camel-servlet-listener.

В первом примере используется DSL Camel Java, а во втором - XML DSL, в первом go он может быть немного пугающим. Я не смог найти ни одного примера, объединяющего указанный сценарий c, поэтому я собрал quick demo , который можно было бы развернуть в контейнере сервлета и который мог бы направлять вызовы в другую службу HTTP. Это крошечная демоверсия и потребует некоторых модификаций. Я тестировал его с помощью jetty, но не пробовал бросать его в Tomcat.

В файле. xml, следующий раздел контролирует контекст.

<!-- Camel servlet mapping -->
<servlet-mapping>
<servlet-name>CamelServlet</servlet-name>
<url-pattern>/camel/*</url-pattern>
</servlet-mapping>

Есть только один java файл, конфигурация маршрута, как показано ниже

public class DefaultRouteBuilder extends RouteBuilder {

@Override
public void configure() throws Exception {

    from("servlet:hello?matchOnUriPrefix=true")
    .routeId("HTTP Bridging Route")
    .log("Request: ${in.header."+ Exchange.HTTP_METHOD +"} to ${in.header."+ Exchange.HTTP_URI +"}")
    .to("https://another.service.com?bridgeEndpoint=true");
}

}

Как только сервлет запустится, вы можете получить доступ к HTTP-ресурсу, поддерживаемому верблюдом на http://server/<context root>/camel/hello Я надеюсь, что это поможет вам начать работу.

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