Liberty Client で EJB を動かす

# 目的

Liberty Client でEJBにアクセスするプログラムをテストして Gitに公開したかったのですが、動かすところまではできました。ただ動きが不安定で、検証を完了して公開するまでに時間がかかりそうなため、試行錯誤したところを備忘録としてのこしていきます。

# クラスがみつからない

EARにパッケージしたはずのクラスがロードできない。テストを継続するため共有ライブラリに配置してロード出きるように調整した。client.xml はこの時点で以下の構成

```client.xml
<client description="new client">
    <featureManager>
        <feature>javaeeClient-8.0</feature>
	<feature>appSecurityClient-1.0</feature>
    </featureManager>

    <library id="ejb-lib">
	    <fileset dir="..." includes="*.jar" />
    </library>

    <application id="ejb-client" name="ejb-client" type="ear" location="ejb-ear.ear">
	    <classloader commonLibraryRef="ejb-lib" />
    </application>
    
</client>
```

# JNDIのLookupが失敗する １

EJBのLookupが失敗してしまう。エラー自体に違いがでないのだけどSSLの設定ができてないと別のエラーメッセージがでているので、そのエラーに対処してみる。

サーバー側の key.p12 をクライアント側にコピーして、defaultKeyStore とパスワードを指定する。

以下の構成を client.xml に追加

```client.xml
<keyStore id="defaultKeyStore" location="key.p12" password="passw0rd" />
```



# JNDIのLookupが失敗する ２

認証が失敗しているようなエラーがでている。server.xml の認証を無効にして、client.xml の認証をしていしてみる。

以下の構成を client.xmlに追加

``` client.xml
    <orb id="defaultOrb">
         <clientPolicy.clientContainerCsiv2>
		 <layers>
			 <authenticationLayer user="wsadmin" password="passw0rd" />
		 </layers>
	 </clientPolicy.clientContainerCsiv2>
    </orb>
```

以下の構成を server.xml に追加


```server.xml
    <orb id="defaultOrb">
         <serverPolicy.csiv2>
		 <layers>
			 <authenticationLayer establishTrustInClient="Never"/>
		 </layers>
	 </serverPolicy.csiv2>
    </orb>

    <basicRegistry id="basic" realm="BasicRealm">
        <user name="wsadmin" password="passw0rd"/>
    </basicRegistry>
```

もとの構成は

https://github.com/pdprof/ejb-jndi/blob/main/ejb-jndi-docker/config/server.xml


# JNDIのLookupが失敗する ３

client側のルックアップ先のアドレスの設定先がただしいかよくわからないが、Application Client のMainクラスの EJB Annotaionの指定と ibm-application-client-bnd.xml のバインディング名を調整する。

```Main.class
public class Main {
	
	@EJB(name = "ejb/Hello")
	static HelloRemote hello;
	
	public static void main(String[] args) {
		System.out.println(hello.hello());
	}

	public Main() {
		super();
	}
}
```

``` ibm-application-client-bnd.xml
<?xml version="1.0" encoding="UTF-8"?>
<application-client-bnd 
	xmlns="http://websphere.ibm.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-application-client-bnd_1_0.xsd"
	version="1.0">

	<ejb-ref name="ejb/Hello" binding-name="corbaname::localhost:2809#ejb/global/ejb-ear/ejb-lib/Hello!pdprof.ejb.view.HelloRemote" />
</application-client-bnd>
```

messages.lognに出力されていたログは以下
```messages.log
[8/31/24 22:02:15:380 JST] 00000042 com.ibm.ws.ejbcontainer.osgi.internal.NameSpaceBinderImpl    I CNTR0167I: The server is binding the pdprof.ejb.view.HelloRemote interface of the Hello enterprise bean in the ejb-lib.jar module of the ejb-ear application.  The binding location is: ejb/ejb-ear/ejb-lib.jar/Hello#pdprof.ejb.view.HelloRemote
[8/31/24 22:02:15:382 JST] 00000042 com.ibm.ws.ejbcontainer.osgi.internal.NameSpaceBinderImpl    I CNTR0167I: The server is binding the pdprof.ejb.view.HelloRemote interface of the Hello enterprise bean in the ejb-lib.jar module of the ejb-ear application.  The binding location is: pdprof.ejb.view.HelloRemote
[8/31/24 22:02:15:382 JST] 00000042 com.ibm.ws.ejbcontainer.runtime.AbstractEJBRuntime           I CNTR0167I: The server is binding the pdprof.ejb.view.HelloRemote interface of the Hello enterprise bean in the ejb-lib.jar module of the ejb-ear application.  The binding location is: java:global/ejb-ear/ejb-lib/Hello!pdprof.ejb.view.HelloRemote
[8/31/24 22:02:15:382 JST] 00000042 com.ibm.ws.ejbcontainer.osgi.internal.NameSpaceBinderImpl    I CNTR0167I: The server is binding the pdprof.ejb.Hello interface of the Hello enterprise bean in the ejb-lib.jar module of the ejb-ear application.  The binding location is: ejblocal:ejb-ear/ejb-lib.jar/Hello#pdprof.ejb.Hello
[8/31/24 22:02:15:383 JST] 00000042 com.ibm.ws.ejbcontainer.osgi.internal.NameSpaceBinderImpl    I CNTR0167I: The server is binding the pdprof.ejb.Hello interface of the Hello enterprise bean in the ejb-lib.jar module of the ejb-ear application.  The binding location is: ejblocal:pdprof.ejb.Hello
[8/31/24 22:02:15:383 JST] 00000042 com.ibm.ws.ejbcontainer.runtime.AbstractEJBRuntime           I CNTR0167I: The server is binding the pdprof.ejb.Hello interface of the Hello enterprise bean in the ejb-lib.jar module of the ejb-ear application.  The binding location is: java:global/ejb-ear/ejb-lib/Hello!pdprof.ejb.Hello

```

# JNDIのLookupが失敗する ４

なぜかモジュールを更新したはずなのに、古いままで動作しているような気がする。
client ディレクトリの logs と workarea を削除してキャッシュの削除をすると更新されました。


# まとめ

動くようになりましたが git レポジトリに公開していつでも動かせるようにするには時間がかかりそうなので試行錯誤の備忘録とて公開します。