El problema es con un JSP que se exporta a excel, al parecer no está soltando la memoria después de hacer la petición y crear el archivo. El controlador utiliza el ModelAndView de Spring y en teoría al acabar de pintar el JSP debe liberar la memoria.
Este es el método que utilizo para traer el archivo de excel:
Código:
Mi SVC (DisplayOpenErrorsSvc) tiene un scope prototype para que por cada request cree un objeto nuevo y luego lo destruya, y así evitar que este usando el mismo, lo mismo hago con el DAO que utiliza el service:public ModelAndView exportOpenErrors(final HttpServletRequest request, final HttpServletResponse response) throws BException { final ModelAndView mav = new ModelAndView(successView + "Excel"); final SimpleDateFormat format = new SimpleDateFormat( DataPattern.OUTPUT_TIME_EXCEL.getPattern()); ApplicationContext ctx = this.getApplicationContext(); DisplayOpenErrorsSvc displayExeSvc = (DisplayOpenErrorsSvc) ctx .getBean("displayOpenErrorsSvc"); final Map<String, String> filters = new HashMap<String, String>(); final String opGL = request.getParameter(InboundField.OP_GL.get()); final String refId = request.getParameter(InboundField.REF_ID.get()); final String receivedAfter = request .getParameter(InboundField.RECEIVED_AFTER.get()); final String countryIsoCode = request .getParameter(InboundField.COUNTRY_ISO_CODE.get()); List<String> selFilters = new ArrayList<String>(); String avFilters[] = { "Operating GL", "Country", "Received After", "Ref ID" }; selFilters.add(opGL); selFilters.add(countryIsoCode); selFilters.add(receivedAfter); selFilters.add(refId); if (opGL != null && opGL.matches(DataPattern.GL_IDENTIFIER.getPattern())) { filters.put(InboundField.OP_GL.get(), opGL); } if (receivedAfter != null && receivedAfter.matches(DataPattern.DATE_SHORT_DASHED .getPattern())) { filters.put(InboundField.RECEIVED_AFTER.get(), receivedAfter); } if (countryIsoCode != null && (countryIsoCode.matches(DataPattern.WORD.getPattern()) || countryIsoCode .matches(DataPattern.WHITESPACE.getPattern())) && !IfConstant.DEFAULT_SELECT.get().equals(countryIsoCode)) { filters.put(InboundField.COUNTRY_ISO_CODE.get(), countryIsoCode); } if (refId != null && (refId.matches(DataPattern.WORD.getPattern()))) { filters.put(InboundField.REF_ID.get(), refId); } List<VErrorView> transList = displayExeSvc.getTransErrors(filters, (BillerSecuritySvc) request.getSession().getAttribute( SecurityConstants.USER_SECURITY)); Date date = new Date(); mav.addObject("tList", transList); mav.addObject("date", format.format(date)); mav.addObject("selFilters", selFilters); mav.addObject("filters", avFilters);
Código:
<bean id="displayOpenErrorsSvc" parent="txProxyTemplate" scope="prototype"> <property name="target"> <bean class="com.org.corporate.jvsone.interfaces.service.impl.DisplayOpenErrorsSvcImpl" autowire="byName" /> </property> </bean>
Código:
Usando jconsole (La herramienta que viene dentro del JDK) puedo monitorear la memoria. En un principio veo que el JSP toma cierta cantidad de memoria, pero no la libera toda una vez que el JSP ya fue exportado a Excel, así que si se vuelve a generar el archivo toma más y más recursos. Mi duda básicamente es, ¿cómo indicarle a Java que debe liberar los recursos tomados por el JSP? Gracias de antemano. <bean id="transactionDao" class="com.org.corporate.jvsone.interfaces.dao.impl.TransactionDaoImpl" parent="daoTmpl" scope="prototype" />