[
https://issues.apache.org/jira/browse/MYFACES-4660?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18037769#comment-18037769
]
Milan Siebenbürger commented on MYFACES-4660:
---------------------------------------------
Hi [~volosied],
I’ve just checked our version and noticed that this method has been updated
to...
{code:java}
public Set<String> getChannelTokensForUser(Serializable user, String
channel)
{
UserChannelKey userChannelKey = new UserChannelKey(user, channel);
ConcurrentMap<String, Integer> channelTokenMap =
getUserMap().get(userChannelKey);
if (channelTokenMap == null)
{
return null;
}
return channelTokenMap.keySet();
}
{code}
I believe it should be safe to fix it this way overall. Are you able to do
that? Otherwise, I'll sort it out at the end of the week (hopefully).
Sorry for the inconvenience.
Milan
> WebSockets - view destroying + multiple tabs/windows
> ----------------------------------------------------
>
> Key: MYFACES-4660
> URL: https://issues.apache.org/jira/browse/MYFACES-4660
> Project: MyFaces Core
> Issue Type: Bug
> Components: General
> Affects Versions: 4.0.0, 4.0.1, 4.0.2, 5.0.0
> Reporter: Milan Siebenbürger
> Priority: Minor
> Fix For: 5.0.0, 4.1.2, 4.0.4
>
> Attachments: test-faces23-websocket.war
>
>
> Hello,
> We have identified two (hopefully minor) bugs while using WebSockets.
> 1. destroying SessionScope channelToken when destroying ViewScope bean
> If the user reaches the NUMBER_OF_VIEWS_IN_SESSION limit, the ViewScope bean
> (which holds channelTokens) is automatically destroyed (@PreDestroy).
> Additionally, any channelToken from the parent sessionScope is destroyed,
> even if it is still in use. Unfortunately, this destruction occurs after a
> new view is created, so the component is rendered, the WebSocket session is
> connected, but the channelToken in the WebsocketScopeManager is destroyed.
> The solution to this issue could be simple. The destruction of the
> sessionScope channelToken could be left to the automatic destruction of the
> SessionScope. We have been testing this solution for several weeks, and it
> seems to be working fine.
>
> 2. using application in multiple tabs / browser windows (with same http
> session)
> When a user is using the application in more than one tab/window within the
> same HTTP session, the user session channels are duplicated (with the same
> channelToken) and connected to the same user identification, resulting in two
> or more WebSocket sessions. Push messages are then sent to all
> tokens/sessions. So far, everything is working as expected.
> However, when one of the views is destroyed (i.e., a tab/window is closed),
> the connected WebSocket session is also destroyed (which is expected).
> Unfortunately, this also will cause user connection to be removed . Since we
> don't track how many times the user is using this particular channelToken,
> the WebSocket connections in the other tabs/windows are also disrupted.
> A potential solution to this issue could involve tracking the number of times
> the user starts using the channelToken. We could then remove the user
> connection after all instances of its usage are destroyed, or, alternatively,
> when the SessionScope object is destroyed.
> Unfortunately, implementing this solution would cause a breaking change. It
> would involve replacing the Set holding channelTokens with a HashMap that
> also keeps track of the number of usages (refer to
> WebsocketSessionManager.java:62). Since the method getUserMap is public and
> may be used by others (such as ourselves, for implementing WebSocket
> heartbeat), they would need to update their code accordingly with the new
> version of MyFaces. An alternative approach could be implemented using
> another collection to hold the usage count of channelTokens. However, this
> method may not be as elegant, although it would not necessitate users to
> modify their applications.
> So, the questions:
> * which of these to implement?
> * and to which version (5.0? or 4.X?)
>
> Of course, I will prepare the changes in the form of a pull request to check
> the changes
>
> Milan
--
This message was sent by Atlassian Jira
(v8.20.10#820010)