[ 
https://issues.apache.org/jira/browse/WICKET-5588?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15902628#comment-15902628
 ] 

Daniel Stoch edited comment on WICKET-5588 at 3/9/17 7:57 AM:
--------------------------------------------------------------

I am still trying to resolve this problem (my local patch does not work in all 
cases). So for now I see 2 possible solutions, which Emond described earlier:
1. Use the same websocket connection for ajax updates.
2. Ordering responses (which requires solving such problems as: lost responses, 
timeouts, maybe some kind of redelivery, etc...).

I have look again on your patch Martin (solution 1):
{quote}
I've implemented Emond Papegaaij's idea of pushing the Ajax response via the 
WebSocket connection.
{quote}

As I said in my previous comment this does not work well for me. But now I have 
change this implementation getAjaxRequestTargetProvider() method to have much 
simpler "if" condition:
{code}
 if (connection != null) {
  target = new WebSocketRequestHandler(context, connection);
} else {
  target = new AjaxRequestHandler(context);
}
{code}
And it looks promising (I must do more tests).

I have a couple of questions:
1. Why in your example patch you have wrapped WebSocketRequestHandler (ws) 
inside AjaxRequestHandler, and you do not return ws directly?
2. ws.respond() call is inside detach() method - what is the reason of this 
(maybe it is a source of my problems when I tested this solution for the first 
time last year)?
3. Currently I have found an issue that listeners (IListener) does not work - 
this is natural because it is not implemented in WebSocketRequestHandler. What 
do you think to add such implementation (as it is in AjaxRequestHandler)?


was (Author: interface):
I am still trying to resolve this problem (my local patch does not work in all 
cases). So for now I see 2 possible solutions, which Emond described earlier:
1. Use the same websocket connection for ajax updates.
2. Ordering responses (which requires solving such problems as: lost responses, 
timeouts, maybe some kind of redelivery, etc...).

I have look again on your patch Martin:
{quote}
I've implemented Emond Papegaaij's idea of pushing the Ajax response via the 
WebSocket connection.
{quote}

As I said in my previous comment this does not work well for me. But now I have 
change this implementation getAjaxRequestTargetProvider() method to have much 
simpler "if" condition:
{code}
 if (connection != null) {
  target = new WebSocketRequestHandler(context, connection);
} else {
  target = new AjaxRequestHandler(context);
}
{code}
And it look promising (I must do more tests).

I have a couple of questions:
1. Why in your example patch Martin you have wrapped WebSocketRequestHandler 
(ws) inside AjaxRequestHandler, and you do not return ws directly?
2. ws.respond() call is inside detach() method - what is the reason of this 
(maybe it is a source of my problems when I tested this solution for the first 
time)?
3. Currently I have found an issue that listeners (IListener) does not work - 
this is natural because it is not implemented in WebSocketRequestHandler. What 
do you think to add such implementation (as it is in AjaxRequestHandler)?

> Mixing Ajax and push (Atmosphere/native-websockets) updates does not respect 
> order
> ----------------------------------------------------------------------------------
>
>                 Key: WICKET-5588
>                 URL: https://issues.apache.org/jira/browse/WICKET-5588
>             Project: Wicket
>          Issue Type: Improvement
>          Components: wicket, wicket-atmosphere, wicket-native-websocket
>    Affects Versions: 6.15.0, 6.21.0
>            Reporter: Daniel Stoch
>            Assignee: Emond Papegaaij
>         Attachments: 5588-ajax-thru-websocket.tgz
>
>
> As far as I know in Wicket ajax calls by default using the same channel and 
> they are queued. But in wicket-atmosphere integration on the client side the 
> refreshing is done by calling (inside wicket-atomosphere.js):
>   Wicket.Ajax.process(response.responseBody);
> It looks like Wicket.Ajax.process() function does not use channels 
> management, so it can result in out-of-order response processing. This method 
> was added to support Atmosphere push calls in Wicket. See the commit (for 
> issue: WICKET-4668):
> https://github.com/apache/wicket/commit/130b063722e55510f2b2a3b47889e14210a5a32f
> *Example scenario to reproduce this problem:*
> When we try to refresh a component (panelA) via ajax when two different 
> threads in the "same" time perform such refresh.
> 1. The first thread (thread1) is a standard servlet container thread to 
> handle user request from a browser:
> - user clicks AjaxLink and on onClick method panelA is refreshed by 
> target.add(panelA).
> 2. The second thread (thread2) is a notification from a backend system which 
> causes a panelA refreshing too:
> - it can be done for eg. using Atmosphere integration by EventBus.post() - 
> panelA is refreshed by target.add(panelA) too.
> On the server side only one thread can access a page at a time so everything 
> is "queued" properly: the thread1 panelA refresh is executed, then the 
> thread2 refresh code is fired.
> But it looks like on the client side the order of ajax calls is undefined: 
> sometimes JS code added from the thread1 is executed as first, sometimes as a 
> second one. On my computer this order almost always is wrong. It leads to an 
> incorrect situation when the component state on a server is different than 
> the DOM tree on the client browser (so for example user can clicks not 
> existing link).



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to