読者です 読者をやめる 読者になる 読者になる

nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

Undertowのソースツリーを眺める

wildfly

JBoss / WildFly (全部俺) Advent Calendar 2013の24日目です。

Undertowのソースツリーをおもむろに見てみます。

io.undertow

UndertowというUndertowのサーバのビルダークラスとHandlersという各HttpHandlerのビルダークラス。あとはロギングクラスとかなのでスルー。

io.undertow.attribute

ExchangeAttributeというクラス群。ServiceLoaderでロードされているので、META-INF/services/io.undertow.attribute.ExchangeAttributeBuilderに実装クラスが羅列されている。

io.undertow.channels

書き込み用のDetachableStreamSinkChannelと読み込み用のDetachableStreamSourceChannel。リクエスト毎にI/Oを切り離すために使われてるっぽい。

他にもChannelがいくつかあるけど使われているようには見えず、調べてみるとこれら使われていないchannel群はBeta8でconduitと呼ばれる仕組みに置き換わっている。

io.undertow.client

HTTPクライアントAPI。後で遊ぼう。

io.undertow.conduits

conduit(コンディット)とは導管、ルート、パイプという意味らしい。NIOのChannelにデコレータパターンを当てはめてフィルタ処理とかするためのAPIっぽい。

io.undertow.io

送信処理と送信完了およびエラーのコールバックAPI、非同期送信と同期送信の実装が同梱されている。

io.undertow.predicate

リクエストの前提条件を組み立てるAPIと前提条件式のパーサ、リライト処理の条件式などで利用。

io.undertow.security

セキュリティ関連。

io.undertow.server

サーバ実装のためのAPI。リクエストレスポンスのデータを全て保持しているHttpServerExchangeクラスと、HTTPに関するさまざまな処理を行うHttpHandlerの実装クラスが含まれている。

io.undertow.util

かなりごった煮。multipartのパーサなど、HTTP関連のめんどくさそうな処理の実装とかがほとんどこの中に居そう。

io.undertow.websockets

JSR 356の実装のベースとなるWebSocket関連のAPI。JSR 356実装自体は別のサブプロジェクトになっている。

番外編

channels見ているときにxnioのソースツリーも参照したんだけどjava/nio/channels/FileChannel.javaというのが存在していて何だろなと思ったらJava 6とJava 7でAPI違う部分のクロスコンパイルのためのもの。

感想

XNIOも含めてI/Oものすごい作り込まれてる印象、読むのなかなか大変。というかNIOが大変。