nekop's blog

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

全部入りEJBをGlassFish 4.0で動かす

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

ちょっと脇道にそれて全部入りEJBGlassFish 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)

ここまで確認して一旦終わりにします。