raiseAsynchronousEvent and db persistence
jhedden.jhedden.opsource.net Sep 15, 2008 6:09 PMSo Im not sure why this persists:
events.raiseEvent("createTicket", selectedId);yet this doesnt:
events.raiseAsynchronousEvent("createTicket", selectedId);This is SLSB. submitProcess() is relevant method:
@Stateless
@Name("activationManager")
@Restrict("#{identity.loggedIn}")
public class ActivationManagerAction implements ActivationManager {
@Logger
private Log log;
@In
private EntityManager entityManager;
@In
private Events events;
@In
private Order order;
@In(required = false)
@Out(required = false, scope = ScopeType.PAGE)
private Environment environment;
@In(required = false)
@Out(required = false, scope = ScopeType.PAGE)
private EnvironmentActivationProcess process;
@RequestParameter
private Integer optionId;
@RequestParameter
private Integer selectedId;
@In
private NavController navController;
/**
* Method to load all processes for an Env.
* @param environmentId Integer
*/
@Begin(flushMode = FlushModeType.MANUAL, join = true)
public void getProcessDashboard(Integer environmentId) {
for (Environment env : order.getEnvironmentList()) {
if (env.getId().equals(environmentId)) {
environment = entityManager.find(Environment.class, env.getId());
entityManager.refresh(environment);
}
}
navController.activation();
}
/**
* Method to add a process.
*/
public void addProcess() {
ActivationProcess option = entityManager.find(ActivationProcess.class, optionId);
entityManager.refresh(option);
process = new EnvironmentActivationProcess();
process.setActivationProcess(option);
process.setEnvironment(environment);
environment.addProcess(process);
entityManager.persist(process);
entityManager.flush();
}
/**
* Method to delete a process.
*/
public void deleteProcess() {
process = entityManager.find(EnvironmentActivationProcess.class, selectedId);
entityManager.refresh(process);
environment.removeEnvironmentActivationProcess(process);
entityManager.remove(process);
entityManager.flush();
FacesUtil.addInfoMessage("Option successfully removed.");
}
/**
* Submit a process for RealOps to pickup.
*/
public void submitProcess() {
events.raiseAsynchronousEvent("createTicket", selectedId);
FacesUtil.addInfoMessage("Process successfully submitted.");
}
/**
* Method to load a process.
*/
public void loadProcess() {
process = entityManager.find(EnvironmentActivationProcess.class, selectedId);
entityManager.refresh(process);
}
/**
* Method to load an env.
*/
public void loadEnvironment() {
environment = entityManager.find(Environment.class, environment.getId());
entityManager.refresh(environment);
}
/**
* Method to save a process.
*/
public void saveProcess() {
entityManager.merge(process);
entityManager.flush();
FacesUtil.addInfoMessage("Manual process is now valid.");
}
}This is the Observer, which in turn accesses a WS and then persists results:
@Name("ticketObserver")
public class TicketObserver {
@Logger
private Log log;
@In
private EntityManager entityManager;
/**
* Creates RNT Ticket.
* @param id Integer
*/
@SuppressWarnings("unused")
@Observer("createTicket")
public void createTicket(Integer id) {
EnvironmentActivationProcess process = entityManager.find(EnvironmentActivationProcess.class, id);
entityManager.refresh(process);
process.setSubmitProcess(true);
String rntTicketId = null;
try {
Integer serviceId = process.getActivationProcess().getId();
TicketService service = TicketServiceFactory.getService(serviceId);
service.createRNTTicket(process);
} catch (GeneralServiceException e) {
log.error("Exception creating ticket");
e.printStackTrace();
}
entityManager.merge(process);
entityManager.flush();
}
}persistence.xml:
<?xml version="1.0" encoding="UTF-8"?> <!-- Persistence deployment descriptor for dev profile --> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="ooord" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/ooordDatasource</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="jboss.entity.manager.factory.jndi.name" value="java:/ooordEntityManagerFactory"/> <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/> </properties> </persistence-unit> </persistence>
and finally components.xml :
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:core="http://jboss.com/products/seam/core"
xmlns:persistence="http://jboss.com/products/seam/persistence"
xmlns:drools="http://jboss.com/products/seam/drools"
xmlns:bpm="http://jboss.com/products/seam/bpm"
xmlns:security="http://jboss.com/products/seam/security"
xmlns:mail="http://jboss.com/products/seam/mail"
xmlns:framework="http://jboss.com/products/seam/framework"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:web="http://jboss.com/products/seam/web"
xmlns:spring="http://jboss.com/products/seam/spring"
xmlns:transaction="http://jboss.com/products/seam/transaction"
xsi:schemaLocation=
"http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.0.xsd
http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.0.xsd
http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.0.xsd
http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.0.xsd
http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.0.xsd
http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.0.xsd
http://jboss.com/products/seam/framework http://jboss.com/products/seam/framework-2.0.xsd
http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.0.xsd
http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.0.xsd
http://jboss.com/products/seam/spring http://jboss.com/products/seam/spring-2.0.xsd
http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.0.xsd">
<core:init debug="@debug@" jndi-pattern="@jndiPattern@" />
<core:transactionListener/>
<transaction:ejb-transaction/>
<core:manager concurrent-request-timeout="10000" conversation-timeout="3600000" conversation-id-parameter="cid"/>
<web:multipart-filter url-pattern="*.seam" max-request-size="10000000" create-temp-files="true" disabled="false" />
<web:context-filter url-pattern="/order/file/*"/>
<security:identity security-rules="#{securityRules}" authenticate-method="#{authenticator.authenticate}" remember-me="true"/>
<mail:mail-session host="localhost" port="25"/>
<persistence:managed-persistence-context name="entityManager" auto-create="true"
persistence-unit-jndi-name="java:/ooordEntityManagerFactory"/>
<spring:context-loader>
<spring:config-locations>
<value>classpath*:beanRefFactory.xml</value>
</spring:config-locations>
</spring:context-loader>
<event type="org.jboss.seam.security.notLoggedIn">
<action execute="#{redirect.captureCurrentView}"/>
</event>
<event type="org.jboss.seam.security.loginSuccessful">
<action execute="#{redirect.returnToCapturedView}"/>
</event>
<!--
<bpm:jbpm>
<bpm:process-definitions>
<value>orderManagement.jpdl.xml</value>
</bpm:process-definitions>
<bpm:pageflow-definitions>
<value>orderFlow.jpdl.xml</value>
</bpm:pageflow-definitions>
</bpm:jbpm>
-->
<!-- Drools -->
<drools:rule-base name="securityRules">
<drools:rule-files>
<value>/security.drl</value>
</drools:rule-files>
</drools:rule-base>
<drools:rule-base name="saveOrderRules">
<drools:rule-files>
<value>/saveOrderRules.drl</value>
</drools:rule-files>
</drools:rule-base>
<drools:managed-working-memory name="saveOrderWM" auto-create="true" rule-base="#{saveOrderRules}"/>
<drools:rule-base name="orderEmailRules">
<drools:rule-files>
<value>/orderEmailRules.drl</value>
</drools:rule-files>
</drools:rule-base>
<drools:managed-working-memory name="orderEmailWM" auto-create="true" rule-base="#{orderEmailRules}"/>
<!-- Framework Queries -->
<framework:entity-home name="activationProcessHome" entity-class="net.opsource.ooord.model.ActivationProcess"/>
<factory name="activationProcess" value="#{activationProcessHome.instance}"/>
<framework:entity-query name="activationProcesses" ejbql="select a from ActivationProcess a" />
<framework:entity-home name="dataCenterHome" entity-class="net.opsource.ooord.model.DataCenter"/>
<factory name="dataCenter" value="#{dataCenterHome.instance}"/>
<framework:entity-query name="dataCenters" ejbql="select d from DataCenter d" />
<framework:entity-home name="databaseHome" entity-class="net.opsource.ooord.model.Database"/>
<factory name="database" value="#{databaseHome.instance}"/>
<framework:entity-query name="databases" ejbql="select d from Database d" order="d.type"/>
<framework:entity-home name="databaseVersionHome" entity-class="net.opsource.ooord.model.DatabaseVersion"/>
<factory name="databaseVersion" value="#{databaseVersionHome.instance}"/>
<framework:entity-query name="databaseVersions" ejbql="select d from DatabaseVersion d">
<framework:restrictions>
<value>d.database = #{server.database}</value>
</framework:restrictions>
</framework:entity-query>
<framework:entity-home name="databaseOptionHome" entity-class="net.opsource.ooord.model.DatabaseOption"/>
<factory name="databaseOption" value="#{databaseOptionHome.instance}"/>
<framework:entity-query name="databaseOptions1" ejbql="select d from DatabaseOption d where d.optionLevel = 1">
<framework:restrictions>
<value>d.database = #{server.database}</value>
</framework:restrictions>
</framework:entity-query>
<framework:entity-query name="databaseOptions2" ejbql="select d from DatabaseOption d where d.optionLevel = 2">
<framework:restrictions>
<value>d.database = #{server.database}</value>
</framework:restrictions>
</framework:entity-query>
</components>Ive tried everything from @Transactional to @TransactionAttribute to using:
<spring:transaction platform-transaction-manager="#{txManager}" join-transaction="true" conversation-context-required="false" />
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />Ive obviously got some sort of knowledge gap.