4 Replies Latest reply on Jun 16, 2017 12:21 PM by dhaycurrie

    Fastpath invite and transfer issues

      Hi,

       

      I'm setting up a fastpath service based on desktop clients (just Spark).

       

      For testing purposes I'm using a setup built on the following:

       

      - Server Name: im

       

      - 2 Users: User_A_1, User_A_2 that belong to Group_A

      - 2 Users: User_B_1, User_B_2 that belong to Group_B

      - 2 Users: User_C_1, User_C_2 that belong to Group_C

       

      Then, we have the fastpath workgroups setup as follows:

       

      - WorkGroup_1 with Default_Queue -> Members Group_B

      - WorkGroup_2 with Default_Queue -> Members Group_C

       

      Now, the test cases:

       

      CASE A:

      - User_A_1 initiates a conversation with Workgroup_1@im:

        * User_B_1or User_B_2 receive a notification (based on what the dispatcher decides) from FastPath and the conference gets created.

      - User_B_* (Workgroup_1 member) want to transfer the conversation to WorkGroup_2, so the petition is sent, a notification window appears on the chosen WorkGroup_2 agent, the transfer is accepted, but the agent doesn't join, as the server returns an error.

       

      From the Spark Debug interface on the WorkGroup_2 agent I see this:

       

      sent by the agent:

      <iq id="24Gl7-110" to="WorkGroup_2@workgroup.im" type="set">
        <offer-accept xmlns="http://jabber.org/protocol/workgroup" id="kcm7ra38"/>
      </iq>
      

       

      server response:

      <iq id="24Gl7-110" to="User_C_1@im/spark" from="WorkGroup_2@workgroup.im" type="error">
        <error code="404" type="CANCEL">
          <item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
        </error>
      </iq>
      
      

      and in the Debug server logs I get this:

      2011.05.13 10:38:42 Request not found by ID: kcm7ra38
      2011.05.13 10:38:42 Request not found while accepting offer: 
      org.jivesoftware.util.NotFoundException
              at org.jivesoftware.xmpp.workgroup.request.Request.getRequest(Request.java:99)
              at org.jivesoftware.xmpp.workgroup.WorkgroupIQHandler.handleIQSet(WorkgroupIQHandler.java:188)
              at org.jivesoftware.xmpp.workgroup.WorkgroupIQHandler.process(WorkgroupIQHandler.java:90)
              at org.jivesoftware.xmpp.workgroup.Workgroup.process(Workgroup.java:459)
              at org.jivesoftware.xmpp.workgroup.Workgroup.process(Workgroup.java:482)
              at org.jivesoftware.xmpp.workgroup.WorkgroupManager.processPacket(WorkgroupManager.java:684)
              at org.jivesoftware.openfire.component.InternalComponentManager$RoutableComponents.process(InternalComponentManager.java:587)
              at org.jivesoftware.openfire.spi.RoutingTableImpl.routeToComponent(RoutingTableImpl.java:352)
              at org.jivesoftware.openfire.spi.RoutingTableImpl.routePacket(RoutingTableImpl.java:237)
              at org.jivesoftware.openfire.IQRouter.handle(IQRouter.java:324)
              at org.jivesoftware.openfire.IQRouter.route(IQRouter.java:121)
              at org.jivesoftware.openfire.spi.PacketRouterImpl.route(PacketRouterImpl.java:76)
              at org.jivesoftware.openfire.net.StanzaHandler.processIQ(StanzaHandler.java:337)
              at org.jivesoftware.openfire.net.ClientStanzaHandler.processIQ(ClientStanzaHandler.java:93)
              at org.jivesoftware.openfire.net.StanzaHandler.process(StanzaHandler.java:302)
              at org.jivesoftware.openfire.net.StanzaHandler.process(StanzaHandler.java:194)
              at org.jivesoftware.openfire.nio.ConnectionHandler.messageReceived(ConnectionHandler.java:169)
              at org.apache.mina.common.support.AbstractIoFilterChain$TailFilter.messageReceived(AbstractIoFilterChain.java:570)
              at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
              at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
              at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
              at org.apache.mina.common.IoFilterAdapter.messageReceived(IoFilterAdapter.java:80)
              at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
              at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
              at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
              at org.apache.mina.filter.codec.support.SimpleProtocolDecoderOutput.flush(SimpleProtocolDecoderOutput.java:58)
              at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:185)
              at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
              at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
              at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
              at org.apache.mina.filter.executor.ExecutorFilter.processEvent(ExecutorFilter.java:239)
              at org.apache.mina.filter.executor.ExecutorFilter$ProcessEventsRunnable.run(ExecutorFilter.java:283)
              at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
              at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51)
              at java.lang.Thread.run(Thread.java:662)
      
      

       

       

      Any ideas on what's happening?

       

      This thing is driving me crazy. It's been almost a week trying to get it working and it's a no go...

        • Fastpath invite and transfer issues
          Walter Ebeling

          looking into this in high level of detail

          • Re: Fastpath invite and transfer issues
            Leonardo

            Hi,

             

              I have the same problem. Looking for a solution I found this situation:

             

            offer sent by the server (transfer user to user):

             

            < iq type="set" id="52-61" from="servicedesk@workgroup.XXXX" to="admin@XXXX/Spark 2.6.3">
                     <offer xmlns="http://jabber.org/protocol/workgroup" id="6q8t5a121" jid="3700efe7@XXXX/3700efe7">
                                <metadata xmlns="http://jivesoftware.com/protocol/workgroup">
                                          <value ... />
                                </metadata>
                                <timeout>20</timeout>
                                <session xmlns="http://jivesoftware.com/protocol/workgroup" id="14lgg2120" workgroup="servicedesk@workgroup.XXXX"/>
                                <transfer type="user">
                                          <inviter>joao@XXXX/Spark 2.6.3</inviter><room>14lgg2120@conference.XXXX</room>
                                          <metadata xmlns="http://jivesoftware.com/protocol/workgroup">
                                                    <value ... />
                                          </metadata>
                                          <reason>Eu estou transferindo esta conversa para você.</reason>
                                </transfer>
                      </offer>
            </iq>
            

             

            sent by the agent:

             

            <iq id="52-61" to="admin@XXX" type="set">
              <offer-accept xmlns="http://jabber.org/protocol/workgroup" id="14lgg2120"/>
            </iq>
            

             

            So, when the server receive this message his try to find this request/offer to stop notifications, but do a search using a sessionID instead of PacketID.

             

            //(WorkgroupIQHandler.java)
            else if ("offer-accept".equals(queryName)) {
                        try {
                            InterceptorManager interceptorManager = OfferInterceptorManager.getInstance();
                            String id = iq.attributeValue("id");
                            String jid = iq.attributeValue("jid");
                            if (id != null || jid  != null) {
                                Request request;
                                if (id != null) {
                                    // Search request by its unique ID
                                    request = Request.getRequest(id);
                                }
            ...
            

             

             

            //(Request.java)    
               public static Request getRequest(String requestID) throws NotFoundException {
                    Request request = requests.get(requestID);
                    if (request == null) {
                        Log.debug("Request not found by ID: " + requestID);
                        throw new NotFoundException();
                    }
                    return request;
                }
            
            

             

            I think this is related to the smack lib used by Spark, when receive transfer packet/offer Spark sends a AceeptPacket, but this packet send SessioID on place of PacketID

             

            (Offer.java)
                /**
                 * Packet for accepting an offer.
                 */
                private class AcceptPacket extends IQ {
            
                     AcceptPacket(String workgroup) {
                        this.setTo(workgroup);
                        this.setType(IQ.Type.SET);
                    }
            
                    public String getChildElementXML() {
                        return "<offer-accept id=\"" + Offer.this.getSessionID() +
                                "\" xmlns=\"http://jabber.org/protocol/workgroup" + "\"/>";
                    }
                }
            
            

             

            I'm looking for a solution without change smack.jar.... How you get a solution?