当前位置: 首页 > 知识库问答 >
问题:

创建EJB远程客户端时没有可用的EJB接收器

印飞捷
2023-03-14

我知道很多人已经询问了这个错误,但我仍然找不到解决方案,我按照本教程创建了一个远程客户端,访问驻留在Wildfly 10服务器上的Bean,该服务器运行在地址:localhost:8082。这是我的代码:

我的界面:

package ejb.remote.stateless;
import javax.ejb.Remote;

@Remote
public interface RemoteCalculator {
    int add(int a, int b);
    int subtract(int a, int b);
}

我的Bean:

package ejb.remote.stateless;
import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
@Remote(RemoteCalculator.class)
public class CalculatorBean implements RemoteCalculator {

    @Override
    public int add(int a, int b) {
        return a+b;
    }

    @Override
    public int subtract(int a, int b) {
        return a-b;
    }

}

我的远程客户端:

package ejb.remote.client;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;


import ejb.remote.stateful.CounterBean;
import ejb.remote.stateful.RemoteCounter;
import ejb.remote.stateless.CalculatorBean;
import ejb.remote.stateless.RemoteCalculator;

public class RemoteEJBClient {

    public static void main(String[] args) throws NamingException {

         // Invoke a stateless bean
        invokeStatelessBean();
    }

    /**
     * Looks up a stateless bean and invokes on it
     *
     * @throws NamingException
     */
    private static void invokeStatelessBean() throws NamingException {

        final RemoteCalculator statelessRemoteCalculator = lookupRemoteStatelessCalculator();
        System.out.println("Obtained a remote stateless calculator for invocation");

        int a = 204;
        int b = 340;
        System.out.println("Adding " + a + " and " + b + " via the remote stateless calculator deployed on the server");
        int sum = statelessRemoteCalculator.add(a, b);
        System.out.println("Remote calculator returned sum = " + sum);
        if (sum != a + b) {
            throw new RuntimeException(
                    "Remote stateless calculator returned an incorrect sum " + sum + " ,expected sum was " + (a + b));
        }

        int num1 = 3434;
        int num2 = 2332;
        System.out.println("Subtracting " + num2 + " from " + num1
                + " via the remote stateless calculator deployed on the server");
        int difference = statelessRemoteCalculator.subtract(num1, num2);
        System.out.println("Remote calculator returned difference = " + difference);
        if (difference != num1 - num2) {
            throw new RuntimeException("Remote stateless calculator returned an incorrect difference " + difference
                    + " ,expected difference was " + (num1 - num2));
        }
    }

    private static RemoteCalculator lookupRemoteStatelessCalculator() throws NamingException {

        final Hashtable jndiProperties = new Hashtable();
        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
        jndiProperties.put("jboss.naming.client.ejb.context", true);

        final InitialContext context = new InitialContext(jndiProperties);

        final String appName = "";

        final String moduleName = "jboss-as-ejb-remote-app";

        final String distinctName = "";

        final String beanName = CalculatorBean.class.getSimpleName();

        final String viewClassName = RemoteCalculator.class.getName();


        return (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);

    }

}

然后我还在项目的src/文件夹中添加了一个jboss-ejb-client.properties文件,如下所示:

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false

remote.connections=default

remote.connection.default.host=localhost
remote.connection.default.port = 8082
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

我的操作与教程完全相同,但仍然会出现错误:

Exception in thread "main" java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:, moduleName:jboss-as-ejb-remote-app, distinctName:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@4d41cee
    at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:798)
    at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:128)
    at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
    at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255)
    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200)
    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183)
    at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146)
    at com.sun.proxy.$Proxy0.add(Unknown Source)
    at ejb.remote.client.RemoteEJBClient.invokeStatelessBean(RemoteEJBClient.java:36)
    at ejb.remote.client.RemoteEJBClient.main(RemoteEJBClient.java:20)

有人能帮我解决这个问题吗?谢谢

共有1个答案

华修永
2023-03-14

代码没问题。正如教程中提到的,您必须确保jboss-ejb-client.properties文件位于真正的类路径上。然后它应该可以工作!(我甚至可以通过将jboss-ejb-client.properties移出类路径来重现您的问题)

提示:将这些文件放在src/main/Resources下是很传统的(尤其是对于maven项目)。

有关更多信息,请参阅github。com/wildfly/quickstart/ejb-remote,该项目与教程中的项目相同。

 类似资料:
  • 问题内容: 根据EJB客户端应用程序上的Netbeans教程,我似乎无法调用该方法: 编译错误: 客户: ejb: 远程接口: 现在,如果接口被修改: Bean现在可以使用以下方法: 但是,有一个NPE: 如何正确调用该方法?EJB未实例化? 问题答案: 我从头开始。我能想到的唯一区别是,我没有创建EJB应用程序,而是为bean创建了EJB模块。否则,我认为是相同的。 结构体: 客户代码: 豆:

  • 我希望能够有两个Wildfly(或JBoss7)实例,其中一个服务器与另一个服务器上的EJB对话。棘手的部分是,根据文档,需要创建带有出站套接字绑定的远程出站连接。这对我们的运营团队来说是一个很大的麻烦,尤其是当我们想要扩展的时候。

  • 我是JBoss 7的新手。我面临着奇怪的行为。有时,当我试图调用会话bean时,会遇到以下异常: 这通常发生在从Eclipse运行GWT应用程序时。异常并不总是发生。有时它比其他情况发生得少。有时每次我调用会话bean时都会发生这种情况,这很痛苦。我阅读了教程(https://docs.jboss.org/author/display/AS71/EJB使用JNDI从远程客户端调用_sscc=t),

  • 问题内容: 我目前正在将代码从Jboss7迁移到Wildfly10。 服务器本身完全可以启动。当尝试将我们的客户端与正在运行的新wildfly10服务器进行ejb-remote调用连接时,它将无法正常工作。 我唯一要使用的是以下错误: org.jboss.ejb.client.remoting.ConfigBasedEJBClientContextSelector setupEJBReceiver

  • 我目前正在将我们的代码从Jboss7迁移到Wildfly10。 服务器本身启动完全正常。当尝试将我们的客户端与正在工作的新Wildfly10服务器连接以进行ejb远程调用时,它就是不起作用。 我唯一可以处理的是以下错误: 组织。jboss。ejb。客户远程处理。ConfigBasedEJBClientContextSelector setupEJBReceivers警告:无法注册EJB接收器以连接

  • 我的EJBTest有问题。 我安装了WildFly并配置了用户管理和应用程序管理。 我编写了一个EJB 3.0并进行了部署: 之后,我编写了一个简单的客户端来连接它: 用户名和密码都是应用程序用户凭据,而不是管理!对吗? 我收到以下错误: 线程“main”java中出现异常。lang.IllegalStateException:EJBClient00025:没有可用于处理调用上下文组织的[appN