JBoss EAP 6.2のリモートEJB呼び出しの中身を覗く
JBoss / WildFly (全部俺) Advent Calendar 2013の10日目です。昨日のJava EE Advent Calendar 2013でemaggameさんがUndertowについて書いてくれました。Undertowの詳細に関しては以下のビデオなども役立つと思います。
さて、昨日の続きでEJBを並列で2つリモート呼び出しして、クライアントとサーバ共にjstack、およびnetstatを取得してみましょう。EJBは指定したmsだけsleepするだけのメソッドです。
実行してnetstatを取得するとソケットは一つだけです。muxですね。
$ netstat -tn | grep 4447 tcp 0 0 127.0.0.1:33068 127.0.0.1:4447 ESTABLISHED tcp 0 0 127.0.0.1:4447 127.0.0.1:33068 ESTABLISHED
サーバ側はRemotingのread, write, taskという3種のスレッド群で通信が処理されているようです。通信以外の実際のEJB呼び出しはEJBのスレッドプールに渡されて処理されています。
クライアントは呼び出しの2スレッドの他に、EJBクライアントのスレッドプールのスレッドがいくつかと、Remotingの3種のスレッド群がいくつか、というスレッド構成はサーバ側と大差ないようです。
クライアントは以下のように書き換えました。
require 'java' JBOSS_HOME="/home/nekop/eap6" require "#{JBOSS_HOME}/bin/client/jboss-client.jar" require "./example-as7-ejb.jar" java_import "java.util.Properties" java_import "javax.naming.Context" java_import "javax.naming.InitialContext" def initial_context p = Properties.new() p.put("remote.connections", "default") p.put("remote.connection.default.port", "4447") p.put("remote.connection.default.host", "localhost") p.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false") p.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming") p.put("org.jboss.ejb.client.scoped.context", true) InitialContext.new(p) end def hello_slsb(ejb_context) ear_name = "" ejbjar_name = "example-as7-ejb" ejb_name = "HelloSLSB" interface_name = "jp.programmers.examples.ejb3.slsb.Hello" ejb_context.lookup("#{ear_name}/#{ejbjar_name}/#{ejb_name}!#{interface_name}") end ejb_context = initial_context.lookup("ejb:") begin t1 = Thread.new do hello_slsb(ejb_context).sleep(20000) end t2 = Thread.new do hello_slsb(ejb_context).sleep(20000) end t1.join t2.join ensure begin ejb_context.close rescue # no-op end end
そうそう、UndertowのLive from the living roomというバージョンもあってこっちも結構好きです。
明日は会社おやすみして子供と遊びに行きます。