One way could be to not update the model until you are attaching again, or - kind of the same principle - update the model from the buffer on detach. You still need some more synchronization though: the attach/ detach models need to be synchronized in that case, and you want to do it it such a way that you don't have a bunch of clients waiting for it.
Eelco On 3/2/06, Ramnivas Laddad <[EMAIL PROTECTED]> wrote: > Spoke too soon... that doesn't work and I see why. Let me think more to > come with a solution. > > -Ramnivas > > > Ramnivas Laddad wrote: > Okay... I solved my problem by making the model thread-aware... > > class TestModel implements IModel { > private List<String> asyncBuffer = new ArrayList<String>(); > private List<String> underlying = new ArrayList<String>(); > > synchronized public Object getObject(Component component) { > underlying.addAll(asyncBuffer); > asyncBuffer.clear(); > return underlying; > } > > synchronized public void add(String message) { > asyncBuffer.add(message); > } > > public IModel getNestedModel() { > return null; > } > > public void setObject(Component component, Object object) { > } > > public void detach() { > } > } > > Thanks Igor for your help. > > -Ramnivas > > Ramnivas Laddad wrote: > So more like the Swing's single thread policy... In that case, how do I > update model when I receive model data asynchronously? Does Wicket has > something like EventQueue.invokeLater() or EventQueue.invokeAndWait()? > > -Ramnivas > > Igor Vaynberg wrote: > doh, i guess i should have looked at the code before jumping to conclusions. > i assumed you were updating the listview in the callback of the ajax > behavior. assumption is the mother of ... > > you have a thread that is running unsynchronized! and updating the model of > the component. > > we synchronize on the session for you so the code inside components you > write does not have to be threadsafe. your TestModelUpdater breaks that. > > so the listview maybe rendering and looping over its model WHILE your > thread adds another item to the list! that can cause all sorts of weird > things. > > long story short, you cannot have a run away thread updating wicket > components or their models. its not meant for that. > > -Igor > > > > On 3/2/06, Igor Vaynberg <[EMAIL PROTECTED]> wrote: > > > > here is what i am getting after a minute or so > > interesting > > > > -Igor > > > > 18:09:06.263 WARN!! Exception for > /quickstart/app?wicket:interface=:3:wmc:-1:IUnversionedBehaviorListener&wicket:behaviorId=0&random= > 0.46824654938259036 > > > > wicket.WicketRuntimeException: Internal Error: Could not render error page > class wicket.markup.html.pages.InternalErrorPage > > > > at > wicket.request.compound.DefaultExceptionResponseStrategy.respond > (DefaultExceptionResponseStrategy.java:106) > > at > wicket.request.compound.AbstractCompoundRequestCycleProcessor.respond(AbstractCompoundRequestCycleProcessor.java:76) > > at wicket.RequestCycle.step(RequestCycle.java :971) > > > > at wicket.RequestCycle.steps(RequestCycle.java:1005) > > at wicket.RequestCycle.request(RequestCycle.java:451) > > > > at > wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:209) > > > > at javax.servlet.http.HttpServlet.service > (HttpServlet.java:740) > > at > javax.servlet.http.HttpServlet.service(HttpServlet.java:853) > > at > org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:358) > > at > org.mortbay.jetty.servlet.WebApplicationHandler.dispatch > (WebApplicationHandler.java:294) > > at > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:567) > > at > org.mortbay.http.HttpContext.handle(HttpContext.java:1807) > > at > org.mortbay.jetty.servlet.WebApplicationContext.handle > (WebApplicationContext.java:525) > > at > org.mortbay.http.HttpContext.handle(HttpContext.java:1757) > > at > org.mortbay.http.HttpServer.service(HttpServer.java:879) > > at > org.mortbay.http.HttpConnection.service(HttpConnection.java > :790) > > at > org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:961) > > at > org.mortbay.http.HttpConnection.handle(HttpConnection.java:807) > > at > org.mortbay.http.SocketListener.handleConnection(SocketListener.java > :218) > > at > org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:300) > > at > org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:511) > > > > Caused by: java.lang.ClassCastException: > wicket.ajax.AjaxRequestTarget$EncodingResponse > > at > wicket.protocol.http.WebRequestCycle.getWebResponse(WebRequestCycle.java:99) > > at > wicket.protocol.http.WebRequestCycle.redirectTo(WebRequestCycle.java:130) > > at > wicket.request.target.component.PageRequestTarget.respond > (PageRequestTarget.java:60) > > > > at > wicket.request.compound.DefaultResponseStrategy.respond(DefaultResponseStrategy.java:47) > > at > wicket.request.compound.AbstractCompoundRequestCycleProcessor.respond > (AbstractCompoundRequestCycleProcessor.java :66) > > > > at wicket.RequestCycle.respond(RequestCycle.java:877) > > at wicket.RequestCycle.step(RequestCycle.java:946) > > ... 18 more > > > > > > > > > > > > On 3/2/06, Ramnivas Laddad <[EMAIL PROTECTED]> wrote: > > > > > > Sending again. Sourceforge is rejecting .zip attachment, so please > change extension of the attached file to .zip. > > > > > > -Ramnivas > > > === > > > Here it is... (removed lib/*.jar to cut down size). > > > > > > > > > -Ramnivas > > > > > > > > > Igor Vaynberg wrote: > > > any chance you can stick those two files into a quickstart project? > > > > > > -Igor > > > > > > > > > > > > On 3/2/06, Ramnivas Laddad < [EMAIL PROTECTED]> wrote: > > > > Hi, > > > > > > > > I now have an AJAXified listview working. However, occasionally (very > > > > frequently on a real application and less frequently on a simplified > > > > application :-() it crashes (program and stack trace at the end of > this > > > > email). > > > > > > > > I have an updater thread that adds new entries to the model for the > > > > listview. > > > > > > > > A few observations: > > > > 1. In the onRender() method, size returned by getViewSize() is 1, and > > > > the index of the item to be rendered is 1. This all seems correct, as > > > > the updater thread has just added a new item. However, item returned > by > > > > (ListItem)get(Integer.toString(index)) is null. > > > > > > > > 2. When the crashed view is re-rendered, I do no see the following > > > > snippet in markup produced: > > > > <script language="JavaScript" > > > > type="text/javascript" > > > > > > > > > src="/resources/wicket.ajax.AbstractDefaultAjaxBehavior/wicket-ajax.js"> > > > > </script> > > > > As a result, no AJAX updates take place. > > > > > > > > While it seems to be concurrency-related bug, the model itself as I > have > > > > written seems thread-safe. > > > > > > > > Thanks. > > > > > > > > -Ramnivas > > > > > > > > Source code: > > > > ========== > > > > public class AJAXListHome extends WebPage { > > > > public AJAXListHome() { > > > > TestModel model = new TestModel(); > > > > > > > > WebMarkupContainer wmc = new WebMarkupContainer("wmc"); > > > > add(wmc); > > > > ListView testListView = new TestListView("dates", model); > > > > wmc.add(testListView); > > > > wmc.add(new > AjaxSelfUpdatingTimerBehavior(Duration.seconds(2))); > > > > > > > > new Thread(new TestModelUpdater(model, testListView)).start(); > > > > } > > > > } > > > > > > > > class TestListView extends ListView { > > > > public TestListView(String id, TestModel model) { > > > > super(id, model); > > > > } > > > > > > > > @Override > > > > protected void populateItem(ListItem item) { > > > > String date = (String)item.getModelObject(); > > > > item.add(new Label("date", date)); > > > > } > > > > } > > > > > > > > class TestModel implements IModel { > > > > private List<String> underlying = new ArrayList<String>(); > > > > > > > > synchronized public Object getObject(Component component) { > > > > return underlying; > > > > } > > > > > > > > synchronized public void add(String message) { > > > > underlying.add(message); > > > > } > > > > > > > > public IModel getNestedModel() { > > > > return null; > > > > } > > > > > > > > public void setObject(Component component, Object object) { > > > > } > > > > > > > > public void detach() { > > > > } > > > > } > > > > > > > > class TestModelUpdater implements Runnable { > > > > private TestModel model; > > > > private Component view; > > > > > > > > static int counter = 0; > > > > > > > > public TestModelUpdater(TestModel model, Component view) { > > > > this.model = model; > > > > this.view = view; > > > > } > > > > > > > > public void run() { > > > > while(true) { > > > > model.add("string" + counter); > > > > // notifying model doesn't seem to be required; should it > > > > be notified? > > > > // view.modelChanged(); > > > > counter++; > > > > try { > > > > TimeUnit.SECONDS.sleep(1); > > > > } catch (InterruptedException ignored) { > > > > } > > > > } > > > > } > > > > } > > > > === > > > > Stack trace: > > > > Root cause: > > > > > > > > java.lang.NullPointerException > > > > at > wicket.markup.html.list.ListView.renderItem(ListView.java:606) > > > > at > wicket.markup.html.list.ListView.onRender(ListView.java > :567) > > > > at wicket.Component.render(Component.java:1516) > > > > at > wicket.MarkupContainer.renderNext(MarkupContainer.java:1206) > > > > at > wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:875) > > > > at wicket.MarkupContainer.onComponentTagBody > (MarkupContainer.java:795) > > > > at > wicket.Component.renderComponent(Component.java:1602) > > > > at wicket.MarkupContainer.onRender(MarkupContainer.java:805) > > > > at wicket.Component.render(Component.java:1516) > > > > at wicket.MarkupContainer.renderNext > (MarkupContainer.java:1206) > > > > at > wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:875) > > > > at > wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:795) > > > > at wicket.Component.renderComponent(Component.java > :1602) > > > > at wicket.MarkupContainer.onRender(MarkupContainer.java:805) > > > > at wicket.Component.render(Component.java:1516) > > > > at > wicket.MarkupContainer.renderNext(MarkupContainer.java:1206) > > > > at wicket.MarkupContainer.renderAll > (MarkupContainer.java:822) > > > > at wicket.Page.onRender(Page.java:846) > > > > at wicket.Component.render(Component.java:1516) > > > > at wicket.Page.doRender(Page.java:390) > > > > at > > > > > wicket.request.target.component.BookmarkablePageRequestTarget.respond > (BookmarkablePageRequestTarget.java:224) > > > > at > > > > > wicket.request.compound.DefaultResponseStrategy.respond(DefaultResponseStrategy.java:47) > > > > at > > > > > wicket.request.compound.AbstractCompoundRequestCycleProcessor.respond(AbstractCompoundRequestCycleProcessor.java > :66) > > > > at > wicket.RequestCycle.doProcessEventsAndRespond(RequestCycle.java:824) > > > > at > wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:851) > > > > at wicket.RequestCycle.step(RequestCycle.java:931) > > > > at wicket.RequestCycle.steps (RequestCycle.java:1005) > > > > at wicket.RequestCycle.request(RequestCycle.java:451) > > > > at > wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:208) > > > > at > javax.servlet.http.HttpServlet.service(HttpServlet.java:740) > > > > at > javax.servlet.http.HttpServlet.service(HttpServlet.java:853) > > > > at > org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:358) > > > > at > > > > > org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java > :294) > > > > at > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:567) > > > > at > org.mortbay.http.HttpContext.handle(HttpContext.java:1807) > > > > at > > > > > org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationContext.java > :525) > > > > at > org.mortbay.http.HttpContext.handle(HttpContext.java:1757) > > > > at > org.mortbay.http.HttpServer.service(HttpServer.java:879) > > > > at > org.mortbay.http.HttpConnection.service(HttpConnection.java:790) > > > > at org.mortbay.http.HttpConnection.handleNext > (HttpConnection.java:961) > > > > at > org.mortbay.http.HttpConnection.handle(HttpConnection.java:807) > > > > at > org.mortbay.http.SocketListener.handleConnection(SocketListener.java:218) > > > > at org.mortbay.util.ThreadedServer.handle( > ThreadedServer.java:300) > > > > at > org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:511) > > > > > > > > > > > > > > > > > > > > > ------------------------------------------------------- > > > > This SF.Net email is sponsored by xPML, a groundbreaking scripting > language > > > > that extends applications into web and mobile media. Attend the live > webcast > > > > and join the prime developer group breaking into this new coding > territory! > > > > > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 > > > > _______________________________________________ > > > > Wicket-user mailing list > > > > Wicket-user@lists.sourceforge.net > > > > > https://lists.sourceforge.net/lists/listinfo/wicket-user > > > > > > > > > > > > > > > > > > > ------------------------------------------------------- > This SF.Net email is sponsored by xPML, a groundbreaking scripting language > that extends applications into web and mobile media. Attend the live webcast > and join the prime developer group breaking into this new coding territory! > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 > _______________________________________________ Wicket-user > mailing list Wicket-user@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/wicket-user > ------------------------------------------------------- > This SF.Net email is sponsored by xPML, a groundbreaking scripting language > that extends applications into web and mobile media. Attend the live webcast > and join the prime developer group breaking into this new coding territory! > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 > _______________________________________________ Wicket-user > mailing list Wicket-user@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/wicket-user > ------------------------------------------------------- > This SF.Net email is sponsored by xPML, a groundbreaking scripting language > that extends applications into web and mobile media. Attend the live webcast > and join the prime developer group breaking into this new coding territory! > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 > _______________________________________________ Wicket-user > mailing list Wicket-user@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/wicket-user ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid0944&bid$1720&dat1642 _______________________________________________ Wicket-user mailing list Wicket-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wicket-user