...
As this code is heavily dependent on Spring and Hibernate, you shouldn't expect to see it packaged with a WebWork distribution. It does, however, serve as a useful example of extending the ExecuteAndWait Execute and Wait Interceptor
Code Block |
---|
title | OpenSessionExecuteAndWaitInterceptor.java |
---|
borderStyle | solid |
---|
|
import net.sf.hibernate.SessionFactory;
import com.opensymphony.webwork.interceptor.BackgroundProcess;
import com.opensymphony.webwork.interceptor.ExecuteAndWaitInterceptor;
import com.opensymphony.xwork.ActionInvocation;
/**
* The OpenSessionExecuteAndWaitInterceptor will obtain a Hibernate
* Session Factory from a Spring.
*
* The session factory will then be passed to the BackgroundProcess,
* to open a session, enable Spring's transaction management
* capabilities, and bind the Session to the background thread.
*
*/
public class OpenSessionExecuteAndWaitInterceptor extends ExecuteAndWaitInterceptor {
SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
protected BackgroundProcess getNewBackgroundProcess(String arg0, ActionInvocation arg1, int arg2) {
return new OpenSessionBackgroundProcess(arg0, arg1, arg2, sessionFactory);
}
}
|
Code Block |
---|
title | OpenSessionBackgroundProcess.java |
---|
borderStyle | solid |
---|
|
import net.sf.hibernate.FlushMode;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import org.springframework.orm.hibernate.SessionFactoryUtils;
import org.springframework.orm.hibernate.SessionHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import com.opensymphony.webwork.interceptor.BackgroundProcess;
import com.opensymphony.xwork.ActionInvocation;
/**
* The OpenSessionBackgroundProcess, when instantiated with a
* HibernateSessionFactory, will open a session, enable Spring's transaction
* management capabilities, and bind the Session to the background thread.
*
*/
public class OpenSessionBackgroundProcess extends BackgroundProcess {
SessionFactory sessionFactory;
Session openSession;public class OpenSessionBackgroundProcess extends BackgroundProcess {
SessionFactory sessionFactory;
Session openSession;
protected boolean initializationComplete = false;
private Object lock = new Object(); // used for synchronization
public OpenSessionBackgroundProcess(String name,
ActionInvocation invocation, int threadPriority,
SessionFactory factory) {
super(name, invocation, threadPriority);
this.sessionFactory = factory;
initializationComplete = true;
synchronized (lock) {
lock.notify();
}
}
protected void beforeInvocation() throws Exception {
while (!initializationComplete) {
try {
synchronized (lock) {
lock.wait(100);
}
} catch (InterruptedException e) {
// behavior ignores cause of re-awakening.
}
}
openSession = SessionFactoryUtils.getSession(sessionFactory, true);
openSession.setFlushMode(FlushMode.NEVER);
TransactionSynchronizationManager.bindResource(sessionFactory,
new SessionHolder(openSession));
super.beforeInvocation();
}
protected void afterInvocation() throws Exception {
super.afterInvocation();
TransactionSynchronizationManager.unbindResource(sessionFactory);
SessionFactoryUtils
.closeSessionIfNecessary(openSession, sessionFactory);
}
}
|