全部入りEJBをGlassFish 4.0で動かす
JBoss / WildFly (全部俺) Advent Calendar 2013の15日目です。
ちょっと脇道にそれて全部入りEJBをGlassFish 4.0で動かしてみます。デプロイするモノは一緒です。
GlassFishのクライアントはInitialContextを引数なしでnewしてOKということになっているのですが、Thread context class loaderからgetResource("jndi.properties")するとglassfish-naming.jarが持っているようです。これはjndi.propertiesがクラスパス上他にも存在していたりするとハマりそうですね。
jar:file:/home/nekop/tmp/glassfish4/glassfish/modules/glassfish-naming.jar!/jndi.properties
その中身をチラっと追うとデフォルトでRMI-IIOP使うようです。RMI-IIOPなのでJBoss EAPと同じようにパフォーマンスを見るとやはりそれほど速くはないですね。良い子はJAX-RS使いましょう。
14.860000 1.970000 16.830000 ( 11.275000)
JAX-WSは問題なく動きます。
JAX-RSのアノテーションがインタフェースに定義されているのが関連しているのか、実行時に以下のようにインタフェースにコンストラクタが無いというエラーになり正常に実行できません。デプロイ時は問題なさそうです。自分のてきとーに書いたコードが悪いのか、GlassFishの問題なのかの切り分けはしていません。
[2013-12-16T16:48:22.547+0900] [glassfish 4.0] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=23 _ThreadName=http-listener-1(5)] [timeMillis: 1387180102547] [levelValue: 900] [[ StandardWrapperValve[com.github.nekop.examples.HelloApplication]: Servlet.service() for servlet com.github.nekop.examples.HelloApplication threw exception java.lang.NoSuchMethodException: Could not find a suitable constructor in com.github.nekop.examples.HelloLocal class. at org.glassfish.jersey.internal.inject.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:182) at org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:155) at org.jvnet.hk2.internal.Utilities.justCreate(Utilities.java:817) at org.jvnet.hk2.internal.ServiceLocatorImpl.create(ServiceLocatorImpl.java:772) at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:862) at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:855) at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:173)
ここまで確認して一旦終わりにします。