タグ

ブックマーク / nekop.hatenablog.com (40)

  • TomcatやJBossでHTTPリクエスト単位で並行実行数を制限するサーブレットフィルタ - nekop's blog

    WebLogicからの移行とかで、HTTPリクエスト単位で流量制御などの目的で並行実行数を制限したいという要望がたまにある。WebLogicではWork Managerというのがあって、これがHTTPリクエスト単位での設定なのだそうだ。 TomcatやJBossではApache httpdのMaxClientsと同じく、リクエスト単位ではなくクライアント単位(ソケット単位)でスレッドを割り当てる。このモデルでは、例えばmaxThreads="20"とかにしたら常に同時に20個のリクエストをさばいてくれる、という仮定は成り立たない。クライアントがkeep aliveで接続している間はスレッドも待ち続けるので、21番目のリクエストは先に接続した20のクライアントがkeep aliveを終了してコネクションを切断するまで処理されない。MaxClientsは名前の通りMaxClientsなのであっ

    TomcatやJBossでHTTPリクエスト単位で並行実行数を制限するサーブレットフィルタ - nekop's blog
  • OutOfMemoryErrorが発生したときにきちんとJavaプロセスを殺す - nekop's blog

    OutOfMemoryErrorが発生してもスレッドを異空間に葬るだけでJava VMはそのまま動き続ける場合があるけど、当然ながら状態に一貫性のない状態で動いている可能性があるわけで基的にはとっとと死んで欲しいわけである。一般的に言うところの「不定」状態。OOMEはErrorであってふつうの例外ではなく、致命的なJava VMエラーを示すものである。OOME発生後にプロセス再起動しないでそのままどうこうしようというのは絶対に避けた方が良い。 例えばJDBCのコネクションオープンしてDBからデータを読み込んでるときにOOMEが起きた場合、JDBCコネクションは大抵オープンしっぱなしで回収はされなかったりする。OOMEではfinallyブロックが呼ばれる保証はない。JDBCコネクションリークくらいならまだ良い方だが、これは全てに当てはまる。A-B-Cといったセットになっている処理は例外など

    OutOfMemoryErrorが発生したときにきちんとJavaプロセスを殺す - nekop's blog
  • java.util.loggingの闇 - nekop's blog

    Javaの1.4からjava.util.logging(以下JULと表記)というロギングパッケージが標準で使えるようになって、ログ出力のためにlog4jなどのサードパーティライブラリをいちいち導入したりする必要がなくなりみんな幸せになりました。 と言いたいところですこいつが超不便なAPIをしていてとてもとてもとっっっても使い辛い。ふざけんな。 まずさらっと使ってみましょう。Java 7です。 Logger.getGlobal().info("log") Logger.getLogger("foo").info("log") 出力はこうなります。 Jan 15, 2015 5:11:41 PM JUL main INFO: log Jan 15, 2015 5:11:41 PM JUL main INFO: log はい、キモイですね。軽くつっこむと なんで2行なんだよ 日時AM/PM表記か

    java.util.loggingの闇 - nekop's blog
  • jbundlerを利用してJRuby上でMavenのjarを利用する - nekop's blog

    Rubybundlerはざっくり言うと、JavaでのMavenで定義した依存関係のダウンロードとかしてくれる部分のRuby版です。JBundlerはJRuby向けにMavenの依存関係をよろしくやってくれます。 # Install jbundler (https://github.com/mkristian/jbundler) using gem jruby -S gem install jbundler # Create Gemfile for jbundler echo "gem 'jbundler'" > Gemfile # Create Jarfile, add Maven deps echo "jar 'org.infinispan:infinispan-core', '7.0.0.Beta1'" > Jarfile # Install deps jbundler instal

    jbundlerを利用してJRuby上でMavenのjarを利用する - nekop's blog
  • Java Day Tokyo 2014でテストのお話 - nekop's blog

    Java Day Tokyo 2014で「Javaアプリケーション開発におけるテストとTDDの実践」というセッションを@t_wadaと@shuji_w6eと@nekopの3人共演でやりました。講演中はいっぱいいっぱいなのであまりまわりの状況がよく見えていなかったのですが、250人の部屋が満席立ち見という状態になっていたみたいです。ありがとうございます。 こんな大規模なイベントを参加費無料かつすばらしい設備の会場でやるというのはとてもすごいことだと思います。OracleさんのJavaに対する姿勢が見えますね。ありがとうございました。 自分は統合テスト自動化というトピックで、より物に近い環境でテストすることの重要性とか、Arquillianイイヨー、統合テストのコスト下げられるよー、楽しいよー、ってお話をしました。スライドは以下のURLで公開しています。 http://nekop.githu

    Java Day Tokyo 2014でテストのお話 - nekop's blog
  • Oracle Java / OpenJDKの7と8でWildFly 8.0.0.Finalの起動時間 - nekop's blog

    Java 8が若干遅い。詳細はまだ調べていない。 Dell Latitude E6320, Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz 4 core, 16GB memory, WDC WD5000BEKT 7200rpm Fedora 20 64bit -Xmn256m -Xms512m -Xmx512m -Xverify:none -XX:+UseConcMarkSweepGC -XX:+TieredCompilation -XX:TieredStopAtLevel=1 $ java -version java version "1.7.0_51" Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.51-b

    Oracle Java / OpenJDKの7と8でWildFly 8.0.0.Finalの起動時間 - nekop's blog
  • Java 7 CMS GCの基本的な情報の整理 - nekop's blog

    バッチ処理などスループット重視のアプリケーションはデフォルトのパラレルGCで良いが、Java EEアプリケーションサーバなどレスポンスタイム重視のものやHadoopなどのクラスタ系ソフトウェアで死活監視に引っ掛る系などのstop the worldをなるべく避けたいいわゆるサーバ系ソフトウェアを運用する場合には、UseConcMarkSweepGCを付与して停止時間の短いCMS GCを使う。その場合にCMSのチューニングに踏み込もうとするとなんだか難しい記述がいっぱいで若干困るので、簡単なガイドをメモとして書いておく。 対象バージョンは以下。 $ java -version java version "1.7.0_51" OpenJDK Runtime Environment (fedora-2.4.5.1.fc20-x86_64 u51-b31) OpenJDK 64-Bit Serve

    Java 7 CMS GCの基本的な情報の整理 - nekop's blog
  • EJBとは - nekop's blog

    世に出ているEJBの説明はクソみたいなものが多く、簡潔に機能や特徴を記述しているものが見当たらないので書きました。Java EE 6, 7を対象として書いています。 EJBというのはJava EEアプリケーションサーバ上で利用できるJavaのコンポーネントです。トランザクション制御などの煩雑な部分をEJBが自動的に面倒を見てくれるので、開発者はEJBの基的なルールを抑えたあとはビジネスロジックの記述に集中することができる、というものです。EJBには4種類あります。 基となるステートレスセッションビーン (Stateless Session Bean, SLSB) 状態を保持できるステートフルセッションビーン (Stateful Session Bean, SFSB) 単一インスタンスのシングルトンセッションビーン (Singleton Session Bean, SSB) メッセージ(

    EJBとは - nekop's blog
  • JavaのCPUプロファイリング - nekop's blog

    JBoss / WildFly (全部俺) Advent Calendar 2013の19日目です。Java一般なトピック寄りで。 自分で主に利用するJavaのプロファイラはYourKitなのですが、YourKitを購入していない場合で性能問題を解析するときとかに何が使えるかなぁと思って調べてみました。 $ uname -a Linux localhost.localdomain 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux $ java -version java version "1.7.0_45" OpenJDK Runtime Environment (fedora-2.4.3.0.fc20-x86_64 u45-b15) OpenJDK 64-Bi

    JavaのCPUプロファイリング - nekop's blog
  • MavenではじめるJava EE - nekop's blog

    JBoss / WildFly (全部俺) Advent Calendar 2013の2日目です。ひとつJBoss製品のパッチバイナリをビルドしてテストチームに渡す段取りを終えて一息ついたところです。 Java EE Advent Calendar 2013というのもあるのですが今年も埋まったようで、楽しみです。今日はこちらもJBoss特化ではなくJava EE寄りの話題で。 Java EEのコードをMavenでビルドするときには<dependency>を定義するわけですが、記述方法をGoogle検索すると結構バリエーションが出てきたりして困ったりすることがあります。以下の例ではJava EE 6 にしていますが7でも一緒です。 一番シンプルなのはjavax:javaee-apiを使うものです。 <dependency> <groupId>javax</groupId> <artifact

    MavenではじめるJava EE - nekop's blog
  • GCログの相対時間を絶対時間に変換する - nekop's blog

    GCログの-XX:+PrintGCTimeStampsは起動時からの経過時間を行頭に付与する。最近のVMだと絶対時間を吐いてくれる-XX:+PrintGCDateStampsが使えるけど、前者しか付与されていない相対時間のGCログを解析する機会も結構ある。 というわけで相対時間を絶対時間に変換する。0.000に該当する基準となる時間を第一引数に渡す。 $ jruby gclog-converttime.rb '2012-01-02 03:04:05.006' gc.log require 'time' base_datetime_s = ARGV.shift base_datetime = Time.parse(base_datetime_s) delta = base_datetime.to_f while gets do if /^(\d+)\.(\d{3}):/ =~ $_.chom

    GCログの相対時間を絶対時間に変換する - nekop's blog
  • ModuleClassLoader - nekop's blog

    JBoss Advent Calendar 2012の12日目のエントリです。JBoss AS7のクラスローディングを行っているJBoss Modulesのクラスローダ、ModuleClassLoaderの実装を見ていきましょう。 ModuleClassLoaderの定義はModuleClassLoader extends ConcurrentClassLoaderとなっており、ConcurrentClassLoader extends SecureClassLoaderとなっています。一般的にクラスローダをちょこっとカスタマイズするときによく利用されるURLClassLoaderもextends SecureClassLoaderです。 ModuleClassLoaderもConcurrentClassLoaderも、ついでに言えばURLClassLoaderもJava 7では全てCla

    ModuleClassLoader - nekop's blog
  • JBoss AS7はなぜ速いのか - nekop's blog

    JBoss Advent Calendar 2012の11日目のエントリです。JJBugでJBoss AS7の起動がなんでそんな速いのか、という話が出たのでちょっと解説します。 JBoss AS7の起動速度が超高速なのにはいくつか理由があります。 マルチコア、マルチスレッドを有効活用するようになった JBoss AS7より前のバージョンは起動が遅かったのですが、起動プロセスがほぼシングルスレッドで行われていたので、CPUをきちんと使わずに起動していた、という点がまず一番大きな問題でした。AS7では開発当初からマルチスレッドを意識した起動処理の再デザインが行われ、サービスの依存関係を高速に解決し、依存のないものに関しては全て並行に起動するよう実装されています。 不要サービス遅延起動 使われていないサービスは起動が先延ばしされるようになりました。たとえばOSGiサービスはOSGiバンドルがデプ

    JBoss AS7はなぜ速いのか - nekop's blog
  • JBoss Developer Frameworkはじめました - nekop's blog

    JBoss Developer Frameworkというショーケースのようなプロジェクトがオープンしました。Java EE 6やJBossのプロジェクトをどのように利用し始めれば良いかという具体例やドキュメントを提供します。 クイックスタート クイックスタートでは現時点で53個の様々なテクノロジ(JAX-RS, GWT, HTML5など)を利用するクイックスタートプロジェクトを提供しています。 サンプルアプリケーション クイックスタートは確かに役に立ちますが、クイックスタートのようなごく小さいサンプル集ではなく、もう少し現実的な大きさのプロジェクトもあると良いですよね。というわけで、チケットモンスターという通常サイズのモダンなJava EE 6サンプルアプリケーションも用意されています。 マイグレーション Seam 2、Spring、Java EE 5プロジェクトからJava EE 6への

    JBoss Developer Frameworkはじめました - nekop's blog
  • Java EE環境における非同期プログラミング - nekop's blog

    Java EE環境では基的にスレッドの生成は許されていません。この制限はEJB仕様書に記述されており、ブループリントなど他のドキュメントにも記載されています。これらの制限はかなり古い時代に考えうる最大の制限を記述したものであり、「ファイルにアクセスしてはならない」など今となってはあまり現実的ではない記述も多くなっています。しかしながら、「スレッドを生成してはならない」というのは依然多くのコンテナに適用される現在も有効な制限であり、実際にスレッドの生成などを行うと誤動作するケースがあります。今回は、なぜこのスレッドの制限があるのか、現実的にどうすれば良いのか解説します。 コンテナは様々なものをスレッドに結びつけて管理しています。様々なものというのは例えばセキュリティ、トランザクション、データソースなどのコンテナリソースです。コードのほうがイメージしやすいでしょうから、以下に擬似コードを挙げ

    Java EE環境における非同期プログラミング - nekop's blog
  • Javaプログラムで自分自身のヒープダンプを吐く - nekop's blog

    自分で喉に指突っ込むみたいなアレですが、メモリリークの単体テスト書いててこのタイミングでヒープダンプ取りたいなー、というユースケースがあったので。 String heapDumpFilename = "heap.bin"; boolean liveOnly = true; MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName name = ObjectName.getInstance("com.sun.management:type=HotSpotDiagnostic"); String operation = "dumpHeap"; Object[] params = { heapDumpFilename, liveOnly }; String[] sig = { "java.lang.St

    Javaプログラムで自分自身のヒープダンプを吐く - nekop's blog
  • JBossがおかしい!あなたならどうしますか? - nekop's blog

    Java Advent Calendar 2011とJBoss Advent Calendar 2011の28日目のエントリです。タイトルはMySQLがおかしい!あなたならどうしますか? – MySQL Casual Advent Calendar 2011のパクリです。素晴らしいエントリですね。 このエントリでは対象をJBossとJava VMに置き換えてお送りします。 JBossがおかしい! (略) まずはserver.log このファイルがトラブルシューティングの基になります。WARNかERRORレベルで出力されているものをチェックすれば大抵何が起きているのかはわかります。ほとんどの場合はエラーメッセージや例外メッセージでぐぐるとそれなりに情報は出てくるでしょう。 $ grep -nEe "WARN|ERROR" server.log | less $ grep -nEe "WAR

    JBossがおかしい!あなたならどうしますか? - nekop's blog
  • JBoss Forge 1.0.0.Beta4を試す - nekop's blog

    JBoss Advent Calendar 2011の20日目のエントリです。JBoss Forge 1.0.0.Beta4がリリースされたので試してみます。 JBoss Forgeは超速Java EEアプリケーション開発を実現するためのツールです。元々Seam Forgeという名前でSeamのサブプロジェクトとして開発されたのですが、Seamへの依存は無く、JBossのプロジェクトとして独立しました。 さて、起動してみましょう。zipダウンロードして展開してJBOSS_HOMEを指定して起動します。 $ cd ~/tmp $ wget "https://repository.jboss.org/nexus/service/local/artifact/maven/redirect?r=releases&g=org.jboss.forge&a=forge-distribution&v=1.

    JBoss Forge 1.0.0.Beta4を試す - nekop's blog
  • Arquillianを使った本物のJava EEテスト その3 - nekop's blog

    JBoss Advent Calendar 2011の19日目のエントリです。 Arquillianを用いたテストではRemote, Managed, Embeddedという3種類のコンテナの使い方をサポートしています。それぞれ以下のようにテストを行います。 Remote 既に起動されているコンテナに対してテストを行う Managed 指定されたコンテナを利用してテストを行う、コンテナの起動と停止はArquillianが行う Embedded コンテナのEmbedded APIを利用してテスティングフレームワーク環境のJava VM上でコンテナを起動してテストを行う Arquillianがサポートするコンテナ一覧ドキュメントがありますが、JBoss AS 7はRemote, Managedがサポートされていて、Embeddedが未サポートです。ユーザからはJBoss AS 7のEmbedd

    Arquillianを使った本物のJava EEテスト その3 - nekop's blog
  • JBoss AS 7で外部からの接続を受け付ける - nekop's blog

    JBoss Advent Calendar 2011の16日目のエントリです。今日は小ネタ。 JBoss ASは、不用意にアプリケーションサーバを外部公開しないようデフォルトではローカルアドレス(127.0.0.1)にサーバソケットをバインドします。つまり、別のPCなどから http://<そのPCのアドレス>:8080/ などにアクセスしても繋がらないようになっています。 外部公開状態で起動するには以下のように-b 0.0.0.0を起動オプションに追加指定します。0.0.0.0はワイルドカードアドレス、もしくはANYアドレスと呼ばれるアドレスです。 $ ./standalone.sh -b 0.0.0.0 AS7系では7.0.2.Finalで-bオプションが再実装されたので、7.0.0, 7.0.1では利用できないことに注意してください。

    JBoss AS 7で外部からの接続を受け付ける - nekop's blog