1

2 つの JBoss スタナロン インスタンスを実行しています。1 つはサーバーとして機能し、もう 1 つはクライアントとして機能します。

サーバ:

リモートインターフェース

package com.xyz.life.service.ejb;

import java.io.Serializable;
import java.rmi.RemoteException;
import javax.ejb.EJB;
import javax.ejb.Remote;

@Remote
public interface QuoteFacade extends Serializable{
    public boolean isAlive()    throws RemoteException;
}

EJB実装

package com.xyz.life.common.component.ejb.services;

import java.rmi.RemoteException;
import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless(mappedName = "QuoteFacadeEJB")
@Remote(QuoteFacade.class)
public class QuoteFacadeEJB extends CommonSessionBean implements QuoteFacade {
    private static final long serialVersionUID = -8788783322280644881L;

    @Override
    public boolean isAlive() throws RemoteException {
        return true;
    }
}

サーバーログ

16:40:25,012 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-4) JNDI bindings for session bean named QuoteFacadeEJB in deployment unit subdeployment "quote.jar" of deployment "quote.ear" are as follows:
        java:global/quote/quote.jar/QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
        java:app/quote.jar/QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
        java:module/QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
        java:jboss/exported/quote/quote.jar/QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
        java:global/quote/quote.jar/QuoteFacadeEJB
        java:app/quote.jar/QuoteFacadeEJB
        java:module/QuoteFacadeEJB

クライアント

public void testClient() {
        try {
            Hashtable<String, Object> jndiProps = new Hashtable<String, Object>();
            jndiProps.put(Context.URL_PKG_PREFIXES, JNDINames.JBOSS_CLIENT_NAMING_PREFIX);
            jndiProps.put("jboss.naming.client.ejb.context", true);
            Context ctx = new InitialContext(jndiProps);

            String name = "ejb:global/quote/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade";
            /*
            "ejb:global/quote/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",
            "ejb:app/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",
            "ejb:jboss/exported/quote/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade"
            */

            Object ref = ctx.lookup(name);
            QuoteFacade quoteFacade = (QuoteFacade) ref;
            LOGGER.debug("isAlive : " + quoteFacade.isAlive());
        } catch (Exception e) {
            LOGGER.error("Remote Client Exception : ", e);
        }
    }

サーバー側にエラー/ログはありません。クライアント側では、次のエラーで失敗しています:

java.lang.IllegalStateException: No EJB receiver available for handling [appName:global,modulename:quote,distinctname:quote.jar] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@200cae

    at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:584)

    at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:119)

    at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)

    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136)

    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121)

    at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104)

    at $Proxy10.isAlive(Unknown Source)

プロパティファイルを使用せずに試しました:

private static QuoteFacade connectToStatelessBean(String name) throws NamingException {  

        Properties jndiProperties = new Properties();  
        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");  
        jndiProperties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");  
        jndiProperties.put(javax.naming.Context.PROVIDER_URL, "remote://localhost:4447");  
        jndiProperties.put(javax.naming.Context.SECURITY_PRINCIPAL, "admin");  
        jndiProperties.put(javax.naming.Context.SECURITY_CREDENTIALS, "Pass1234");  
        final Context context = new InitialContext(jndiProperties);  

        return (QuoteFacade) context.lookup(name);  
    }  
    public static void testLocal() {  
        String[] JNDINAME1 = {  

        "ejb:global/quote/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",  
        "ejb:app/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",  
        "ejb:module/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",  
        "ejb:jboss/exported/quote/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",  
        "ejb:global/quote/quote.jar/QuoteFacadeEJB",  
        "ejb:app/quote.jar/QuoteFacadeEJB",  
        "ejb:module/QuoteFacadeEJB"  
    };  
    for(int i=0;i<JNDINAME1.length;i++){  
        try {  
            QuoteFacade test1 = connectToStatelessBean(JNDINAME1[i]);  
            LOGGER.error("DSLKAJDLAS : " + test1.isAlive());  
        } catch (Exception e) {  
            LOGGER.error("DSLKAJDLAS : " , e);  
        }  

    }  
    LOGGER.info("Done - SANSSAN!!!!!!!!");  
}  

今回は、別の例外:

14.01.2013 17:40:37.627 [ERROR] - EJBClient - DSLKAJDLAS :   
javax.naming.NamingException: JBAS011843: Failed instantiate InitialContextFactory org.jboss.naming.remote.client.InitialContextFactory from classloader ModuleClassLoader for Module "deployment.quote.war:main" from Service Module Loader  
    at org.jboss.as.naming.InitialContextFactoryBuilder.createInitialContextFactory(InitialContextFactoryBuilder.java:64)  
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:681)  
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)  
    at javax.naming.InitialContext.init(InitialContext.java:242)  
    at javax.naming.InitialContext.><init>(InitialContext.java:216)  
    at com.xyz.life.test.EJBClient.connectToStatelessBean(EJBClient.java:208)  
    at com.xyz.life.test.EJBClient.testLocal(EJBClient.java:225)  
    at com.xyz.life.test.EJBClient.test(EJBClient.java:172)  
    at com.xyz.life.common.web.struts.plugin.FrameworkStartupPlugIn.init(FrameworkStartupPlugIn.java:99)  
    at org.apache.struts.action.ActionServlet.initModulePlugIns(ActionServlet.java:1158)  
    at org.apache.struts.action.ActionServlet.init(ActionServlet.java:473)  
    at javax.servlet.GenericServlet.init(GenericServlet.java:242)  
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1202)  
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1102)  
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3655)  
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3873)  
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90)  
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)  
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)  
    at java.lang.Thread.run(Thread.java:722)
4

2 に答える 2

3

から「グローバル」を削除してみてくださいname:

String name =
  "ejb:quote/quote.jar/QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade"

また、パッケージ名はcom.xyz.life.service.ejb(サーバー ログに表示されるように) であり、 ではありませんcom.ge.life.annuity.service.ejb

とにかく、ここで説明されているように、リモート EJB 呼び出しにリモート ネーミング プロジェクトを使用することは推奨されません。

... . ご覧のとおり、リモート ネーミング プロジェクトを使用するのではなく、EJB ルックアップ/呼び出しに EJB クライアント API を使用することで、特定の操作を最適化することができました。EJB のそのような最適化を実行するためのインテリジェンスを持たないリモートネーミングプロジェクトに対して、クライアントアプリケーションでのリモート EJB 呼び出しに使用される場合に優れている他の EJB クライアント API 実装の詳細 (およびおそらくさらに追加される可能性があります) があります。呼び出し。そのため、リモート EJB 呼び出しのリモート ネーミング プロジェクトは「非推奨」と見なされます。...

ここで、EJB クライアント API を使用してリモート EJB 呼び出しを行う方法を確認できます。

于 2013-01-15T13:53:30.427 に答える
0

それを見つけた....

私がローカルマシンにのみ使用したもの。JBoss インスタンスの違い、JNDI ルックアップ名を変更する必要があります...

お気に入り

ejb:quote/quote.jar//QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
于 2013-01-15T16:49:51.183 に答える