2015-11-19 80 views
0

我運行具有前端(JSFCDI)和後端(EJBHibernate)應用程序的各部分的網絡應用程序中,每個在單獨的WildFly 9.0.1.Final AS注入。前端通過Remote EJB Client通過JNDI名稱與後端進行通信。無國籍遠程豆經由@Resource僅提供單個實例

一些前端代碼:

@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或刷新一些瀏覽器選項卡,只有一個的實例在任何時候都活着。每個請求都由隊列中的一個bean實例執行。如你所知,應用程序絕對不可用,因爲它絕對是單線程的EJB。可能是什麼問題呢?

回答

0

問題是與Intellij 14和JRebel客戶端的過時版本顯然,都在Linux工作站上運行。所以這裏要記住的一點是始終讓你的工具保持最新狀態:)

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> 
+0

試圖將jboss-ejb3.xml添加到無狀態EJB的ejb-jar中(src/main/resources/META-INF/jboss-ejb3。 xml)和WildFly配置,但結果是現在只有一個實例被創建,沒有被銷燬,但是被每個請求重用。執行仍然在隊列中,沒有多個實例,並行執行等等。 – Candyman

+0

打開jboss日誌記錄以調試/跟蹤並檢查日誌。您應該看到顯示池正在使用的日誌。 – 6ton

+0

使用了池,但無論發送多少個請求,只創建一個EJB。用CLI檢查這個特定的bean。 – Candyman

0

無狀態會話bean有可能以比請求到達率更快的速率完成請求。

在這種情況下,您可能會看到只有一個無狀態會話bean能夠滿足所有請求。你可能想在無狀態會話bean中注入一些延遲,看看你是否還只看到它的一個實例。您可以通過注入延遲,

public List<DynamicTable> getTableList(Integer tableId) { 
    try {Thread.sleep(3000); } catch (InterruptedException ex) {} 
    return em.find(DynamicTable.class, tableId); 
} 

以及在無狀態會話bean的默認構造函數添加一些日誌語句來檢查很多情況下是怎麼創建的。

順便說一句,你是如何推斷,那裏只有一個無狀態會話bean被創建的實例?通過任何日誌或控制檯等