Blz guivirtuoso,
agora voltando a questão da thread. Eu implementei da seguinte maneira: quando o usuario faz o cadastro ele redireciona para ObjectController que cria a thread e da o start e redireciona para o formulário de login. Assim o usuário não fica esperando o retorno do método search que demora um pouco. Segue o código abaixo.
UserController.java
@Resource
public class UsersController {
private final UserDAO dao;
private final Result result;
private final Validator validator;
private final WebUser webUser;
public UsersController(UserDAO dao, Result result, Validator validator, WebUser webUser) {
this.dao = dao;
this.result = result;
this.validator = validator;
this.webUser = webUser;
}
@Post @Path("/users")
public void add(User user) {
if (dao.existUser(user)) {
validator.add(new ValidationMessage("Email já existe", "user.email"));
}
validator.onErrorUsePageOf(UsersController.class).newUser();
dao.add(user);
result.redirectTo(ObjectsController.class).callsearch(user);
}
ObjectsController.java
@Resource
public class ObjectsController {
private final ObjectDAO dao;
private final Result result;
private final Validator validator;
private final SearchThread st;
public ObjectController(ObjectDAO dao,Result result, Validator validator, SearchThread st){
this.dao = dao;
this.result = result;
this.validator = validator;
this.st = st;
}
public void callsearch(User user){
Runnable runnable = this.st;
// Cria uma thread que recebe o comportamento do objeto runnable
Thread thread = new Thread(runnable);
// Inicia a thread
thread.start();
result.redirectTo(UsersController.class).loginForm();
}
SearchThread.java
@Component
public class SearchThread implements Runnable{
private final Session session;
private final ObjectDAO dao;
private final Result result;
public SearchThread(ObjectDAO dao, Session session, Result result){
this.session = session;
this.dao = dao;
this.result = result;
}
public void run(){
ArrayList<Object> objs = new ArrayList<Object>();
User userLast = null;
try {
userLast = loadLast();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
objs = search(userLast);
for (Object obj : objs){
dao.save(obj);
}
}
public User loadLast() throws Exception {
Criteria criteria = this.session.createCriteria( User.class );
criteria.addOrder( Order.desc( "ID" ) ).setMaxResults(1);
return ( User ) criteria.uniqueResult();
}
public ArrayList<Submission> search(User user){
...
A thread é chamada direitinho, se que o problema é que quando vai salvar ele diz que a session está fechada e assim não guarda no banco! Como eu poderia resolver esse problema? Já tentei de várias formas e nada.
Exception in thread "Thread-12" org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1347)
at tecnico.dao.ObjectDAO.save(ObjectDAO.java:24)
at br.com.myapp.SearchThread.run(SearchThread.java:50)
at java.lang.Thread.run(Thread.java:680)
PS: O problema é bem nessa linha: dao.save(obj) no run da SearchThread.