Help us understand the problem. What is going on with this article?

Apache CamelのHTTP Proxy設定方法

More than 3 years have passed since last update.

はじめに

みんなが大好きなプロキシ設定、Apache CamelのHTTPコンポーネント版です。

Javaを書くときは半無意識的に行う、システムプロパティへの設定が効かなかったので備忘にまとめます。

よく使うプロキシの呪文(ApacheCamelのHTTPコンポーネントには適用されない!)
System.setProperty("proxySet", "true");
System.setProperty("proxyHost", "www.myproxy.com");
System.setProperty("proxyPort", "80");

バージョン

  • camel-core 2.18.0
  • camel-http 2.18.0

設定方法

起動クラス

システムプロパティに設定するのではなく、CamelContextにプロキシのIPとポートを設定します。
見たまんまですが、context.getProperties().put("http.proxyHost", "www.myproxy.com");context.getProperties().put("http.proxyPort", "80");の部分です。

CamelApp.java
import org.apache.camel.CamelContext;
import org.apache.camel.impl.DefaultCamelContext;

public class CamelApp {

    public static void main(String[] args) throws Exception {

        CamelContext context = new DefaultCamelContext();

        context.addRoutes(new HttpProxyRoute());

        // ★プロキシ設定
        context.getProperties().put("http.proxyHost", "www.myproxy.com");
        context.getProperties().put("http.proxyPort", "80");

        // 起動
        context.start();
        Thread.currentThread().join();
        context.stop();

    }
}

Routeクラス

サンプルとしてHTTP(S)で外部サービスにアクセスするRouteを作りました。
簡単に説明すると以下の機能を持ちます。

  1. GitHub.comのAPIを叩いて、リポジトリを「microservice」で検索
  2. 検索して取得した結果を、デスクトップのoutBoxフォルダに、yyyyMMdd_HHmmss.jsonの形式で保存
  3. 1~2を5秒毎に起動
HttpProxyRoute.java
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;

public class HttpProxyRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("timer://foo?period=5000")
                .to("https://api.github.com/search/repositories?q=microservice")
                .to("file:{{env:HOMEPATH}}/Desktop/outBox?fileName=${date:now:yyyyMMdd_HHmmss}.json")
                ;
    }
}

このクラスでプロキシを突破できているか疎通確認を行います。

実行

実行すると以下の感じのログが出力されます。

実行結果
10 14, 2016 8:52:44 午後 org.apache.commons.httpclient.HttpMethodBase readResponseBody
情報: Response content length is not known
20:52:46.451 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.http.HttpProducer - Http responseCode: 200
20:52:47.270 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.processor.SendProcessor - >>>> file://%5CUsers%5Cusername/Desktop/outBox?fileName=%24%7Bdate%3Anow%3AyyyyMMdd_HHmmss%7D.json Exchange[ID-DESKTOP-N5C2HRA-64580-1476445962689-0-2]
20:52:47.272 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.file.FileOperations - Using InputStream to write file: C:\Users\username\Desktop\outBox\20161014_205247.json
20:52:47.296 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.file.GenericFileProducer - Wrote [C:\Users\username\Desktop\outBox\20161014_205247.json] to [file://%5CUsers%5Cusername/Desktop/outBox?fileName=%24%7Bdate%3Anow%3AyyyyMMdd_HHmmss%7D.json]
20:52:49.603 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.processor.SendProcessor - >>>> https://api.github.com/search/repositories?q=microservice Exchange[ID-DESKTOP-N5C2HRA-64580-1476445962689-0-4]
20:52:49.605 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.http.HttpProducer - Executing http GET method: https://api.github.com/search/repositories?q=microservice
20:52:50.059 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.http.HttpProducer - Http responseCode: 200
20:52:50.496 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.processor.SendProcessor - >>>> file://%5CUsers%5Cusername/Desktop/outBox?fileName=%24%7Bdate%3Anow%3AyyyyMMdd_HHmmss%7D.json Exchange[ID-DESKTOP-N5C2HRA-64580-1476445962689-0-4]
20:52:50.498 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.file.FileOperations - Using InputStream to write file: C:\Users\username\Desktop\outBox\20161014_205250.json
20:52:50.537 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.file.GenericFileProducer - Wrote [C:\Users\username\Desktop\outBox\20161014_205250.json] to [file://%5CUsers%5Cusername/Desktop/outBox?fileName=%24%7Bdate%3Anow%3AyyyyMMdd_HHmmss%7D.json]
20:52:54.593 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.processor.SendProcessor - >>>> https://api.github.com/search/repositories?q=microservice Exchange[ID-DESKTOP-N5C2HRA-64580-1476445962689-0-6]
20:52:54.596 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.http.HttpProducer - Executing http GET method: https://api.github.com/search/repositories?q=microservice
20:52:55.056 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.http.HttpProducer - Http responseCode: 200
20:52:55.485 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.processor.SendProcessor - >>>> file://%5CUsers%5Cusername/Desktop/outBox?fileName=%24%7Bdate%3Anow%3AyyyyMMdd_HHmmss%7D.json Exchange[ID-DESKTOP-N5C2HRA-64580-1476445962689-0-6]
20:52:55.489 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.file.FileOperations - Using InputStream to write file: C:\Users\username\Desktop\outBox\20161014_205255.json
20:52:55.539 [Camel (camel-1) thread #0 - timer://foo] DEBUG org.apache.camel.component.file.GenericFileProducer - Wrote [C:\Users\username\Desktop\outBox\20161014_205255.json] to [file://%5CUsers%5Cusername/Desktop/outBox?fileName=%24%7Bdate%3Anow%3AyyyyMMdd_HHmmss%7D.json]

ちなみに上手く出来ていない場合は、おそらくConnection time outなどが発生するかと思います。

設定不備で発生するタイムアウトサンプル
10 14, 2016 9:10:05 午後 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
情報: I/O exception (java.net.ConnectException) caught when processing request: Connection timed out: connect
10 14, 2016 9:10:05 午後 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry

・・・とか

java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)

で、今回は5秒毎にデスクトップ上のoutboxフォルダに検索結果が保存されていました。
無事プロキシを突破できているようです。

image

さらに

URIのオプションとしてproxyHostproxyPortを設定すると、Routeクラス側にプロキシ設定を寄せることも出来ます。
柔軟にプロキシ設定を追加したいときはこちらを使うことも検討ですかね。

Routeクラスに設定する方法
    @Override
    public void configure() throws Exception {
        from("timer://foo?period=5000")
                .to("https://api.github.com/search/repositories?q=microservice&proxyHost=www.myproxy.com&proxyPort=80")
                .to("file:{{env:HOMEPATH}}/Desktop/outBox?fileName=${date:now:yyyyMMdd_HHmmss}.json")
                ;
    }

最後に

Apache Camelのコンポーネントプログラムは簡単で良いですね。
ただし、最初は覚えることが一杯なので、色々遊んでみて挙動を抑えてみたり主要なオプションを覚えていくのが良い気がしました。
次はRabbitMQとの接続や、SQLコンポーネントを使ってみたいと思います。

参考

ma91n
🗽Backend Engineer 🏢Future所属 📝会社の技術ブログ運営者  ⛏趣味でGo製ツール開発してます 📢エモ記事はMediumに書いてます✨
https://medium.com/@laqiiz
future
ITを武器とした課題解決型のコンサルティングサービスを提供します
http://future-architect.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away