2

Apache TomEE+ に 2 つの Web アプリケーションをデプロイしています。最初の webapp では、次のように宣言されたシングルトン EJB クラスを作成しました。

@Singleton
@Remote
@Startup
@Lock(READ)
public class SolverRegistryBean implements SolverRegistry
{
    // ...

openejb.log から、シングルトンが利用可能であることがわかります。

2011-12-05 20:43:22,696 - INFO  - Jndi(name=SolverRegistryBeanRemote) --> Ejb(deployment-id=SolverRegistryBean)
2011-12-05 20:43:22,696 - INFO  - Jndi(name=global/localhost/SolverCore-1.0/SolverRegistryBean!grid.solver.SolverRegistry) --> Ejb(deployment-id=SolverRegistryBean)
2011-12-05 20:43:22,696 - INFO  - Jndi(name=global/localhost/SolverCore-1.0/SolverRegistryBean) --> Ejb(deployment-id=SolverRegistryBean)
2011-12-05 20:43:22,750 - INFO  - Started Ejb(deployment-id=SolverRegistryBean, ejb-name=SolverRegistryBean, container=My Singleton Container)

他のアプリからそのシングルトン Bean にアクセスしたいので、次のようにします。

Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,
    "org.apache.openejb.client.RemoteInitialContextFactory");
p.put("java.naming.provider.url", "http://127.0.0.1:8080/openejb/ejb");
try {
    ctx = new InitialContext(p);
    SolverRegistry reg = (SolverRegistry)ctx.lookup(
        "openejb:global/global/localhost/SolverCore-1.0/SolverRegistryBean");

しかし、その後 ClassCastException が発生します

java.lang.ClassCastException: $Proxy94 cannot be cast to grid.solver.SolverRegistry

この $Proxy94 クラスがインターフェースを実装していることを確認しました: grid.solver.SolverRegistryorg.apache.openejb.core.ivm.IntraVmProxyorg.apache.openejb.BeanContext$Removable

なぜこれが機能しないのですか?

4

1 に答える 1

2

ルックアップ行を次のように変更して、問題を解決しました。

SolverRegistry reg = (SolverRegistry)ctx.lookup("SolverRegistryBeanRemote");

openejb:global/global/localhost/SolverCore-1.0/SolverRegistryBeanが何であるかはまだわかりません。

于 2011-12-13T00:03:40.147 に答える