1 2 Previous Next 15 Replies Latest reply on Nov 10, 2009 2:28 AM by waltbarrow

    Seam 2.2.0.GA, Wicket - cannot create longterm conversation

    waltbarrow

      Clint, I started a new thread.  Sorry to abuse the other one :)


      The application I have is extremely simple. No database, minimal page content.  The intent is to be able to play with conversations without the other baggage.  The Main page allows you to start a conversation and it displays a list of currently executing threads (stored in the sessino) along with links so you can get back to the associated conversation. ThingOneButtonPage allows you to fool around in the current conversation, start a nested conversaion, go back to the Main page (suspend the current conversation), or terminate the current conversation. Other pages do similar things for nested conversations.  Here are code snippets for these two pages:


      Main:


      package com.afscn.itapps.wicketapp;
      ...
      public class Main extends BaseTemplate
      {
        @In
        Conversation conversation;
       
        private Component                messages;

        public Main()
        {
          super( "Wicket Conversation Demo Application" );
          createMyComponents();
        }
       
        public void createMyComponents()
        {
          ( ( WicketappSession ) WicketappSession.get() ).cleanUpLinks();
         
          // create components ...
          ThingOneLink thingOneLink = new ThingOneLink( "thing-one-link" );
          ThingOneButton thingOneButton =
            new ThingOneButton( "thing-one-button" );
          ThingTwoButton thingTwoButton =
            new ThingTwoButton( "thing-two-button" );
          Form mainForm = new Form( "main-form" );
          List<ConversationLink> linkList =
            ( ( WicketappSession ) WicketappSession.get() ).getLinks();
          Label listCount =
            new Label( "list-count", new Model( linkList.size() ) );
          ConversationListView conversationListView =
            new ConversationListView( "con-list-view",
                                      linkList );

          // create component hierarchy ...
          mainForm.add( thingOneLink );
          mainForm.add( thingOneButton );
          mainForm.add( thingTwoButton );
          mainForm.add( listCount );
          mainForm.add( conversationListView );
          add( mainForm );
        }

        class ThingOneLink extends Link
        {
          public ThingOneLink( String a_id )
          {
            super( a_id );
          }

          @Override
          @Begin
          public void onClick()
          {
            this.setResponsePage( ThingOneButtonPage.class );
          }
        }

        class ThingOneButton extends Button
        {
          public ThingOneButton( String a_id )
          {
            super( a_id );
          }

          @Override
          @Begin
          public void onSubmit()
          {
            this.setResponsePage( ThingOneButtonPage.class );
          }
        }

        class ThingTwoButton extends Button
        {
          public ThingTwoButton( String a_id )
          {
            super( a_id );
          }

          @Override
          @Begin
          @End
          public void onSubmit()
          {
            this.setResponsePage( Main.class );
          }
        }

        class ConversationListView extends ListView
        {
          public ConversationListView( String a_id, List<ConversationLink> a_model )
          {
            super( a_id, a_model );
          }

          @Override
          public void populateItem( final ListItem listItem )
          {
            ConversationLink clink = ( ConversationLink ) listItem.getModelObject();

            // create components ...
            Label label = new Label( "con-name", clink.getName() );

            PageParameters pars = new PageParameters();
            pars.add( "cid", clink.getCid() );
            Link link = new BookmarkablePageLink( "con-link", clink.getClazz(), pars );
       
            // create component tree ...
            listItem.add( label );
            listItem.add( link );
          }
        }

      }

      ThingOneButtonPage:

      package com.afscn.itapps.wicketapp;

      public class ThingOneButtonPage extends BaseTemplate
      {
        @In
        Conversation                     conversation;

        @In
        Manager                          manager;

        public ThingOneButtonPage()
        {
          super( "Thing One Button Page" );
          createMyComponents( null );
        }
       
        public void createMyComponents( String a_convId )
        {
          ConversationLink link =
            new ConversationLink( manager.getCurrentConversationEntry(),
                                  "Thing One (" + conversation.getId() + ")",
                                  ThingOneButtonPage.class,
                                  conversation.getId() );
          ( ( WicketappSession ) WicketappSession.get() ).addLink( link );

          // create components ...
          Form mainForm = new Form( "main-form" );
          DoSomethingButton doSomethingButton =
            new DoSomethingButton( "do-something-button" );
          DoPage2Button doPage2Button =
            new DoPage2Button( "do-page2-button" );
          DoSubConButton doSubConButton =
            new DoSubConButton( "do-subcon-button" );
          DoneButton doneButton = new DoneButton( "done" );

          // create component hierarchy ...
          mainForm.add( doSomethingButton );
          mainForm.add( doPage2Button );
          mainForm.add( doSubConButton );
          mainForm.add( doneButton );
          add( mainForm );
        }

        class DoPage2Button extends Button
        {
          public DoPage2Button( String a_id )
          {
            super( a_id );
          }

          @Override
          public void onSubmit()
          {
            this.setResponsePage( ThingOneButtonPage2.class );
          }
        }

        class DoSomethingButton extends Button
        {
          public DoSomethingButton( String a_id )
          {
            super( a_id );
          }

          @Override
          public void onSubmit()
          {
            this.setResponsePage( ThingOneButtonPage.class );
          }
        }

        class DoSubConButton extends Button
        {
          public DoSubConButton( String a_id )
          {
            super( a_id );
          }

          @Override
          @Begin ( nested = true)
          public void onSubmit()
          {
            this.setResponsePage( ThingOneSubConPage.class );
          }
        }

        class DoneButton extends Button
        {
          public DoneButton( String a_id )
          {
            super( a_id );
          }

          @Override
          @End
          public void onSubmit()
          {
            this.setResponsePage( Main.class );
          }
        }

      }

      The application is packaged as an EAR with an embedded WAR.  All of the Wicket code is moved into the WEB-INF/wicket directory of the WAR during construction of the WAR,and we rely on the built-in Seam Filter instrumentation.  Each page has a built-in conversation-id display which is how we can tell when the conversation is being propagated or a new on created. In 2.1.1.GA, this code works just fine.  In 2.2.0.GA, the id changes constantly and the list of suspended conversation grows accordingly.


      If you need more information, let me know.  I really like some of the new features of 2.2.0.GA with regard to Wicket, especially now that you fixed the class-level injection problem.  I really don't want to go back to 2.1.1.GA if I don't have to.


      Thanks!


      Walt Barrow

        • 1. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
          waltbarrow
          Geesh, you can tell how often I do this! Is there any way to go back and edit a post?  Let me try again:

          Clint, I started a new thread. Sorry to abuse the other one :)

          The application I have is extremely simple. No database, minimal page content. The intent is to be able to play with conversations without the other baggage. The Main page allows you to start a conversation and it displays a list of currently executing threads (stored in the sessino) along with links so you can get back to the associated conversation. ThingOneButtonPage allows you to fool around in the current conversation, start a nested conversaion, go back to the Main page (suspend the current conversation), or terminate the current conversation. Other pages do similar things for nested conversations. Here are code snippets for these two pages:

          Main:

          package com.afscn.itapps.wicketapp;
          ...
          public class Main extends BaseTemplate
          {
            @In Conversation conversation;
            private Component messages;
           
            public Main()
            {
              super( "Wicket Conversation Demo Application" );
              createMyComponents();
            }

            public void createMyComponents(  )
            {
              ( ( WicketappSession ) WicketappSession.get() ).cleanUpLinks();
              // create components ...
              ThingOneLink thingOneLink =
                new ThingOneLink( "thing-one-link" );
              ThingOneButton thingOneButton =
                new ThingOneButton( "thing-one-button" );
              ThingTwoButton thingTwoButton =
                new ThingTwoButton( "thing-two-button" );
              Form mainForm = new Form( "main-form" );
              List<ConversationLink> linkList =
                ( ( WicketappSession ) WicketappSession.get() ).getLinks();
              Label listCount =
                new Label( "list-count", new Model( linkList.size() ) );
              ConversationListView conversationListView = new
              ConversationListView( "con-list-view", linkList );
              // create component hierarchy ...
              mainForm.add( thingOneLink ); mainForm.add( thingOneButton );
              mainForm.add( thingTwoButton ); mainForm.add( listCount );
              mainForm.add( conversationListView ); add( mainForm );
            }

            class ThingOneLink extends Link
            {
              public ThingOneLink( String a_id )
              {
                super( a_id );
              }

              @Override
              @Begin public void onClick()
              {
                this.setResponsePage( ThingOneButtonPage.class );
              }
            }

            class ThingOneButton extends Button
            {
              public ThingOneButton( String a_id )
              {
                super( a_id );
              }

              @Override
              @Begin public void onSubmit()
              {
                this.setResponsePage( ThingOneButtonPage.class );
              }
            }

            class ThingTwoButton extends Button
            {
              public ThingTwoButton( String a_id )
              {
                super( a_id );
              }

              @Override
              @Begin
              @End
              public void onSubmit()
              {
                this.setResponsePage( Main.class );
              }
            }

            class ConversationListView extends
            {
              public ConversationListView( String a_id,
                                           List<ConversationLink> a_model )
              {
                super( a_id, a_model );
              }

              @Override
              public void populateItem( final ListItem listItem )
              {
                ConversationLink clink =
                  ( ConversationLink ) listItem.getModelObject();
                // create components ...
                Label label = new Label( "con-name", clink.getName() );
                PageParameters pars =
                  new PageParameters(); pars.add( "cid", clink.getCid() );
                Link link =
                  new BookmarkablePageLink( "con-link", clink.getClazz(),
                                            pars );
                // create component tree ...
                listItem.add( label );
                listItem.add( link );
              }
            }
          }

          ThingOneButtonPage:

          package com.afscn.itapps.wicketapp;
          public class ThingOneButtonPage extends BaseTemplate
          {
            @In Conversation conversation;
            @In Manager manager;
           
            public ThingOneButtonPage()
            {
              super( "Thing One Button Page" );
              createMyComponents( null );
            }

            public void createMyComponents( String a_convId )
            {
              ConversationLink link =
                new ConversationLink( manager.getCurrentConversationEntry(),
                "Thing One (" + conversation.getId() + ")",
                ThingOneButtonPage.class,
                conversation.getId() );
              ( ( WicketappSession ) WicketappSession.get() ).addLink( link );
              // create components ...
              Form mainForm = new Form( "main-form" );
              DoSomethingButton doSomethingButton =
                new DoSomethingButton( "do-something-button" );
              DoPage2Button doPage2Button =
                new DoPage2Button( "do-page2-button" );
              DoSubConButton doSubConButton =
                new DoSubConButton( "do-subcon-button" );
              DoneButton doneButton = new DoneButton( "done" );
              // create component hierarchy ...
              mainForm.add( doSomethingButton );
              mainForm.add( doPage2Button );
              mainForm.add( doSubConButton );
              mainForm.add( doneButton );
              add( mainForm );
            }

            class DoPage2Button extends Button
            {
              public DoPage2Button( String a_id )
              {
                super( a_id );
              }
            
              @Override public void onSubmit()
              {
                this.setResponsePage( ThingOneButtonPage2.class );
              }
            }

            class DoSomethingButton extends Button
            {
              public DoSomethingButton( String a_id )
              {
                super( a_id );
              }

              @Override
              public void onSubmit()
              {
                this.setResponsePage( ThingOneButtonPage.class );
              }
            }

            class DoSubConButton extends Button
            {
              public DoSubConButton( String a_id )
              {
                super( a_id ); }
                @Override
                @Begin ( nested = true)
                public void onSubmit()
                {
                  this.setResponsePage( ThingOneSubConPage.class );
                }
              }

              class DoneButton extends Button
              {
                public DoneButton( String a_id )
                {
                  super( a_id );
                }
               
                @Override
                @End
                public void onSubmit()
                {
                  this.setResponsePage( Main.class );
                }
              }
            }
          }

          The application is packaged as an EAR with an embedded WAR. All of the Wicket code is moved into the WEB-INF/wicket directory of the WAR during construction of the WAR,and we rely on the built-in Seam Filter instrumentation. Each page has a built-in conversation-id display which is how we can tell when the conversation is being propagated or a new on created. In 2.1.1.GA, this code works just fine. In 2.2.0.GA, the id changes constantly and the list of suspended conversation grows accordingly.

          If you need more information, let me know. I really like some of the new features of 2.2.0.GA with regard to Wicket, especially now that you fixed the class-level injection problem. I really don't want to go back to 2.1.1.GA if I don't have to.

          Thanks!

          Walt Barrow
          • 2. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
            cpopetz

            If you set the log4j level for org.jboss.seam.core.Manager to DEBUG, do you see messages like Beginning long-running conversation ?  I'm trying to determine whether conversations are being marked long-running and simply not propagated to the new page, or if they aren't getting started at all.

            • 3. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
              waltbarrow
              Clint, Here is the log after setting the log4j properties.  I first logged into the application, then clicked on the button to start a long-running conversation (see log statement for Main).  Then I clicked the link on the next page to "do some work" in the long-running conversation (see log statemement for ThingOneButtonPage). Finally, I clicked the button to end the conversation.  The log shows that Seam is trying to start the conversation, but it doesn't succeed, apparently. Here's the annotated excerpt from the log file:

              [Manager] Discarding conversation state: 1
              [Manager] No stored conversation
              [Manager] Discarding conversation state: 2
              [Manager] No stored conversation
              [RequestListenerInterface] registered listener interface [RequestListenerInterface name=INewBrowserWindowListener, method=public abstract void org.apache.wicket.markup.html.INewBrowserWindowListener.onNewBrowserWindow()]
              [AuthenticatonBean] ########## Authenticating barroww
              [Manager] Discarding conversation state: 3
              [Manager] No stored conversation
              [Main] ########## creating Main page (conversation id = 4 ...
              [Manager] Discarding conversation state: 4
              [Manager] No stored conversation

              (pressed button to start conversation)
              [Main] ########## starting long-running conversation (conversation id = 5 ...
              [Manager] Beginning long-running conversation
              [Manager] Storing conversation state: 5
              [Manager] No stored conversation
              [ThingOneButtonPage] ########## creating ThingOneButtonPage (conversation id = 6 ...
              [Manager] Discarding conversation state: 6
              [Manager] No stored conversation
              [Manager] Discarding conversation state: 7
              [Manager] No stored conversation

              ("did some work" in the current conversation)
              [ThingOneButtonPage] ########## creating ThingOneButtonPage (conversation id = 8 ...
              [Manager] Discarding conversation state: 8
              [Manager] No stored conversation

              (ended conversation)
              [ThingOneButtonPage] ########## ending long-running conversation (conversation id = 9 ...
              [Manager] Discarding conversation state: 9
              [Manager] No stored conversation

              (some logging I had in the Session object when trying to clean up
              the running conversation list I manage ... ignore this)
              [ThingOneButtonPage] ##########
              [ThingOneButtonPage] ########## Null conversation entry found: 6
              [ThingOneButtonPage] ##########
              [ThingOneButtonPage] ##########
              [ThingOneButtonPage] ########## Null conversation entry found: 8
              [ThingOneButtonPage] ##########

              (back to the main page)
              [Main] ########## creating Main page (conversation id = 10 ...
              [Main] ########## In populateItem
              [Main] ########## In populateItem
              [Manager] Discarding conversation state: 10

              • 4. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                cpopetz

                Ok, I see what's happening.  Under the previous incarnation of the wicket conversation propagation code, we used a cid=## parameter that was appended to the query string regardless of what was happening.  This was problematic for a few reasons, and it was also not idiomatic wicket, because wicket lets you choose url parameter encoding schemes, i.e. you can do /foo/bar/3/blat/4, and this approach left us with /foo/bar/3/blat/4?cid=2


                So now we propagate the id of any long-running conversation when you call things like setResponsePage(), and we store the propagated conversation id into the target page.  However, the semantics of the @Begin annotation in Seam are such that the propagation only happens after the annotated method returns.  In your case, your @Begin on your method is not marking the conversation as long running until after setResponsePage has been called, so the new page is not picking up the conversation id.


                Under Weld, and hence under Seam3, marking conversations as non-transient (long-running) won't happen via an annotation, but rather via a method call.  That's also the approach my team uses in our Seam/Wicket code, and I recommend it.  So instead of using @Begin, you should use


                Conversation.instance().begin();
                



                or


                Conversation.instance().beginNested();
                



                You can also inject the current conversation and access it that way, i.e.


                @In Conversation conversation;
                conversation.begin();
                



                The latter is pretty close to what the situation will look like under Seam 3, except that @In will be @Inject.


                Also, you should be aware that nested conversations are not part of the JSR-299 (weld) standard, and I do not know if they will be supported under Seam 3.  Their semantics have always been a little odd to me, and I avoid them, FWIW.

                • 5. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                  waltbarrow

                  Clint,


                  Thanks for the information.  I did try using the conversation.begin()/end() methods but got the same results; however, I'll look at it again and make sure I didn't miss something.  I know what you mean about nested conversations.  I included them in my demo program just because they were there.  If they're going away, that's okay with me :)

                  • 6. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                    waltbarrow
                    Clint,

                    I modified the application to use begin()/end() instead of annotations and got the same results.  Here is the log from the Manager that occurred when I clicked the link to start a conversation and redirect to the next page (setResponsePage()):

                    [Log] Login succeeded
                    [Manager] Discarding conversation state: 3
                    [Manager] No stored conversation
                    [Manager] Discarding conversation state: 4
                    [Manager] No stored conversation
                    [Manager] Beginning long-running conversation
                    [Manager] Storing conversation state: 5
                    [Manager] No stored conversation
                    [ThingOneButtonPage] ########## Conversation Id: 6
                    [Manager] Discarding conversation state: 6

                    I placed the call to conversation.begin() as the first line of code in the button callback method.

                    • 7. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                      cpopetz

                      Ok, I should have looked at your example more closely.


                      So, as you probably know, there are two types of calls to setResponsePage().  One takes a class that represents a page, and one takes an instance of a page.  The former results in a BookmarkablePageRequestTarget, and the latter in a non-bookmarkable PageRequestTarget.


                      In the previous version of the Seam/Wicket integration, conversations were propagated through request parameters, in a filter, and thus were applied regardless of where you were going.  That is, once you marked a conversation as long running, there was no way to get out of it with wicket...anywhere you linked would also be long running.  This is not how Seam/JSF works...the jsf <s:link/> tag provides mechanisms for choosing whether the conversation is propagated.


                      So I was faced with the question of what types of use cases in wicket are good candidates for implicit propagation of the conversation, and which are not? I decided that when setting a request target with the instance form of setResponsePage, which is not bookmarkable, one is typically moving through a sequence of related pages, and thus wants the conversation propagated.  When using the class (bookmarkable) form of setResponsePage, one is often moving to a place where you need a fresh conversation.


                      This is also a practical concern...the conversation id is now stored in the wicket page map.  When you setResponsePage(SomePage.class), the IRequestTarget that is set before the redirect has no page map for the new page...as the new page won't be created until after the redirect.  Hence there is nowhere to propagate the conversation id except through a request parameter.

                      There are of course two situations this new default handling in 2.2.X doesn't work:




                      1. when you want to abandon the conversation when doing setResponsePage(somePageInstance)

                      2. when you want to propagate the conversation when doing setResponsePage(SomePage.class)




                      And we need to handle those.  Currently, there is no way to handle (1), and for 2, which is the case you're encountering, you can add "&cid=Conversation.instance().getId()" to the request.  But that's pretty ugly.


                      I've been pondering this as I work on the Wicket/Weld integration.  I think the appropriate way to handle both cases is to provide a SeamWebApplication.setPropagateConversation(boolean).  If you set that to true when the request target is a bookmarkable page, we'll add the parameter to the request params for you, in a way that plays well with wicket's url encoding strategies.  If you set that parameter to false when the target is a page instance, we'll avoid propagating the conversation.


                      I'm interested in your thoughts on this; there aren't many people exercising the Seam/Wicket conversational code, so I have little feedback on this so far.

                      • 8. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                        waltbarrow
                        Clint,

                        I'm not sure I completely understand what you said, but thank you for such a detailed explanation.  I *think* I agree with your approach to put an application-wide flag indicating whether or not to propagate the current conversation or not, but my concern would be would that approach handle multiple, concurrent, long-term conversations?  I suppose one could train the SeamWebApplication class to handle multiple, concurrent conversations based on the Seam conversation id, or perhaps manage a list of pointers to Seam Conversation components. Then the code that handles the setResponsePage() (or wherever) could look the current Seam conversation up in the application-wide list and, if it finds an entry there, propagate the conversation id in the request (like I really know how this is done :^) ).  A facade for the Seam Conversation component could be written to handle adding/removing conversation entries from the application-wide store and deal with the Seam Conversation component, making all of this relatively transparent to the developer.  Does that make any sense?

                        In writing my sample application, I definitely see the need to be able to handle concurrent, long-term conversations.  The Hotel Booking JSF example is an example of where that is useful.  So, I'd like to see whatever solution you come up with take that into account.

                        Thank you for taking the time to look at all of this and I appreciate your explanations of the "inner workings".  It has always fascinated me how Seam works even though most of it is way above my head.

                        • 9. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                          cpopetz

                          It's not actually an application-wide flag...it's just a method on Application, which will use the thread-local RequestCycle object to track the flag, i.e. the flag is per request and means when I get done with this request, if I have given you a knew place to go, should any current long-running conversation be propagated to that place?  The default will be yes if the new place is an already-instantiated page (i.e. setResponsePage(new SomePage())), and no if the new place is a bookmarkable page (i.e. setResponsePage(SomePage.class)).  I'm trying to get a feel for whether those defaults make sense. 


                          As an example of why I think they do, imagine a left menu with a bunch of Link components pointing to bookmarkable pages mounted in your application.  In Seam 2.1.X, if you started a long running conversation, it would be propagated if you clicked on a menu link to go somewhere else in your app. In 2.2.X, the default is not to propagate.

                          • 10. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                            waltbarrow

                            Clint,


                            I think I understand better what you're trying to do and I think your assumptions are sound.  I modified my test application and by redirecting to a page instance I was able to extend the conversation.  However, when I returned to the home page by redirecting to a page class, the entire conversation was destroyed.  The behavior I noticed before was that a new conversation was created, but the original long-term conversation remained.  Doing this, I was able to start multiple long-term conversations and have list them on my main page where I could jump back into them whenever I wanted.  It seems to me that we need some way to suspend a conversation in addition to being able to terminate one so we can support parallel conversations (like when you are booking a hotel room and looking at several different hotels at once).  Perhaps we need another flag that would only be used when you're redirecting to a page class.  This flag would allow the existing conversation to remain as-is, yet start a new conversation for the new page request.  What do you think?

                            • 11. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                              cpopetz

                              Walter Barrow wrote on Nov 04, 2009 20:22:


                              However, when I returned to the home page by redirecting to a page class, the entire conversation was destroyed. 


                              How do you know it was destroyed?  Nothing in the seam integration ever destroys conversations.  A conversation is destroyed by three mechanisms:



                              1. Timing out (default 20 min)

                              2. Ending with Conversation.end()

                              3. Being transient, not marked long-running, and thus destroyed at the end of the request


                              • 12. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                                cpopetz

                                To clarify, I meant nothing in the seam/Wicket intgeration destroys conversations, i.e. nothing specific to Wicket.

                                • 13. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                                  waltbarrow

                                  Clint,


                                  I guess destroyed was the wrong choice of words.  Let me try to explain what I meant.  In my sample application, when a new conversation is started, I add an new entry to a list.  This entry contains a pointer to the current ConversationEntry, as obtained from the Manager, along with some identifying information for the conversation.  On my Main page, I display this list of ConversationEntrys along with a link that lets me jump back into the conversation.  With 2.1.1.GA, I would jump out of a conversation by doing a setResponsePage( Main.class ).  The Main page would display the list of currently active conversations and all was well.  With 2.2.0.GA, what is happening (I Think) is when I jump to the Main page, the current conversation is being ended because I'm redirecting to a page class and it no longer shows up in the list (I have logic that goes through the list and removes all ConversationEntrys that have ended). What would be nice to have, I think, is the option of leaving a conversation without ending it.  In this case I don't want to extend the conversation or end it, just get a new one and go on.  I hope that clarifies what I was talking about.  I confused ended with destroyed.

                                  • 14. Re: Seam 2.2.0.GA, Wicket - cannot create longterm conversation
                                    cpopetz
                                    "Destroyed" is the same as "ended" in this context.  We shouldn't be ending the conversation when you setResponsePage(Main.class).  If you turn on log4j bugging as we did before, does it show the conversation in question is actually being ended?
                                    1 2 Previous Next