[ 
https://issues.jboss.org/browse/RF-12219?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12695541#comment-12695541
 ] 

Milo van der Zee edited comment on RF-12219 at 5/24/12 9:10 AM:
----------------------------------------------------------------

I changed PushResource.java a little and at first glance it seems to do the 
trick. I realize that my fix/workaround limits the functionality in that all 
push clients must have different topic names on one page. Don't know if that 
was the case before my changes. As far as I can see you could use multiple push 
components listening to the same topic on one page. Not anymore...

{code:title="PushResource.java"}
        public void encode(FacesContext facesContext) throws IOException {
                ExternalContext externalContext = 
facesContext.getExternalContext();

                PushContextFactory pushContextFactory = 
ServiceTracker.getService(PushContextFactory.class);

                // resource plugin stub
                if (pushContextFactory == null) {
                        return;
                }

                PushContext pushContext = pushContextFactory.getPushContext();

                String forgetPushSessionId = 
externalContext.getRequestParameterMap().get(FORGET_PUSH_SESSION_ID_PARAM);
                if (forgetPushSessionId != null) {
                        Session oldSession = 
pushContext.getSessionManager().getPushSession(forgetPushSessionId);
                        if (oldSession != null) {
                                oldSession.invalidate();
                        }
                }

                // Session session = 
pushContext.getSessionFactory().createSession(UUID.randomUUID().toString());
                HttpSession httpSession = 
(HttpSession)externalContext.getSession(false);
                String sessionId = httpSession.getId();
                Session session = 
pushContext.getSessionManager().getPushSession(sessionId);
                if (session == null) {
                        session = 
pushContext.getSessionFactory().createSession(sessionId);
                }

                String[] topicNames = 
externalContext.getRequestParameterValuesMap().get(PUSH_TOPIC_PARAM);

                if (topicNames == null) {
                        throw new IllegalArgumentException();
                }

                Collection<TopicKey> successfulSubscriptions = 
session.getSuccessfulSubscriptions();
                List<String> newTopicNames = new ArrayList<String>();
                for (String topicName : topicNames) {
                        boolean found = false;
                        for (TopicKey topicKey : successfulSubscriptions) {
                                if (topicKey.getTopicName().equals(topicName)) {
                                        found = true;
                                        break;
                                }
                        }
                        if (!found) {
                                newTopicNames.add(topicName);
                        }
                }
                session.subscribe(newTopicNames.toArray(new String[0]));

                Map<String, Object> subscriptionData = new HashMap<String, 
Object>(4);
                subscriptionData.put("sessionId", session.getId());

                Map<TopicKey, String> failedSubscriptions = 
session.getFailedSubscriptions();
                subscriptionData.put("failures", 
getFailuresMap(failedSubscriptions));

                Writer outWriter = 
facesContext.getExternalContext().getResponseOutputWriter();
                ScriptUtils.appendScript(outWriter, subscriptionData);
        }
{code}
                
      was (Author: MilovdZee):
    I changed PushResource.java a little and at first glance it seems to do the 
trick. I realize that my fix/workaround limits the functionality in that all 
push clients must have different topic names on one page. Don't know if that 
was the case before my changes. As far as I can see you could use multiple push 
components listening to the same topic on one page. Not anymore...

{code title="PushResource.java"}
        public void encode(FacesContext facesContext) throws IOException {
                ExternalContext externalContext = 
facesContext.getExternalContext();

                PushContextFactory pushContextFactory = 
ServiceTracker.getService(PushContextFactory.class);

                // resource plugin stub
                if (pushContextFactory == null) {
                        return;
                }

                PushContext pushContext = pushContextFactory.getPushContext();

                String forgetPushSessionId = 
externalContext.getRequestParameterMap().get(FORGET_PUSH_SESSION_ID_PARAM);
                if (forgetPushSessionId != null) {
                        Session oldSession = 
pushContext.getSessionManager().getPushSession(forgetPushSessionId);
                        if (oldSession != null) {
                                oldSession.invalidate();
                        }
                }

                // Session session = 
pushContext.getSessionFactory().createSession(UUID.randomUUID().toString());
                HttpSession httpSession = 
(HttpSession)externalContext.getSession(false);
                String sessionId = httpSession.getId();
                Session session = 
pushContext.getSessionManager().getPushSession(sessionId);
                if (session == null) {
                        session = 
pushContext.getSessionFactory().createSession(sessionId);
                }

                String[] topicNames = 
externalContext.getRequestParameterValuesMap().get(PUSH_TOPIC_PARAM);

                if (topicNames == null) {
                        throw new IllegalArgumentException();
                }

                Collection<TopicKey> successfulSubscriptions = 
session.getSuccessfulSubscriptions();
                List<String> newTopicNames = new ArrayList<String>();
                for (String topicName : topicNames) {
                        boolean found = false;
                        for (TopicKey topicKey : successfulSubscriptions) {
                                if (topicKey.getTopicName().equals(topicName)) {
                                        found = true;
                                        break;
                                }
                        }
                        if (!found) {
                                newTopicNames.add(topicName);
                        }
                }
                session.subscribe(newTopicNames.toArray(new String[0]));

                Map<String, Object> subscriptionData = new HashMap<String, 
Object>(4);
                subscriptionData.put("sessionId", session.getId());

                Map<TopicKey, String> failedSubscriptions = 
session.getFailedSubscriptions();
                subscriptionData.put("failures", 
getFailuresMap(failedSubscriptions));

                Writer outWriter = 
facesContext.getExternalContext().getResponseOutputWriter();
                ScriptUtils.appendScript(outWriter, subscriptionData);
        }
{code}
                  
> Push: Test that messages do not become stale in a queue
> -------------------------------------------------------
>
>                 Key: RF-12219
>                 URL: https://issues.jboss.org/browse/RF-12219
>             Project: RichFaces
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: component-push/poll
>    Affects Versions: 4.2.1.Final
>            Reporter: Lukáš Fryč
>            Assignee: Juraj Huska
>            Priority: Critical
>             Fix For: 4.3.0.Milestone1
>
>
> According to the [Forum reference],
> we can have problems with stale messages.
> I would suggest to write tests for following scenarios and check that queue 
> is destroyed properly:
> * view expires
> * client leaves the page with {{a4j:push}} without proper clean up
> * ...
> Let's brainstorm other scenarios.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

_______________________________________________
richfaces-issues mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/richfaces-issues

Reply via email to