Apache Camel Route: «Невозможно назначить запрошенный адрес» при попытке получить данные с сервера - PullRequest
0 голосов
/ 11 октября 2019

Я хочу получить данные с очень простого веб-сервера, который показывает мне страницу при вызове в браузере, предоставляя мне пару данных. Страница автоматически обновляется через несколько секунд и показывает:

analog input 0 is 1023
analog input 1 is 109
analog input 2 is 0
analog input 3 is 415
analog input 4 is 0
analog input 5 is 40

В финальной программе я хочу получить данные со страницы и преобразовать их во временные ряды притока через верблюда apache. До сих пор я узнал, что компонент пристани - это путь, и настроил мой маршрут следующим образом:

public class HttpReaderRoute extends RouteBuilder {
    @Autowired
    private FrameworkConfig frameworkConfig;

    @Override
    public void configure() throws Exception {

        String sourceString = "jetty:http://server.i.want.to.poll:8080/?sessionSupport=true";
        String targetString = "stream:out";
        // String targetString = "influxdb://influxDb?databaseName=" //
        // + frameworkConfig.getInfluxDb().getDatabaseName() //
        // + "&retentionPolicy=" //
        // + frameworkConfig.getInfluxDb().getRetentionPolicy();

        System.out.println(sourceString);

        from(sourceString)
                .log("Received data server") //
                .to(targetString);
    }
}

Однако я получаю либо org.apache.camel.RuntimeCamelException: java.net.BindException: Cannot assign requested address, либо - если я пропущу, использую формат jetty:http:server.i.want.to.poll:8080, Я получаю «разрешение отказано».

Связанный класс конфигурации выглядит следующим образом:

@Configuration
public class HttpClientConfig {

    @Bean
    public PoolingHttpClientConnectionManager poolingConnectionManager() {
        PoolingHttpClientConnectionManager poolingConnectionManager = new 

PoolingHttpClientConnectionManager();
            poolingConnectionManager.setMaxTotal(10);
            return poolingConnectionManager;
    }
}

Возможно, стоит упомянуть, что я использую spring.boot.

Что я делаю не так?

1 Ответ

2 голосов
/ 12 октября 2019

Вы пытаетесь опросить данные из какого-либо существующего веб-сервиса с помощью Apache Camel? Если да, вам следует использовать HTTP4 Component вместо Jetty component .

Это быстрый ответ, который поможет вам сделать следующий шаг максимально быстро. Вы можете сделать что-то вроде

from("timer:hello?period=2000").routeId("test_route")
.to("http4://example.com/")
.log("${body}")
.to("file:target/messages");

после добавления зависимости

 <dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-http4</artifactId>
  <version>X.X.X</version>
 </dependency>

Здесь нам нужно еще немного покопаться, так как шансы спотыкаться об одной и той же проблеме велики, потому что CAMEL-13220 удалил поддержку Producer для компонента Jetty в июне 2019 года. Это означает, что Jetty больше не может выполнять функцию HTTP Client.

  • Маршрут в примере кода начинается с from("jetty:http://server.i.want.to.poll:8080/?sessionSupport=true"). Этот код фактически устанавливает HTTP-сервер (или терминологию Consumer в Camel, как показано здесь в старых документах ). Весьма вероятно, что в тестовой инфраструктуре OP:
  • server.i.want.to.poll равно localhost
  • Есть какая-то другая служба, прослушивающая 8080, возможно, OP службы пытается подключиться к ней. Это может быть причиной того, что java.net.BindException
  • В прошлом компонент Jetty мог использоваться как производитель, так и как потребитель. Если OP использует версии Camel 2.x, все еще можно использовать компонент Jetty в качестве HTTP-клиента (производителя) с маршрутом, подобным from("direct:start").to("jetty://http://www.google.com"). Тем не менее, я бы порекомендовал придерживаться компонентов HTTP / HTTP4 в зависимости от обстоятельств.

PS: Моя тестовая установка - загрузочное приложение Spring, работающее Camel 3.0.0-M4

...