1. 调用EJB的三种方法
调用EAP 6 EJB的第一种方法,使用JBoss API,如下:
Properties p = new Properties();
p.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false");
p.put("remote.connections", "default");
p.put("remote.connection.default.host", "localhost");
p.put("remote.connection.default.port", "4447");
p.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS", "false");
EJBClientConfiguration cc = new PropertiesBasedEJBClientConfiguration(p);
ContextSelector<EJBClientContext> selector = new ConfigBasedEJBClientContextSelector(cc);
EJBClientContext.setSelector(selector);
Properties props = new Properties();
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
InitialContext context = new InitialContext(props);
final boolean useScopedExample = Boolean.getBoolean("UseScopedContext");
final String rcal = "ejb:jboss-ejb-multi-server-app-main/ejb//" + (useScopedExample ? "MainAppSContextBean" : "MainAppBean") + "!" + MainApp.class.getName();
final MainApp remote = (MainApp) context.lookup(rcal);
这种方法在Standalone client (client is not running inside of JBoss EAP 6)能正常调用,但在EAP 6环境中会报java.lang.SecurityException: EJBCLIENT000021: EJB client context selector may not be changed。
第二种方法使用scoped context,代码如下:
Properties props = new Properties();
props.put("org.jboss.ejb.client.scoped.context", "true");
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
//props.put(Context.OBJECT_FACTORIES, "org.jboss.ejb.client.naming.ejb.ejbURLContextFactory");
props.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false");
props.put("remote.connections", "default");
props.put("remote.connection.default.port", 4447);
props.put("remote.connection.default.host", host);
//props.put("remote.connection.default.username", username);
//props.put("remote.connection.default.password", password);
props.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");
props.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");
Context context = (Context) new InitialContext(props).lookup("ejb:");
try {
final TimerExample bean = (TimerExample) context.lookup("TestTimer/TestTimerEJB/TimerExampleBean!org.example.jboss.timer.TimerExample");
bean.doSomething();
} finally {
try {
context.close();
} catch(Exception e) { }
}
这种方式,可以完全通过代码实现配置,但由客户端来创建和管理Connection,因此需要更多的资源,性能不高。还有一个严重的问题,当使用CMT,事物跨多个EJB时,因每次调用EJB后都关闭context(如不close,connection会一直保持),这将造成事务commit/rollback失败。这种情况下,就得使用第三种方式,也是推荐的方式:
先来看代码:
Properties props = new Properties();
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new javax.naming.InitialContext(props);
final Greeter bean = (Greeter) context.lookup("ejb:myapp/myejb/GreeterBean!" + org.myapp.ejb.Greeter.class.getName());
bean.doSometing();
代码很简单,注意没有调用close()方法。那这是怎么找到远程主机的呢?需要增加一些配置,先在war的WEB-INF或ear的META-INF中新建一个文件jboss-ejb-client.xml,内容如下:
<jboss-ejb-client xmlns="urn:jboss:ejb-client:1.2">
<client-context>
<ejb-receivers>
<remoting-ejb-receiver outbound-connection-ref="remote-ejb-connection-app1" connect-timeout="10000"/>
<remoting-ejb-receiver outbound-connection-ref="remote-ejb-connection-app2" connect-timeout="10000"/>
</ejb-receivers>
</client-context>
</jboss-ejb-client>
然后在standalone.xml增加如下配置,建立与远程主机的关联:
<subsystem xmlns="urn:jboss:domain:remoting:1.2">
<connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/>
<outbound-connections>
<remote-outbound-connection name="remote-ejb-connection-app1" outbound-socket-binding-ref="remote-ejb-app1">
<properties>
<property name="SASL_POLICY_NOANONYMOUS" value="false"/>
<property name="SSL_ENABLED" value="false"/>
</properties>
</remote-outbound-connection>
<remote-outbound-connection name="remote-ejb-connection-app2" outbound-socket-binding-ref="remote-ejb-app2">
<properties>
<property name="SASL_POLICY_NOANONYMOUS" value="false"/>
<property name="SSL_ENABLED" value="false"/>
</properties>
</remote-outbound-connection>
</outbound-connections>
</subsystem>
...
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
<outbound-socket-binding name="remote-ejb-app1">
<remote-destination host="localhost" port="4447"/>
</outbound-socket-binding>
<outbound-socket-binding name="remote-ejb-app2">
<remote-destination host="localhost" port="4447"/>
</outbound-socket-binding>
</socket-binding-group>
调用EJB后,来查看一下connection情况:netstat -aon | findstr "4447"(netstat -np | grep 4447)
2. Could not register a EJB receiver: java.lang.RuntimeException: Operation failed with status WAITING
EJB调用配置中包含以下三个timeout参数:
The timeout for the EJB handshake or method invocation request/response cycle. The value is in milliseconds.
The invocation of any method throws a java.util.concurrent.TimeoutException if the execution takes longer than the timeout period. The execution completes and the server is not interrupted.
The timeout for the background reconnect tasks. The value is in milliseconds.
If a number of connections are down, the next client EJB invocation will use an algorithm to decide if a reconnect is necessary to find the right node.
- remote.connection.CONNECTION_NAME.connect.timeout
The timeout period for the initial connection. After that, the reconnect task will periodically check whether the connection can be established. The value is in milliseconds.
remote.connection.CONNECTION_NAME.connect.timeout默认值为5000ms(参见代码InitialContextFactory.getInitialContext),当在timeout时间内连接不上时,就会报以上错误。
3. 关于Rollback
EJB方法抛出RuntimeException会引起rollback,那有方法指定某个Exception是否引起Rollback么?可以使用注解@ApplicationException,如下:
@ApplicationException(rollback = true)
public class MyException extends Exception {
// ...
}
4. How to close scoped EJB client contexts?
Internally, when a lookup happens for a ejb: URL string, a relevant javax.naming.Context is created for that ejb: lookup.
So we first create a JNDI context and then use it to lookup an EJB.
final Properties props = new Properties();
// mark it for scoped EJB client context
props.put("org.jboss.ejb.client.scoped.context","true");
// add other properties
props.put(....);
...
Context jndiCtx = new InitialContext(props);
Context ejbRootNamingContext = (Context) jndiCtx.lookup("ejb:");
try {
final MyBean bean = ejbRootNamingContext.lookup("app/module/distinct/bean!interface"); // rest of the EJB jndi lookup string
bean.doSomething();
} finally {
try {
// close the EJB naming JNDI context
ejbRootNamingContext.close();
} catch (Throwable t) {
// log and ignore
}
try {
// also close our other JNDI context since we are done with it too
jndiCtx.close();
} catch (Throwable t) {
// log and ignore
}
}
Invoking Session Beans
Scoped EJB client contexts
How to configure an EJB client in JBoss EAP 6
分享到:
相关推荐
JBoss EAP 7.2.6 版本是一个重要的更新,包含了多个版本的 GA(General Availability)补丁以及一个CP(Cumulative Patch)更新,旨在提升性能、增强安全性和修复已知问题。 1. **补丁的重要性** 补丁是软件维护的...
在JBoss 7及以上版本中,对EJB的配置过程相较于之前的版本有所变化,主要涉及到两个关键的配置文件:`jboss-ejb3.xml`和`ejb-jar.xml`。 `ejb-jar.xml`文件是EJB模块的标准配置文件,遵循Java EE规范。在这个文件中...
### jBoss EAP 6.2 或 AS 7 以上乱码问题解决 #### 背景介绍 在使用jBoss Enterprise Application Platform (EAP) 6.2 或 jBoss Application Server (AS) 7及以上版本的过程中,可能会遇到字符编码问题,即所谓的...
**JBoss EAP6安装部署手册Windows** JBoss Enterprise Application Platform (EAP) 6 是一个基于Java EE 6的开源应用服务器,为企业级应用程序提供了一个稳定、安全的运行环境。在Windows平台上部署JBOSS EAP6涉及...
JBoss EAP 6.4 是 Red Hat 提供的一个企业级应用服务器,它基于 Java EE 6 规范,提供了全面的中间件服务,用于构建、部署和管理企业级应用程序。这个版本是 JBoss 产品线的一个关键里程碑,因为它包含了众多功能...
本篇将详细介绍如何在MyEclipse中远程调试JBoss AS7或JBoss EAP6,无论是在Windows还是Linux环境下。 首先,我们需要了解远程调试的基本原理。远程调试通常依赖于Java的调试接口(Java Debug Wire Protocol, JDWP)...
1. **Java EE 6支持**:JBoss EAP 6.2.0完全兼容Java EE 6规范,这意味着它可以支持诸如JavaServer Faces (JSF),Java Persistence API (JPA),Java Message Service (JMS)以及Enterprise JavaBeans (EJB)等关键组件...
Red Hat为JBoss EAP提供详细的官方文档,同时有一个活跃的开发者社区,用户可以在这里获取帮助、分享经验,共同解决遇到的问题。 综上所述,JBoss EAP 7.2.0是一个功能强大且全面的Java EE应用服务器,它为企业级...
1. **Java EE 6支持**:JBoss EAP 6.3.0遵循Java Platform, Enterprise Edition (Java EE) 6标准,提供包括Servlet 3.0、JPA 2.0、EJB 3.1、JSF 2.1等在内的服务和API。 2. **模块化架构**:EAP 6.3引入了模块化...
文档将提供针对JBoss EAP 6.1的故障诊断和问题解决指南,帮助管理员快速定位和解决遇到的问题。 ### 知识点八:版权与法律声明 文档在开头部分提及了版权信息和法律声明。Red Hat公司拥有该文档的版权,并且基于...
1. **Java EE 5支持**:JBoss EAP 5.2.0遵循Java EE 5规范,包括EJB 3.0、JSF 1.2、JPA 1.0、JMS 1.1等,为开发者提供了构建企业级服务所需的基础架构。 2. **Web容器**:内嵌的Tomcat或Jetty Web容器,用于处理...
在Linux环境下,搭建JBoss Enterprise Application Platform (EAP)的集群能够提高应用程序的可用性和可扩展性。JBoss EAP 6.4.0提供了两种运行模式:standalone(独立运行模式)和domain(域模式)。standalone模式...
【在JBoss下配置EJB】 企业级JavaBean(Enterprise JavaBeans,简称EJB)是Java平台上的一个核心组件,用于构建可扩展、安全且事务处理能力强大的分布式应用程序。EJB标准经历了多个版本的发展,从早期的EJB 2.0到...
6. **集群与高可用性**:JBoss EAP 7.1.0支持集群部署,能实现负载均衡和故障转移,从而提高系统的可用性和性能。 7. **热部署与管理工具**:提供基于Web的管理控制台和命令行工具(CLI),使得配置、部署和监控...
JBoss Enterprise Application Platform 6.3(以下简称JBoss EAP6.3)是一款由Red Hat开发的Java应用服务器,作为JBoss应用服务器的商业版,主要用于企业级应用部署。该文档是一份管理员配置指南,旨在帮助管理员...
jboss_EAP 部署在Window平台上
- **Java EE框架**:JBoss EAP是Java EE 6规范的实现,包含了诸如Servlet、JSP、EJB、JMS、JPA、JTA等一系列标准组件。 - **模块化结构**:JBoss EAP采用了模块化设计,允许开发者根据需求选择加载特定的模块,...
### Linux JBoss EAP集群构建详解 #### 一、引言 JBoss EAP (Enterprise Application Platform) 是一款由 Red Hat 提供的企业级 Java 应用服务器,它基于开源项目 WildFly 构建而成,提供了丰富的功能和服务,适用...
JBOSS7是Red Hat公司开发的一款开源Java应用服务器,它基于Java EE 6(Enterprise JavaBeans 3.1)规范,提供了全面的中间件服务,包括Servlet、JSP、JSF、EJB、JMS等。EJB3是Java EE平台中的一个核心组件,它极大地...