首页 > 解决方案 > 从节点调用 EJB 客户端

问题描述

你肯定会注意到,我对 EJB 和 Wildfly 还很陌生,但我正在尽我所能去理解,做一些实验。问题是,我想从另一个客户端节点运行一个简单的 EJB(有状态计数器),部署在 Wildfly(来自 jar)中。为此,我使用 Vagrant 创建了 2 个虚拟机,第一个包含 Wildfly、Java 等,并部署 jar,而第二个仅包含 java(并且可能包含其他内容),并且有另一个包含客户端的 jar .

这台机器应该可以调用部署好的ejb里面的方法。我成功地调用了一个简单的战争,以相同的方式部署,但我需要了解如何调用此方法,从我的角度来看,我发现的信息令人困惑。

这是客户端类,这个类在客户端包含的jar中:

package ejb.counter.client;
import ejb.counter.SessionCounter;
import javax.ejb.EJB;
public class SessionCounterClient {
    @EJB(lookup = "ejb/asw/SessionCounter")
    private static SessionCounter counter;
    public SessionCounterClient() { }
    public static void main(String[] args) {
        SessionCounterClient client = new SessionCounterClient();
        client.run();
    }
    public void run() {
        for (int i=1; i<=50; i++) {
            System.out.println( counter.getCounter() );
        }
        counter.close();
    }
}

所以很明显我必须调用的方法是getCounter()。另一个 EJB 包含接口及其实现,这里是实现:

package ejb.counter.impl;

import ejb.counter.SessionCounter;
import javax.ejb.Stateful;
import javax.ejb.Remove;
import javax.annotation.PostConstruct;

@Stateful(mappedName = "ejb/asw/SessionCounter")
public class SessionCounterImpl implements SessionCounter {
    private int counter;
    @PostConstruct
    public void initialize() {
        this.counter = 0;
    }
    public int getCounter() {
        counter++;
        return counter;
    }
    @Remove
    public void close() {}
}

也许我应该使用这些信息,但我不知道如何:

WFLYEJB0473: JNDI bindings for session bean named 'SessionCounterImpl' in deployment unit 'deployment "CounterEJB.jar"' are as follows:

java:global/CounterEJB/SessionCounterImpl!ejb.counter.SessionCounter
java:app/CounterEJB/SessionCounterImpl!ejb.counter.SessionCounter
java:module/SessionCounterImpl!ejb.counter.SessionCounter
java:jboss/exported/CounterEJB/SessionCounterImpl!ejb.counter.SessionCounter
    ejb:CounterEJB/SessionCounterImpl!ejb.counter.SessionCounter?stateful
java:global/CounterEJB/SessionCounterImpl
java:app/CounterEJB/SessionCounterImpl
java:module/SessionCounterImpl

我希望实现的结果是:我启动 2 个虚拟机,在第一个虚拟机上部署 Wildfly 中的 jar,我连接(使用另一个命令行)到第二个客户端机器,并使用我调用 EJB 的脚本(执行客户端 jar 中的方法),通过命令行显示其结果。我可以在 Glassfish-Payara 环境中重新创建它,但据我所知,它以不同的方式工作。

标签: javaejbwildflycall

解决方案


我想 SessionCounterClient 是您的 EJB 客户端。理想情况下,EJB 客户端将从部署在服务器上的 EJB 调用方法。在您的客户端代码的主要方法中,您正在调用方法“运行”。“run”方法的实现将在 EJB 中。


推荐阅读