powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ConcurrentModificationException в tapestry при показе списка
2 сообщений из 2, страница 1 из 1
ConcurrentModificationException в tapestry при показе списка
    #33867555
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Написал портлет с использованием tapestry 4.0.2 (использовал TapestryApplicationPortlet). Задеплоил его на

jetspeed-2 портальный сервер.
Периодически вываливается ConcurrentModificationException у пользователей, открывающих страницу с моим

портлетом (текст исключения приведен ниже).

Подскажите пожалуйста, как можно побороть это исключение?

Спасибо!!


*** EXCEPTION ***


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
org.apache.hivemind.ApplicationRuntimeException
component   $View_0@65b778[View]
            context:/WEB-INF/View.page, line  7 , column  63 

             2 
location     3  <!DOCTYPE page-specification PUBLIC
             4    "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
             5    "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
             6 
             7  <page-specification class="net.mycompany.portal.news.NewsListData">
             8 
             9   <component id="newslinelist" type="For">
             10    <binding name="source" value="newslist"/>
             11    <binding name="value" value="news"/>
             12    <binding name="element" value="literal:tr"/>



java.util.ConcurrentModificationException
java.util.AbstractList$Itr.checkForComodification(Unknown Source)
java.util.AbstractList$Itr.next(Unknown Source)
org.apache.tapestry.components.ForBean.renderComponent(ForBean.java: 125 )
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java: 617 )
org.apache.tapestry.BaseComponent.renderComponent(BaseComponent.java: 92 )
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java: 617 )
org.apache.tapestry.AbstractPage.renderPage(AbstractPage.java: 275 )
org.apache.tapestry.engine.RequestCycle.renderPage(RequestCycle.java: 366 )
org.apache.tapestry.portlet.PortletRendererImpl.renderPage(PortletRendererImpl.java: 76 )
$PortletRenderer_10c7c3c1767.renderPage($PortletRenderer_10c7c3c1767.java)
org.apache.tapestry.portlet.PortletHomeService.service(PortletHomeService.java: 80 )
$IEngineService_10c7c3c1751.service($IEngineService_10c7c3c1751.java)
org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java: 66 )
org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java: 248 )
org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java: 60 )
$WebRequestServicer_10c7c3c171f.service($WebRequestServicer_10c7c3c171f.java)
$WebRequestServicer_10c7c3c171d.service($WebRequestServicer_10c7c3c171d.java)
org.apache.tapestry.portlet.RenderRequestServicerToWebRequestServicerBridge.service

(RenderRequestServicerToWebRequestServicerBridge.java: 49 )
$RenderRequestServicer_10c7c3c1717.service($RenderRequestServicer_10c7c3c1717.java)
$RenderRequestServicer_10c7c3c1711.service($RenderRequestServicer_10c7c3c1711.java)
org.apache.tapestry.portlet.ApplicationPortlet.render(ApplicationPortlet.java: 161 )
org.apache.jetspeed.factory.JetspeedPortletInstance.render(JetspeedPortletInstance.java: 102 )
org.apache.jetspeed.container.JetspeedContainerServlet.doGet(JetspeedContainerServlet.java: 230 )
javax.servlet.http.HttpServlet.service(HttpServlet.java: 689 )
javax.servlet.http.HttpServlet.service(HttpServlet.java: 802 )
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 252 )
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 173 )
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java: 672 )
org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java: 574 )
org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java: 499 )
org.apache.jetspeed.container.invoker.ServletPortletInvoker.invoke(ServletPortletInvoker.java: 215 )
org.apache.jetspeed.container.invoker.ServletPortletInvoker.render(ServletPortletInvoker.java: 126 )
org.apache.pluto.PortletContainerImpl.renderPortlet(PortletContainerImpl.java: 119 )
org.apache.jetspeed.container.JetspeedPortletContainerWrapper.renderPortlet

(JetspeedPortletContainerWrapper.java: 120 )
org.apache.jetspeed.aggregator.impl.RenderingJobImpl.execute(RenderingJobImpl.java: 121 )
org.apache.jetspeed.aggregator.impl.PortletRendererImpl.renderNow(PortletRendererImpl.java: 120 )
org.apache.jetspeed.aggregator.impl.PageAggregatorImpl.aggregateAndRender(PageAggregatorImpl.java: 199 )
org.apache.jetspeed.aggregator.impl.PageAggregatorImpl.aggregateAndRender(PageAggregatorImpl.java: 182 )
org.apache.jetspeed.aggregator.impl.PageAggregatorImpl.build(PageAggregatorImpl.java: 106 )
org.apache.jetspeed.aggregator.AggregatorValve.invoke(AggregatorValve.java: 48 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.decoration.DecorationValve.invoke(DecorationValve.java: 110 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.pipeline.valve.impl.ActionValveImpl.invoke(ActionValveImpl.java: 147 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.container.ContainerValve.invoke(ContainerValve.java: 76 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.profiler.impl.ProfilerValveImpl.invoke(ProfilerValveImpl.java: 255 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.security.impl.LoginValidationValveImpl.invoke(LoginValidationValveImpl.java: 159 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.security.impl.PasswordCredentialValveImpl.invoke(PasswordCredentialValveImpl.java: 149 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.localization.impl.LocalizationValveImpl.invoke(LocalizationValveImpl.java: 169 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.security.impl.AbstractSecurityValve$ 1 .run(AbstractSecurityValve.java: 117 )
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Unknown Source)
org.apache.jetspeed.security.impl.AbstractSecurityValve.invoke(AbstractSecurityValve.java: 111 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.container.url.impl.PortalURLValveImpl.invoke(PortalURLValveImpl.java: 67 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.capabilities.impl.CapabilityValveImpl.invoke(CapabilityValveImpl.java: 128 )
org.apache.jetspeed.pipeline.JetspeedPipeline$Invocation.invokeNext(JetspeedPipeline.java: 166 )
org.apache.jetspeed.pipeline.JetspeedPipeline.invoke(JetspeedPipeline.java: 145 )
org.apache.jetspeed.engine.JetspeedEngine.service(JetspeedEngine.java: 214 )
org.apache.jetspeed.engine.JetspeedServlet.doGet(JetspeedServlet.java: 238 )
javax.servlet.http.HttpServlet.service(HttpServlet.java: 689 )
javax.servlet.http.HttpServlet.service(HttpServlet.java: 802 )
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 252 )
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 173 )
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 213 )
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 178 )
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java: 432 )
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 126 )
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 105 )
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 107 )
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 148 )
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 869 )
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection

(Http11BaseProtocol.java: 664 )
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java: 527 )
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java: 80 )
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java: 684 )
java.lang.Thread.run(Unknown Source)



***** View.html *****


Код: plaintext
1.
2.
3.
4.
5.
6.
<table cellspacing="2">
      <tr jwcid="newslinelist">
            <td><span jwcid="date">date</span></td>
            <td><a href="" jwcid="newsLink"><span jwcid="title">title</span></a></td>
      </tr>
</table>



***** View.page *****


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE page-specification PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">

<page-specification class="net.mycompany.portal.news.NewsListData">

      <component id="newslinelist" type="For">
            <binding name="source" value="newslist"/>
            <binding name="value" value="news"/>
            <binding name="element" value="literal:tr"/>
      </component>

      <component id="date" type="Insert">
            <binding name="value" value="news.date"/>
      </component>

      <component id="title" type="Insert">
            <binding name="value" value="news.title"/>
      </component>

      <component id="newsLink" type="GenericLink">
            <binding name="href" value="news.newsURL"/>
      </component>

</page-specification>



***** View.java *****


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
package net.mycompany.portal.news.newslist;

import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.*;
import net.mycompany.portal.utils.DBUtils;
import org.apache.tapestry.annotations.InjectObject;
import org.apache.tapestry.html.BasePage;
import org.apache.tapestry.web.WebRequest;

public abstract class NewsListData extends BasePage {

    @InjectObject("infrastructure:request")
    public abstract WebRequest getWebRequest();


    public String getCurrentDate() {
     String curDateStr = getWebRequest().getParameterValue("date");
     if (curDateStr != null) {
         curDateStr = curDateStr.trim();
     } else
         curDateStr = "";
     return curDateStr;
    }


    public List getNewslist() {
     List<News> newslist = new ArrayList<News>();
     ResultSet rs = null;
     PreparedStatement ps = null;
     Connection connection = null;

     try {
         connection = DBUtils.getDB2Connection();
     } catch (Exception e) {
         e.printStackTrace();
     }
     if (connection != null) {
         try {
          ps = connection
               .prepareStatement("select viewfrom,title,identifier from MYCOMPANY.tb_documents where date

(viewFrom) = ? order by VIEWFROM");
          ps.setDate( 1 , DBUtils.StringToSQLDate(getCurrentDate(), "yyyyMMdd"));
          rs = ps.executeQuery();
          while (rs.next()) {
              newslist.add(new News((rs.getTime( 1 )).toString(), rs.getString( 2 ), rs.getString( 3 )));
          }
         } catch (Exception e) {
          e.printStackTrace();
         } finally {
          try {
              ps.close();
              rs.close();
              connection.close();
          } catch (SQLException e) {
              e.printStackTrace();
          }
         }
     }
     return newslist;
    }

    public abstract News getNews();
}


***** DBUtils.java *****


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
package net.mycompany.portal.utils;

import java.sql.*;
import java.text.*;
import javax.naming.*;
import javax.sql.DataSource;

public class DBUtils {

	private static DataSource ds;


	private static DataSource getDS() throws NamingException {
		if (ds == null) {
			InitialContext ctx = new InitialContext();
			ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MYCOMPANYOnline");
		}
		return ds;
	}


	public static Connection getDB2Connection() throws SQLException, NamingException {
		return getDS().getConnection();
	}


	protected static void closeConnection(Connection connection) throws Exception {
		connection.close();
	}


	public static java.sql.Date StringToSQLDate(String dateString, String pattern) {
		return new java.sql.Date(StringToUtilDate(dateString, pattern).getTime());
	}
}


***** web.xml *****


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
<!DOCTYPE web-app
  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
      <display-name>app</display-name>
      <servlet>
            <servlet-name>ApplicationServlet</servlet-name>
            <servlet-class>
                  org.apache.tapestry.ApplicationServlet
            </servlet-class>
      </servlet>
      <servlet>
            <servlet-name>HibernateServlet</servlet-name>
            <servlet-class>
                  net.mycompany.portal.news.HibernateServlet
            </servlet-class>
      </servlet>
      <servlet-mapping>
            <servlet-name>HibernateServlet</servlet-name>
            <url-pattern>/servlet/HibernateServlet</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
            <servlet-name>ApplicationServlet</servlet-name>
            <url-pattern>/app</url-pattern>
      </servlet-mapping>
      <resource-ref>
            <description>DB Connection Pool</description>
            <res-ref-name>jdbc/MYCOMPANYOnline</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
      </resource-ref>
</web-app>




***** portlet.xml *****


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
<portlet-app version="1.0"
      xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd 

http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
      <portlet>
            <description xml:lang="EN"></description>
            <portlet-name>NewsContent</portlet-name>
            <display-name xml:lang="EN">NewsContent</display-name>
            <portlet-class>
                  org.apache.tapestry.portlet.ApplicationPortlet
            </portlet-class>
            <expiration-cache> 0 </expiration-cache>
            <supports>
                  <mime-type>text/html</mime-type>
                  <portlet-mode>view</portlet-mode>
                  <portlet-mode>help</portlet-mode>
            </supports>
            <supported-locale>en</supported-locale>
            <portlet-info>
                  <title>NewsContent</title>
                  <short-title>NewsContent</short-title>
                  <keywords></keywords>
            </portlet-info>
      </portlet>
      <portlet>
            <description xml:lang="EN"></description>
            <portlet-name>NewsLine</portlet-name>
            <display-name xml:lang="EN">NewsLine</display-name>
            <portlet-class>
                  org.apache.tapestry.portlet.ApplicationPortlet
            </portlet-class>
            <expiration-cache> 0 </expiration-cache>
            <supports>
                  <mime-type>text/html</mime-type>
                  <portlet-mode>view</portlet-mode>
                  <portlet-mode>help</portlet-mode>
            </supports>
            <supported-locale>en</supported-locale>
            <portlet-info>
                  <title>NewsLine</title>
                  <short-title>NewsLine</short-title>
                  <keywords></keywords>
            </portlet-info>
      </portlet>
</portlet-app>
</web-app>
...
Рейтинг: 0 / 0
ConcurrentModificationException в tapestry при показе списка
    #33872235
pretender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть одно предположение, но проверить его мне самому довольно сложно, поскольку воспроизвести такой Environment, в котором работает приложение, не представляется возможным. Т.ч. придется строить догадки…

Еще одна оговорка: Мои рассуждения относятся к 3.0, т.ч. если что-то изменилось (интерфейс, который я советую использовать, изменился или вообще исчез), то заранее извиняюсь, придется искать аналоги или смотреть доку на эту тему, чтобы узнать, как это теперь надо делать.

По сути:
Мне кажется, что проблема в том, что список новостей, получаемый методом getNewslist() все время формируется заново (при каждом обращении к методу), что не очень хорошо при работе с циклом for.

Выход, который предлагаю:
1) создать поле List<News> newslist = null в классе страницы NewsListData;
2) метод public List getNewslist() переделать, чтобы он возвращал это поле;
3) страница должна имплементировать интерфейс PageRenderListener;
4) следующие методы надо реализовать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
     protected   void  initialize() {
         super .initialize();
        addPageRenderListener( this );
    }

     protected   void  prepareForRender(IRequestCycle cycle) {
         super .prepareForRender(cycle);
// создаем список новостей
	newslist =  new  ArrayList<News>();
// здесь надо заполнить его (получение из базы как у Вас уже это реализовано)
    }

     public   void  detach() {
// сбросить список
	 newslist =  null         
         super .detach();
    }
Вот так вроде эта проблема должна решиться. Повторюсь, если в 4.0 подход изменился и интерфейса PageRenderListener нет, то надо доку читать.

P.S. А может дело и не в этом вовсе... Но попытка не пытка, так ведь?
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / ConcurrentModificationException в tapestry при показе списка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]