UPDATE - Estou colocando os outros métodos que são utilizados no action.
Pessoal,
Estou fazendo várias requisições ajax simultâneas para trazer vários registros de uma tabela, só que de vez em quando ele não retorna nada.
É o seguinte eu tenho uma página que chama várias vezes o loadRSSThreads.action via jquery. O engraçado que se eu tirar o assincronismo do ajax do jquery ele funciona.
Eu acho que pode ser o jeito que eu estou trabalhando com o Session do hibernate.
As vezes no método updateLayoutItemThreads ele não encontra o usuário e não carrega o resto dos dados.
Agradeço muito qualquer ajuda.
Obrigado.
Segue os códigos:
HibernateUtil:
package br.org.indt.myweb.util;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class HibernateUtil {
public static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new AnnotationConfiguration().configure()
.buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static final ThreadLocal session = new ThreadLocal();
/**
* Returns or create a new hibernate session. Keeps them bounded to the
* Thread using the ThreadLocal session static attribute.
*
* @throws HibernateException
* @return Session
*/
public static Session getSession() throws HibernateException {
Session s = (Session) session.get();
// Open a new Session, if this thread has none yet
if (s == null) {
s = sessionFactory.openSession();
// Store it in the ThreadLocal variable
session.set(s);
}
return s;
}
/**
* Closes a thread-bounded session object into the ThreadLocal session
* attribute.
*
* @throws HibernateException
*/
public static void closeSession() {
try {
Session s = (Session) session.get();
session.set(null);
if (s != null && s.isOpen())
s.close();
} catch (HibernateException ex) {
System.out.println(ex.getMessage());
}
}
}
Action do Struts2:
public String loadRSSThreads() {
session = this.getSession();
String login = (String) session.get("userlogged");
factoryUserManagerWeb = UserManagerWebFactory.getInstance();
serviceUserManagerWeb = factoryUserManagerWeb
.getUserManagerWebService();
List<RSSItemDTO> listRSSItemDTO = new ArrayList<RSSItemDTO>();
try {
String urlRSS = serviceUserManagerWeb.getFeedURL(Long
.parseLong(String.valueOf(idRSS)));
listRSSItemDTO = serviceUserManagerWeb.getThreadsFromCache(urlRSS);
serviceUserManagerWeb.updateLayoutItemThreads(login, idRSS,
listRSSItemDTO);
rssThreads = serviceUserManagerWeb.getFeedsList(login, idRSS);
} catch (MyWebException e) {
}
return SUCCESS;
}
getFeedURL
public String getFeedURL(long id) {
Session session = HibernateUtil.getSession();
BoxItem boxItem = (BoxItem) session.createQuery(
"FROM BoxItem WHERE id = ? AND type = ?")
.setCacheable(false)
.setLong(0, id)
.setString(1, "rss").uniqueResult();
HibernateUtil.closeSession();
return boxItem.getURL();
}
getThreadsFromCache
public List<RSSItemDTO> getThreadsFromCache(String urlFeed) {
Session session = HibernateUtil.getSession();
List<RSSItemDTO> listRSSItemDTO = new ArrayList<RSSItemDTO>();
System.out.println(urlFeed);
List<FeedCache> listFeedCache = session.createQuery(
"FROM FeedCache WHERE url = ?")
// .setCacheMode(CacheMode.PUT)
.setString(0, urlFeed).list();
FeedCache feedCache = listFeedCache.get(0);
List<ThreadCache> listThreadCache = feedCache.getThreads();
for (int i = 0; i < listThreadCache.size(); i++) {
ThreadCache threadCache = listThreadCache.get(i);
RSSItemDTO rssItemDTO = new RSSItemDTO();
rssItemDTO.setId(threadCache.getId());
rssItemDTO.setTitle(threadCache.getTitle());
rssItemDTO.setDescription(threadCache.getDescription());
String strContent = threadCache.getContent();
rssItemDTO.setContents(strContent);
rssItemDTO.setURL(threadCache.getUrl());
listRSSItemDTO.add(rssItemDTO);
}
HibernateUtil.closeSession();
return listRSSItemDTO;
}
updateLayoutItemThreads
public void updateLayoutItemThreads(String login, long idRSS,
List<RSSItemDTO> rssList) throws MyWebException {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
List<User> listUser = session.createQuery(
"FROM User as user WHERE user.login = ?").setString(0, login)
.list();
User user = listUser.get(0);
Set<LayoutItem> layoutItems = user.getPreference().getLayout()
.getItems();
Iterator<LayoutItem> iterator = layoutItems.iterator();
while (iterator.hasNext()) {
LayoutItem layoutItem = iterator.next();
// quando o � encontrado o idRSS do usuario
if (layoutItem.getBoxItem().getId() == idRSS) {
// remover todos os layoutitemthreads
session.createSQLQuery(
"DELETE FROM layoutitemthread WHERE layoutitemid ="
+ layoutItem.getId()).executeUpdate();
layoutItem.getLayoutItemThreads().clear();
session.save(layoutItem);
// adiciona os novos layoutitemthreads
for (int i = 0; i < rssList.size(); i++) {
RSSItemDTO rssItemDTO = rssList.get(i);
LayoutItemThread layoutItemThread = new LayoutItemThread();
layoutItemThread.setLayoutItem(layoutItem);
layoutItemThread.setTitle(rssItemDTO.getTitle());
layoutItemThread
.setDescription(rssItemDTO.getDescription());
String strContent = rssItemDTO.getContents();
layoutItemThread.setContent(strContent);
layoutItemThread.setURL(rssItemDTO.getURL());
session.save(layoutItemThread);
layoutItem.getLayoutItemThreads().add(layoutItemThread);
session.save(layoutItem);
}
session.save(user);
break;
}
}
tx.commit();
HibernateUtil.closeSession();
}
getFeedsList
public List<RSSItemDTO> getFeedsList(String login, long idRSS) {
List<RSSItemDTO> listFeeds = new ArrayList<RSSItemDTO>();
Session session = HibernateUtil.getSession();
List<User> listUser = session.createQuery(
"FROM User as user WHERE user.login = ?").setString(0, login)
.list();
User user = listUser.get(0);
Iterator<LayoutItem> iterator = user.getPreference().getLayout()
.getItems().iterator();
while (iterator.hasNext()) {
LayoutItem layoutItem = iterator.next();
if (layoutItem.getBoxItem().getId() == idRSS) {
List<LayoutItemThread> listLayoutItemThread = layoutItem
.getLayoutItemThreads();
for (int i = 0; i < listLayoutItemThread.size(); i++) {
RSSItemDTO rssItemDTO = new RSSItemDTO();
LayoutItemThread layoutItemThread = listLayoutItemThread
.get(i);
rssItemDTO.setId(layoutItemThread.getId());
rssItemDTO.setTitle(layoutItemThread.getTitle());
rssItemDTO.setURL(layoutItemThread.getURL());
rssItemDTO
.setDescription(layoutItemThread.getDescription());
listFeeds.add(rssItemDTO);
}
break;
}
}
HibernateUtil.closeSession();
return listFeeds;
}
Erro:
p><b>exception</b> <pre>javax.servlet.ServletException: Index: 0, Size: 0
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:518)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)
</pre></p><p><b>root cause</b> <pre>java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
java.util.ArrayList.RangeCheck(ArrayList.java:547)
java.util.ArrayList.get(ArrayList.java:322)
br.org.indt.myweb.persistence.UserManagerWebDAO.updateLayoutItemThreads(Unknown Source)
br.org.indt.myweb.action.UserManagerWeb.loadRSSThreads(Unknown Source)
sun.reflect.GeneratedMethodAccessor86.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:399)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:262)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:224)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor
.java:213)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86
)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor
.java:48)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86
)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor
.java:123)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.intercept(ParametersInterceptor.java:161)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor
.java:105)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74
)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor
.java:127)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor
.java:107)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206
)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.intercept(PrepareInterceptor.java:115)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170
)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor
.java:176)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)