2015-11-19 1 views
0

Я бегу веб-приложение, которое имеет передний конец (JSF, CDI) и обратно-конец (EJB, Hibernate) части приложения, каждый на отдельном WildFly 9.0.1.Final AS. Front-end связывается с внутренним концом через 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); 
} 

И некоторый фоновый код фасоли:

@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 жив в любой момент времени. Каждый запрос выполняется этим экземпляром компонента в очереди. Как вы понимаете, приложение абсолютно непригодно, потому что это абсолютно однопоточный EJB. В чем может быть проблема?

ответ

0

Проблема была с Intellij 14 и устаревшей версией клиента JRebel, очевидно, работающей на рабочей станции Linux. Так что помните, что всегда нужно постоянно обновлять свои инструменты :)

0

Проверьте конфигурацию пула jboss ejb. В JBoss (это работает на еар 6.4.2 и пусть же будет на wildfly) вы можете настроить размер пула в EJB domain.xml

<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-jar, где находится Stateless EJB (src/main/resources/META-INF/jboss-ejb3. xml) и WildFly, но результат заключается в том, что теперь создается только один экземпляр, а не уничтожается, но повторно используется для каждого запроса. Выполнение по-прежнему находится в очереди, нет нескольких экземпляров, параллельного выполнения или чего-то еще. – Candyman

+0

Включите ведение журнала jboss для отладки/отслеживания и проверки журналов. Вы должны увидеть журналы, показывающие, что пулы используются. – 6ton

+0

Пул используется, но создается только 1 EJB, независимо от того, сколько запросов вы отправляете. Проверено, что с CLI для этого конкретного компонента. – Candyman

0

Существует вероятность того, что сеансовый компонент без состояния не сможет выполнить запросы с более высокой скоростью, чем скорость поступления запросов.

В таких случаях вы можете увидеть только один сеанс сеанса без состояния, способный удовлетворить все запросы. Возможно, вы захотите вставить некоторую задержку в сеансовом компоненте без состояния и посмотреть, не видите ли вы по-прежнему один экземпляр. Вы можете вводить задержку,

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

А также добавить журнал о в сессионном бобе конструктора по умолчанию, чтобы проверить, сколько экземпляров были созданы.

Кстати, как вы заключили, что существует только один экземпляр сеансового компонента без состояния? Через любые журналы или консоль и т. Д.

Смежные вопросы