通过@Resource注入的无状态远程bean仅提供单个实例

时间:2015-11-19 14:09:46

标签: java-ee wildfly ejb-3.1 wildfly-9

我正在运行具有前端(JSFCDI)和后端(EJBHibernate)应用程序部分的Web应用程序,每个都在单独的WildFly 9.0.1.Final AS上。前端通过JNDI名称通过Remote EJB Client与后端进行通信。

一些前端代码:

@ViewScoped
@Named("ddc")
public class DynamicDatatableController implements Serializable {    
    @Produces
    @Resource(lookup = "ejb:bpm-back-ear/bpm-back-dynamicTable/DynamicTableBean!bc.bpm.dynamicTable.back.beans.remote.DynamicTableBeanRemote")
    private DynamicTableBeanRemote dtb;

    private Integer tableId;
    private DynamicTable table;

    @PostConstruct
    public void init{
      table = dtb.getTable(tableId);
    }
}

以及一些后端界面代码:

@Remote
public interface DynamicTableBeanRemote {
    List<DynamicTable> getTable(Integer tableId);
}

一些后端bean代码:

@Stateless
@LocalBean
public class DynamicTableBean implements DynamicTableBeanRemote {
    final static Logger LOGGER = LoggerFactory.getLogger(DynamicTableBean.class);
    @PersistenceContext(unitName = "bpmBeans")
    private EntityManager em;

    @Override
    public List<DynamicTable> getTableList(Integer tableId) {
        return em.find(DynamicTable.class, tableId);
    }
}

问题是,无论我做了多少请求,使用JMeter或通过刷新几个浏览器选项卡,在任何给定时间只有一个DynamicTableBean实例存活。每个请求都由队列中的那个bean实例执行。如您所知,该应用程序绝对无法使用,因为它绝对是单线程EJB。可能是什么问题?

3 个答案:

答案 0 :(得分:0)

检查您的jboss ejb池配置。在jboss中(这适用于eap 6.4.2并假设在wildfly上也是如此),您可以在domain.xml中配置ejb池大小

<subsystem xmlns="urn:jboss:domain:ejb3:1.5">
    <session-bean>
        <stateless>
            <bean-instance-pool-ref pool-name="slsb-strict-max-pool"/>
        </stateless>
    </session-bean>...
    <pools>
        <bean-instance-pools>
            <strict-max-pool name="slsb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
        </bean-instance-pools>
    </pools>

您可以在jboss-ejb3.xml中将此池引用为:

<?xml version="1.1" encoding="UTF-8"?>
<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:c="urn:clustering:1.0" xmlns:r="urn:resource-adapter-binding"
    xmlns:p="urn:ejb-pool:1.0"
    xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee 
               http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd
                http://java.sun.com/xml/ns/javaee 
                http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
    version="3.1" impl-version="2.0">
    <assembly-descriptor>
        <p:pool>
            <ejb-name>ejebId</ejb-name>
            <p:bean-instance-pool-ref>slsb-strict-max-pool</p:bean-instance-pool-ref>
        </p:pool>
    </assembly-descriptor>
</jboss:ejb-jar>

答案 1 :(得分:0)

无状态会话bean有可能以比请求到达速率更快的速率完成请求。

在这种情况下,您可能只会看到一个无状态会话bean能够满足所有请求。您可能希望在无状态会话bean中注入一些延迟,并查看您是否仍然只看到它的一个实例。你可以注入延迟,

.image-container:hover{
    url: imagepath;

  }

并在无状态会话bean默认构造函数中添加一些日志语句,以检查创建的实例数。

顺便说一句,您是如何推断出只创建了一个无状态会话bean的实例?通过任何日志或控制台等。

答案 2 :(得分:0)

问题在于Intellij 14和过时版本的JRebel客户端显然都在Linux工作站上运行。所以要记住的是始终保持工具的最新状态:)