Ich versuche, um folgendes zu erreichen:EJB @Asynchronous Echtzeit abgerufen werden eingefügten Zeile in JSF scheint Thread zu sein gesperrt
EJB3 Singleton
@Singleton
@Startup
public class SomeSingleton implements SomeSingletonLocal {
// Entity Manager injection
private EntityManager _entity_manager;
@Override
@Asynchronous
public void createScenario(){
method1();
method2();
// ...
}
public void method1(){
// Persist an Event in a Database.
}
public void method2(){
// Persist an Event in a Database.
}
}
Managed Bean
@ManagedBean
@RequestScoped
public class SomeManagedBean{
// Entity Manager injection
private EntityManager _entity_manager;
@EJB
private SomeSingletonRemote _singleton;
public void createScenario(){
_singleton.createScenario();
}
public List<Event> getEventList(){
// Retrieve events from database
}
}
JSF Ansicht
<h:form>
<p:commandButton value="Start Long Stuff"
actionListener="#{SomeManagedBean.createScenario}" />
<h:outputText id="count" value="#{SomeManagedBean.getEventList.size()}" />
<p:poll interval="1" update="count" />
</h:form>
log
-> SomeManagedBean.getEventList()
< -SomeManagedBean.getEventList() // Größe = 0// Buton geklickt
-> SomeManagedBean .createScenario()
-> SomeSingleton.createScenario()
< -SomeManagedBean.createScenario()-> SomeManagedBean.getEventList() // wird am Ende des SomeSingleton.createScenario Ende
-> SomeSingleton.method1()
< -SomeSingleton.method1() //
bestehen ...
-> SomeSingleton.methodN()
< -SomeSingleton.methodN() // bestehen< -SomeSingleton.createScenario()
< -SomeManagedBean.getEventList() // size = N
I mindestens einen Anruf zu geteventlist erwartet zwischen zwei Methodi() Aufruf (dh. jede Sekunde). Wenn es in SomeSingleton.createScenario() eintritt, weiß ich nicht, warum getEventList pausiert ist.
Offenbar gibt es eine Sperre mit dem Entity Manager oder der Transaktion innerhalb createScenario. Ist das ein Wiedereintrittsproblem?
Warum haben sie [Erwähnung] (https://docs.oracle.com/javaee/7/tutorial/ejb-basicexamples002.htm) „, * Wenn kein' @ Lock' Anmerkung ist auf dem Singleton class, wird der Standardsperrtyp "@Lock (LockType.WRITE)" auf alle Geschäfts- und Timeout-Methoden angewendet * "? – Tiny
@Tiny: Kannst du bitte klarstellen, welcher Teil genau für dich unklar ist? Es sagt im Grunde, dass wenn es keine '@ Lock' Anmerkung auf der Klasse, dann werden alle Methoden standardmäßig' @Lock (LockType.WRITE) '. Dies wird auch durch die Antwort abgedeckt (aber vielleicht auf eine etwas unklare Art und ich möchte diesen Teil dann verbessern, abhängig von Ihrem Feedback). – BalusC
Diese fetten Buchstaben hier: „* A' @ Singleton' zwar standardmäßig ** Lese-/Schreib gesperrt ***“. (Sorry, ich habe zunächst einen falschen Eindruck, ein Singleton EJB hat sowohl „Lesen“ und „Schreiben“ Sperren als Standard vielleicht diese Weise Methoden Zustände zu ändern sollten „schreiben“ gesperrt standardmäßig aktiviert und den Rest, wenn überhaupt, was zu tun Status nicht ändern sollte "gelesen" standardmäßig gesperrt sein. – Tiny