`

Jboss EAP 6 EJB调用常见问题

阅读更多

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参数:

  • invocation.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.

 

  • reconnect.tasks.timeout

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-patch

    JBoss EAP 7.2.6 版本是一个重要的更新,包含了多个版本的 GA(General Availability)补丁以及一个CP(Cumulative Patch)更新,旨在提升性能、增强安全性和修复已知问题。 1. **补丁的重要性** 补丁是软件维护的...

    jboss7ejb配置文件

    在JBoss 7及以上版本中,对EJB的配置过程相较于之前的版本有所变化,主要涉及到两个关键的配置文件:`jboss-ejb3.xml`和`ejb-jar.xml`。 `ejb-jar.xml`文件是EJB模块的标准配置文件,遵循Java EE规范。在这个文件中...

    jboss eap 6.2或as 7 以上乱码问题解决

    ### jBoss EAP 6.2 或 AS 7 以上乱码问题解决 #### 背景介绍 在使用jBoss Enterprise Application Platform (EAP) 6.2 或 jBoss Application Server (AS) 7及以上版本的过程中,可能会遇到字符编码问题,即所谓的...

    JBOSS EAP6安装部署手册 Windows

    **JBoss EAP6安装部署手册Windows** JBoss Enterprise Application Platform (EAP) 6 是一个基于Java EE 6的开源应用服务器,为企业级应用程序提供了一个稳定、安全的运行环境。在Windows平台上部署JBOSS EAP6涉及...

    jboss-eap-6.4.0.zip

    JBoss EAP 6.4 是 Red Hat 提供的一个企业级应用服务器,它基于 Java EE 6 规范,提供了全面的中间件服务,用于构建、部署和管理企业级应用程序。这个版本是 JBoss 产品线的一个关键里程碑,因为它包含了众多功能...

    myeclipse 远程调试jboss as7或者jboss eap6

    本篇将详细介绍如何在MyEclipse中远程调试JBoss AS7或JBoss EAP6,无论是在Windows还是Linux环境下。 首先,我们需要了解远程调试的基本原理。远程调试通常依赖于Java的调试接口(Java Debug Wire Protocol, JDWP)...

    jboss-eap-7.2.0.zip

    Red Hat为JBoss EAP提供详细的官方文档,同时有一个活跃的开发者社区,用户可以在这里获取帮助、分享经验,共同解决遇到的问题。 综上所述,JBoss EAP 7.2.0是一个功能强大且全面的Java EE应用服务器,它为企业级...

    jboss-eap-6.2.0

    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)等关键组件...

    jboss-eap-6.3.0

    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.0 应用平台配置管理文档

    文档将提供针对JBoss EAP 6.1的故障诊断和问题解决指南,帮助管理员快速定位和解决遇到的问题。 ### 知识点八:版权与法律声明 文档在开头部分提及了版权信息和法律声明。Red Hat公司拥有该文档的版权,并且基于...

    jboss-eap-5.2.0.zip

    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-eap 集群搭建

    在Linux环境下,搭建JBoss Enterprise Application Platform (EAP)的集群能够提高应用程序的可用性和可扩展性。JBoss EAP 6.4.0提供了两种运行模式:standalone(独立运行模式)和domain(域模式)。standalone模式...

    在JBoss下配置EJB

    【在JBoss下配置EJB】 企业级JavaBean(Enterprise JavaBeans,简称EJB)是Java平台上的一个核心组件,用于构建可扩展、安全且事务处理能力强大的分布式应用程序。EJB标准经历了多个版本的发展,从早期的EJB 2.0到...

    jboss-eap-7.1.0

    6. **集群与高可用性**:JBoss EAP 7.1.0支持集群部署,能实现负载均衡和故障转移,从而提高系统的可用性和性能。 7. **热部署与管理工具**:提供基于Web的管理控制台和命令行工具(CLI),使得配置、部署和监控...

    JBoss EAP6.3 原版英文管理员配置文档

    JBoss Enterprise Application Platform 6.3(以下简称JBoss EAP6.3)是一款由Red Hat开发的Java应用服务器,作为JBoss应用服务器的商业版,主要用于企业级应用部署。该文档是一份管理员配置指南,旨在帮助管理员...

    jboss EAP部署在Window平台上

    jboss_EAP 部署在Window平台上

    jboss-eap-6.3.0软件和源码.zip

    - **Java EE框架**:JBoss EAP是Java EE 6规范的实现,包含了诸如Servlet、JSP、EJB、JMS、JPA、JTA等一系列标准组件。 - **模块化结构**:JBoss EAP采用了模块化设计,允许开发者根据需求选择加载特定的模块,...

    Linux JBoss EAP集群

    ### Linux JBoss EAP集群构建详解 #### 一、引言 JBoss EAP (Enterprise Application Platform) 是一款由 Red Hat 提供的企业级 Java 应用服务器,它基于开源项目 WildFly 构建而成,提供了丰富的功能和服务,适用...

    jboss7 + EJB3

    JBOSS7是Red Hat公司开发的一款开源Java应用服务器,它基于Java EE 6(Enterprise JavaBeans 3.1)规范,提供了全面的中间件服务,包括Servlet、JSP、JSF、EJB、JMS等。EJB3是Java EE平台中的一个核心组件,它极大地...

Global site tag (gtag.js) - Google Analytics