2015-12-10 5 views
7

私はDropwizard(v 0.7.1)ベースのJersey RESTサービスを持っています。現在、私は1つのアプリケーションコネクタポート(8810)を使用しており、2つのリソース(「/ path1」、「/ path2」など)を持っています。Dropwizard - 複数のポートのリソース

http:\\ localhost:8810 \ path1とhttp:\\ localhost:8810 \ path2として、これらのリソースにそれぞれアクセスできます。達成しようとしているのは、各リソースに別のポートがあることです。 (例:http:\\ localhost:8810 \ path1、http:\\ localhost:8820 \ path2)。私は以下の設定をするためにyamlファイルを調整しました。アプリケーションを起動したときに、両方のポートを使用して両方のリソースを利用でき、特定のポートを使用するようにこれらのリソースを設定する方法がわからない、またはDropwizardでも可能です。

server: 
    applicationConnectors: 
    - 
    type: http 
    port: 8810 
    - 
    type: http 
    port: 8820 

誰かが啓蒙できるのであれば、気をつけてください。あなたの問題はDefaultServerFactoryが同じハンドラにすべてapplicationConntectorsを追加することである

おかげ

+0

私は興味があります - 別のポートで各リソースを実行する理由は何ですか? –

+0

私は同じ必要があります。問題はセキュリティです。一部のサービスは外部に公開する必要があり、一部はサブネットのみに公開する必要があります。すべてのプライベートサービスを別のポートに置き、ファイアウォール内のそのポートへのアクセスをブロックすると、あなたはうまくいきます。 – ccleve

答えて

2

、DefaultServerFactory#ビルドを参照してください。何をする必要がある独自のServerFactoryを実装

@Override 
public Server build(Environment environment) { 
    printBanner(environment.getName()); 
    final ThreadPool threadPool = createThreadPool(environment.metrics()); 
    final Server server = buildServer(environment.lifecycle(), threadPool); 

    LOGGER.info("Registering jersey handler with root path prefix: {}", applicationContextPath); 
    environment.getApplicationContext().setContextPath(applicationContextPath); 
    final Handler applicationHandler = createAppServlet(server, 
                 environment.jersey(), 
                 environment.getObjectMapper(), 
                 environment.getValidator(), 
                 environment.getApplicationContext(), 
                 environment.getJerseyServletContainer(), 
                 environment.metrics()); 

    LOGGER.info("Registering admin handler with root path prefix: {}", adminContextPath); 
    environment.getAdminContext().setContextPath(adminContextPath); 
    final Handler adminHandler = createAdminServlet(server, 
                environment.getAdminContext(), 
                environment.metrics(), 
                environment.healthChecks()); 
    final RoutingHandler routingHandler = buildRoutingHandler(environment.metrics(), 
                   server, 
                   applicationHandler, 
                   adminHandler); 
    server.setHandler(addStatsHandler(addRequestLog(server, routingHandler, environment.getName()))); 
    return server; 
} 

です。

DefaultServerFactoryを拡張し、ビルドメソッドを上書きして、必要な方法でコネクタを設定できます。 おそらく、どこに行くのかを示す設定をいくつか追加したいと思うでしょう。あなたのyamlに関して、特定のコネクタにリソースをマップすることはできないからです。 dropwizardはどうしたらそれについて知っているだろうか? dropwizardの動作を上書きするために

(新しいServerFactoryを追加する)あなたはこの記事を参照することができ、私はログを追加する方法について書きました:Dropwizard doesn't log custom loggers to file

それは基本的にクラスを実装し、dropwizardのため、それは発見することが含まれます。その後、正しいServerFactoryを指すようにyamlファイルを変更するだけです。

この方法が嫌いなら、設定のget/setメソッドを上書きしてクラスを返すことができます。このため、あなたのクラスはDefaultServerFactoryを拡張しなければなりません。さもなければ、yamlマッピングはもはや動作しません。ただし、ビルドメソッドは、それにかかわらず上書きすることができます。

更新:

は、もう少し詳細にそれを見て、あなたは第二の問題に遭遇します:

あなたの環境は、それが使用できる1つのジャージ環境を持っています。 現在、デフォルトでは、各ハンドラには同じJersey設定が渡される(存在する唯一のもの)ため、2番目のジャージ環境を設定する必要があります。これが、すべてのhttp設定で利用できるようになる理由です。要約中のSO:

  1. はジャージの設定が属するかを知っているサーバーの工場を作成し、複数のジャージ構成
  2. をサポートする新しい環境を作成したハンドラーとそのフォーム内のハンドラをインスタンス化します。

私はこれらの2つのステップが必要と考えています。

環境面では、独自のServerCommand(dropwizardサーバーを起動するコマンド)を作成する必要があります。 EnvironmentCommand#を見ると、環境の作成場所を確認できます。これは、私が知っている限り、デフォルトの環境を上書きすることができる唯一の場所で、複数のジャーナル設定をサポートするために必要なものです。

あなたに正直言って、これを見ると、私はこれがドロップワイザーの男が心に持っていたものだとは思わない。

関連する問題