java - 从节点调用 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 环境中重新创建它,但据我所知,它以不同的方式工作。
解决方案
我想 SessionCounterClient 是您的 EJB 客户端。理想情况下,EJB 客户端将从部署在服务器上的 EJB 调用方法。在您的客户端代码的主要方法中,您正在调用方法“运行”。“run”方法的实现将在 EJB 中。
推荐阅读
- c# - 如何使用 AutoMapper 将 DTO 展平为实体/对象属性
- c++ - 如何在 C++ 中使 2 个输入不区分大小写?
- java - 在将tomcat配置为仅使用1个线程时,在使用completablefuture进行异步处理时,它正在使用另一个线程如何?
- mongodb - MongoDB Catalina 读写
- mysql - 如何将查询结果重新排列到新列中
- reactjs - react-infinite-scroll-component 用数组加载更多
- docker - 在 Windows Docker 上添加具有 devicemaper 值的存储驱动程序
- java - 是否可以仅将 HSQLDB 持久化到内存中没有任何数据的文件?
- java - 错误未解决参考:LoadAnimation
- python - Python 中的命令 getatime() 与 Finder(在 macOS 上)中的“上次打开日期”不同。我如何获得后者?