[ 
https://issues.apache.org/activemq/browse/CAMEL-1633?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Edward Campbell reopened CAMEL-1633:
------------------------------------


My fault.
After going through a bunch of testing, I found some issues with the fix I 
originally posted.
Specifically the doStart() method of XmppConsumer.java should be as follows:

{code:java}
    protected void doStart() throws Exception {
        connection = endpoint.createConnection();

        if (endpoint.getRoom() == null) {
            Chat privateChat = 
connection.getChatManager().createChat(endpoint.getParticipant(), this);
            if (LOG.isInfoEnabled()) {
                LOG.info("Open private chat to: " + 
privateChat.getParticipant());
            }
        } else {
            // add the presence packet listener to the connection so we only 
get packets that concerns us
            final ToContainsFilter toFilter = new 
ToContainsFilter(endpoint.getParticipant());
            final AndFilter packetFilter = new AndFilter(new 
PacketTypeFilter(Presence.class), toFilter);
            connection.addPacketListener(this, packetFilter);

            muc = new MultiUserChat(connection, 
endpoint.resolveRoom(connection));
            muc.addMessageListener(this);
            DiscussionHistory history = new DiscussionHistory();
            history.setMaxChars(0); // we do not want any historical messages

            muc.join(endpoint.getNickname(), null, history, 
SmackConfiguration.getPacketReplyTimeout());
            if (LOG.isInfoEnabled()) {
                LOG.info("Joined room: " + muc.getRoom() + " as: " + 
endpoint.getNickname());
            }
        }

        super.doStart();
    }
{code}

For some reason the order of adding listeners is important with smack. I 
haven't yet downloaded the smack source to find out why.


> XMPPConsumer.processPacket does not correctly handle received non-message 
> packets.
> ----------------------------------------------------------------------------------
>
>                 Key: CAMEL-1633
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-1633
>             Project: Apache Camel
>          Issue Type: Bug
>          Components: camel-xmpp
>    Affects Versions: 1.6.1
>            Reporter: Edward Campbell
>            Assignee: Claus Ibsen
>             Fix For: 1.6.2, 2.0.0
>
>         Attachments: XmppConsumer.java
>
>
> I am currently porting an application using an in house Smack integration to 
> Apache Camel.
> Specifically, I am getting failures with multiuser chat where messages stop 
> being received in the middle of the message stream I am sending.
> I have yet to verify the issue exists with private chat as well, but the 
> XMPPConsumer source looks like there will be a similar issue.
> The XMPPConsumer class registers itself for all packet types in the doStart 
> method, but in the processPacket method immediately casts the received Packet 
> to Message.
> I have found with the in house integration that Smack sends several types of 
> Packets, and I could not find assurance that it would not call the packet 
> listener with a null message.
> A simple if((null != packet) && (packet instanceof Message))  should be used 
> to prevent improper packets from being utilized.
> FYI: the above if statement should also prevent packets from building up in 
> the Smack message queue, since all messages will be processed without 
> throwing an exception.
> So a call to muc.nextMessage() is unnecessary, and actually detrimental 
> (since if the next packet is a message, it will be dropped without 
> processing).
> It may be wise to actually use a try/catch block to prevent exceptions from 
> being thrown by the processPacket method, since messages that throw 
> exceptions seem to stay in the Smack message queue.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to