从节点

时间:2018-06-24 14:58:07

标签: java ejb wildfly call

您一定会注意到,我对EJB和Wildfly还是很陌生,但是我正在尽力去理解,并做一些实验。问题是,我想运行一个简单的EJB(有状态计数器),该EJB从另一个客户端节点(从jar)部署到Wildfly中。为此,我使用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个虚拟机,在第一个虚拟机中将jar部署在Wildfly中,我(使用另一个命令行)连接到第二个客户端计算机,并使用脚本调用EJB(在客户端jar中执行该方法),该EJB通过命令行显示其结果。 我可以在Glassfish-Payara环境中重新创建它,但据我所知它以不同的方式工作。

1 个答案:

答案 0 :(得分:0)

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