WildFly:如何从位于另一个应用程序中的 EJB 调用 EJB
目录
创建 EJB 服务器项目
配置服务器依赖项(WildFly 18 及更高版本)
配置服务器依赖项(WildFly 11、12、13、14、15、16、17)
部署 EJB 服务器项目
创建 EJB 客户端项目
配置客户端依赖项(WildFly 18 及更高版本)
在 EJB 客户端项目中配置安全性
测试 EJB 客户端项目
本教程的目的是演示如何从位于另一个应用程序中的另一个EJB查找和调用部署在WildFly服务器实例上的EJB 。
这是我们的场景:
另一方面,如果您的场景需要从独立的远程客户端调用 EJB,请查看本教程:WildFly 远程 EJB 客户端教程
为了演示如何从远程 EJB 客户端调用 EJB,我们需要完成以下步骤:
创建 EJB 服务器项目
因此,假设您有一个简单的服务器项目,其中包括以下有状态和无状态 EJB:
package com.mastertheboss.ejb;import javax.ejb.Remote;
import javax.ejb.Stateful;
import com.mastertheboss.exception.InsufficientFundsException;@Stateful
@Remote(Account.class)
public class AccountEJB implements Account {long money;@Overridepublic long getMoney() {return money;}public void createAccount(long amount) {this.money= amount;}@Overridepublic void deposit(long amount) {this.money+= amount;System.out.println("Money deposit. total is "+money);}@Overridepublic void withdraw(long amount) throws InsufficientFundsException {long newAmount = money - amount;if (newAmount < 0) {throw new InsufficientFundsException("Unsufficient funds for account! ");}money = newAmount; System.out.println("Money withdrawal. total is "+money);}
}package com.mastertheboss.ejb;import javax.ejb.Remote;
import javax.ejb.Stateless;@Stateless
@Remote(Calculator.class)
public class CalculatorEJB implements Calculator {float interest=5;@Overridepublic float calculateInterest(long money) {return money * (1+ (interest/100));}}
package com.mastertheboss.ejb;import com.mastertheboss.exception.InsufficientFundsException;public interface Account {public void deposit(long amount);public void withdraw(long amount) throws InsufficientFundsException;public long getMoney();public void createAccount(long amount);
}package com.mastertheboss.ejb;public interface Calculator {public float calculateInterest(long money);}
配置服务器依赖项(WildFly 18 及更高版本)
<dependencyManagement><dependencies><dependency><groupId>org.wildfly.bom</groupId><artifactId>wildfly-jakartaee8-with-tools</artifactId><version>${version.server.bom}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
<dependencies><dependency><groupId>org.jboss.spec.javax.annotation</groupId><artifactId>jboss-annotations-api_1.3_spec</artifactId><scope>provided</scope></dependency><dependency><groupId>org.jboss.spec.javax.ejb</groupId><artifactId>jboss-ejb-api_3.2_spec</artifactId><scope>provided</scope></dependency>
</dependencies>
属性version.server.bom包含应用程序服务器版本,例如:
<properties><version.server.bom>18.0.0.Final</version.server.bom>
</properties>
配置服务器依赖项(WildFly 11、12、13、14、15、16、17)
<dependencyManagement><dependencies><dependency><groupId>org.wildfly.bom</groupId><artifactId>wildfly-javaee8-with-tools</artifactId><version>${version.server.bom}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
部署 EJB 服务器项目
由于我们的 pom.xml 包含 WildFly 的 maven 插件,您可以简单地构建和部署 EJB Server 项目,如下所示:
mvn install wildfly:deploy
从服务器日志中检查 EJB 项目已部署并且 JNDI 绑定可用:
08:24:43,534 INFO [org.jboss.as.ejb3.deployment] (MSC service thread 1-3) WFLYEJB0473: JNDI bindings for session bean named 'AccountEJB' in deployment unit 'deployment "ejb-client-basic.war"' are as follows:java:global/ejb-client-basic/AccountEJB!com.mastertheboss.ejb.Accountjava:app/ejb-client-basic/AccountEJB!com.mastertheboss.ejb.Accountjava:module/AccountEJB!com.mastertheboss.ejb.Accountjava:jboss/exported/ejb-client-basic/AccountEJB!com.mastertheboss.ejb.Accountejb:/ejb-client-basic/AccountEJB!com.mastertheboss.ejb.Account?statefuljava:global/ejb-client-basic/AccountEJBjava:app/ejb-client-basic/AccountEJBjava:module/AccountEJB
创建 EJB 客户端项目
package com.mastertheboss.ejbclient;import java.io.IOException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ejb.*;@WebServlet(urlPatterns = "/ejbclient")
public class ServletFE extends HttpServlet {@EJB EJBClient ejb;protected void doGet(HttpServletRequest request, HttpServletResponse response) {response.setContentType("html");write(response, "Example Servlet to show how EJB can invoke an EJB in another application");try {long money= request.getParameter("money") != null ? Long.parseLong(request.getParameter("money")) : 100l;float moneyWithInterest = ejb.callRemoteEJBs(money);write(response, "Amount: " + moneyWithInterest);} catch (Exception n) {write(response, "Failed to invoke Remote EJB");write(response, n.getMessage());}}private static void write(HttpServletResponse writer, String message) {try {writer.getWriter().write(message + "\n");} catch (IOException e) {e.printStackTrace();}}}
如您所见,它只是我们 EJB 的一个小包装器,其中包含实际的 EJB 客户端交互:
package com.mastertheboss.ejbclient;import java.util.Hashtable;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;import com.mastertheboss.ejb.*;
import com.mastertheboss.exception.*;import javax.naming.spi.NamingManager;
import javax.ejb.*;
@Stateless
public class EJBClient {@EJB(name="ejb:/ejb-server-basic/CalculatorEJB!com.mastertheboss.ejb.Calculator")Calculator calculator;@EJB(name="ejb:/ejb-server-basic/AccountEJB!com.mastertheboss.ejb.Account?stateful")Account account;public float callRemoteEJBs(long money) throws Exception {account.createAccount(money);System.out.println("Create Account with "+money);account.deposit(money/2);System.out.println("Deposit " +(money/2));try {account.withdraw(money/3);System.out.println("Withdraw "+(money/3));} catch (InsufficientFundsException e) {e.printStackTrace();}money = account.getMoney();System.out.println("Money left " + money);float totalMoney = calculator.calculateInterest(money);System.out.println("Money plus interests " + totalMoney);return totalMoney;}
}
请注意,由于我们将调用驻留在同一应用程序服务器中的 EJB,因此查找远程 EJB 所需的只是以下内容:
@EJB(name="ejb:/ejb-server-basic/CalculatorEJB!com.mastertheboss.ejb.Calculator")
Calculator calculator;@EJB(name="ejb:/ejb-server-basic/AccountEJB!com.mastertheboss.ejb.Account?stateful")
Account account;
配置客户端依赖项(WildFly 18 及更高版本)
<dependencyManagement><dependencies><dependency><groupId>org.wildfly.bom</groupId><artifactId>wildfly-jakartaee8-with-tools</artifactId><version>${version.server.bom}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
<dependencies>
<!-- We depend on the EJB remote business interfaces of this application --><dependency><groupId>com.itbuzzpress.chapter4</groupId><artifactId>ejb-server-basic</artifactId><type>ejb-client</type><version>${project.version}</version></dependency>
<!-- Include the ejb client jars --><dependency><groupId>org.wildfly</groupId><artifactId>wildfly-ejb-client-bom</artifactId><type>pom</type><scope>compile</scope></dependency>
</dependencies>
与此类似,Property version.server.bom包含 Application Server 版本,例如:
<properties><version.server.bom>18.0.0.Final</version.server.bom>
</properties>
在 EJB 客户端项目中配置安全性
<configuration><authentication-client xmlns="urn:elytron:1.0"><authentication-rules><rule use-configuration="default" /></authentication-rules><authentication-configurations><configuration name="default"><sasl-mechanism-selector selector="#ALL" /><set-mechanism-properties><property key="wildfly.sasl.local-user.quiet-auth" value="true" /></set-mechanism-properties><providers><use-service-loader/></providers></configuration></authentication-configurations></authentication-client>
</configuration>
另一方面,如果您需要提供凭据,则可以将它们添加到 authentication-configurations 块中,如下例所示:
<configuration><authentication-client xmlns="urn:elytron:1.0"><authentication-rules><rule use-configuration="default"/></authentication-rules><authentication-configurations><configuration name="default"><sasl-mechanism-selector selector="DIGEST-MD5"/><set-user-name name="ejbuser"/><credentials><clear-password password="password1!"/></credentials></configuration></authentication-configurations></authentication-client>
</configuration>
要在服务器上创建用户,只需执行 add-user.sh 脚本,如下所示:
$ ./add-user.sh -a -u ejbuser -p password1!
测试 EJB 客户端项目
mvn clean install wildfly:deploy
您可以通过 Servlet URI 测试应用程序,即“/ejbclient”:
curl http://localhost:8080/ejb-client-basic/ejbclient?money=200
WildFly:如何从位于另一个应用程序中的 EJB 调用 EJB相关推荐
- ip地址转换数字函数 iton_c# – RabbitMQ CreateConneciton问题 – 在一个应用程序中运行,但在另一个应用程序中运行...
所以这是连接代码. var factory = new ConnectionFactory { HostName = "myserver", UserName = "te ...
- 一个Java程序中是否只能有一个main函数
否 1.一个Java程序中不一定只有一个main函数,但至少有一个main函数因为Java虚拟机运行时,是以main方法为入口进入的 2.main函数是程序的入口,总之一个Java程序执行时只会执行一 ...
- 在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积;再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积。
在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积:再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积. 1.mult. ...
- android 读取其他应用程序,android – 在另一个应用程序中请求我自己的ContentProvider的读取权限...
在一个应用程序中,我在 AndroidManifest中声明了以下内容提供程序: android:label="@string/provider_name" android:aut ...
- Python逐块执行另一个Python程序中的代码观察运行过程
今天是10月24日,也是一年一度的程序员节,祝所有热爱代码的朋友们节日快乐! 祝所有程序员1024节日快乐 全国高校教师Python课程高级研修班(线上,11月20-21日) 中国大学MOOC&quo ...
- 一个java程序中什么是主类_下列哪个是Java应用程序主类中正确的main方法?_学小易找答案...
[判断题]用佛尔哈德法测定Ag + 时,不用先除去氮的低价氧化物.汞盐等杂质. [单选题]下列哪个是Java应用程序主类中正确的main方法? [判断题]javac.exe 命令文件存放在 JDK 安 ...
- chrome插件中调用ajax,Chrome扩展程序中的Ajax调用无效
尝试在Chrome扩展程序中发送ajax请求.我已经确认请求返回200响应,它应该只是console.log来测试'.我不确定这里是否存在异常问题?我已经阅读了Chrome扩展程序' addListe ...
- Lightroom显示无法打开Lightroom 目录“LightroomCatalog“,因为已经在另一个应用程序中打开了该目录。解决方案
今天修图的过程中LR突然闪退,显示如下画面,如何处理? 若为windows系统:首先在我的电脑中---->c盘----->用户----->user------>picture- ...
- 微信小程序中实现循环调用一个方法
要想循环调用一个方法肯定是要判断某个值,当这个值为假时调用这个方法,为真就不调用 query:function(){if(!!wx.getStorageSync('userInfo')){let _t ...
最新文章
- UNIX环境高级编程--第七章
- C++ Primer 5th笔记(10)chapter10 泛型算法 :迭代器
- Python高级运维开发面授课程本周末隆重开课
- 如何使用示例从Java中的类路径加载资源
- 记录android点滴(一)--通过build.prop实现产品定制的方法
- 两台linux之间互传php脚本,linux下两台服务器实现同步的方法
- 电脑反应慢卡怎么解决_电脑键盘失灵怎么解决
- rootfs 制作ubuntu_Ubuntu12笔记: 基于busybox的Linux小系统制作
- nvidia控制面板点了没反应win7_win7系统Nvidia控制面板怎么设置?
- 编译原理教程_1 引论
- DVM 和 JVM 的区别?
- 在Yalmip中应用SDPT3
- SUBMAIL短信平台API接口-Message/send
- linux纯文本无法键入密码,Apple Mac OS X FileVault纯文本密码本地安全限制绕过漏洞...
- 51nod1423 最大二“货”
- 偶尔出现404怎么回事?
- Python爬虫爬取天天基金网
- 2018_9_22 模拟赛
- python创建学生类姓名学号_设计一个学生类班级类
- NOTES常见问题及解决方法
热门文章
- TLS/SSL 协议详解(17) Certificate verify
- Android WebService(基于SOAP协议)个人记录总结
- 新版标准日本语中级_第十一课
- pip install pycrypto
- 使用bins对数据进行分段并计算每个分段的数据量
- excel实现自动排序
- 《Focal Loss GHM Loss Dice Los》论文笔记
- matlab ghm,matlab – 用Python中的matplotlib绘制许多数据点
- 15.线程同步的几种方法
- 自编码器,变分自编码器和生成对抗网络异同