activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Hiram Chirino" <hi...@hiramchirino.com>
Subject Re:
Date Tue, 04 Jul 2006 03:52:54 GMT
Hi Nathan,

Please review the following patch.  It allows the stomp client to accept a
variable amount of while space between frames.  I ran the integration tests
a slightly modified amq broker where it used 3 \n between frames and also
one where no \n were used between frames.  Everything seemed to work, but
since c++ is not my forte, I'm looking for a +1 from a before I commit the
change.

Index: src/main/activemq/connector/stomp/StompCommandReader.cpp
===================================================================
--- src/main/activemq/connector/stomp/StompCommandReader.cpp    (revision
418889)
+++ src/main/activemq/connector/stomp/StompCommandReader.cpp    (working
copy)
@@ -70,20 +70,46 @@
 void StompCommandReader::readStompCommand( StompFrame& frame )
    throw ( StompConnectorException )
 {
-    // Read the command;
-    int numChars = readStompHeaderLine();
+       while( true )
+       {
+           // Clean up the mess.
+           buffer.clear();

-    if( numChars <= 0 )
-    {
-        throw StompConnectorException(
-            __FILE__, __LINE__,
-            "StompCommandReader::readStompCommand: "
-            "Error on Read of Command Header" );
-    }
+           // Read the command;
+           readStompHeaderLine();

-    // Set the command in the frame - copy the memory.
-    frame.setCommand( reinterpret_cast<char*>(&buffer[0]) );
-
+        // Ignore all white space before the command.
+        int offset=-1;
+        for( size_t ix = 0; ix < buffer.size()-1; ++ix )
+        {
+               // Find the first non space character
+               char b = buffer[ix];
+            switch ( b )
+            {
+               case '\n':
+               case '\t':
+               case '\r':
+                       break;
+
+                   default:
+                           offset = ix;
+                           break;
+            }
+
+               if( offset != -1 )
+               {
+                       break;
+               }
+        }
+
+           if( offset >= 0 )
+           {
+                   // Set the command in the frame - copy the memory.
+                   frame.setCommand(
reinterpret_cast<char*>(&buffer[offset]) );
+                       break;
+           }
+
+       }
     // Clean up the mess.
     buffer.clear();
 }
@@ -224,8 +250,7 @@
         read( &buffer[0], content_length );

         // Content Length read, now pop the end terminator off (\0\n).
-        if(inputStream->read() != '\0' ||
-           inputStream->read() != '\n')
+        if(inputStream->read() != '\0' )
         {
             throw StompConnectorException(
                 __FILE__, __LINE__,
@@ -251,16 +276,6 @@
                 continue;
             }

-            // We read up to the first NULL, now lets pop off the required
-            // newline to complete the packet.
-            if(inputStream->read() != '\n')
-            {
-                throw StompConnectorException(
-                    __FILE__, __LINE__,
-                    "StompCommandReader::readStompBody: "
-                    "Read Body, and no trailing newline");
-            }
-
             break;  // Read null and newline we are done.
         }
     }



On 7/3/06, Nathan Mittler <nathan.mittler@gmail.com> wrote:
>
> No problem - sorry for the confusion :)
>
> On 7/3/06, Hiram Chirino <hiram@hiramchirino.com> wrote:
> >
> > Oh. That makes sense!  Sorry for the noise!
> >
> > On 7/3/06, Mittler, Nathan <nathan.mittler@sensis.com> wrote:
> > >
> > > Hey Hiram,
> > > I was actually thinking of the messages coming from the broker to the
> > > client - the newer version of the broker always sends a \0\n to denote
> > > the end of the frame.  I'm not sure if the CMS client is sly enough to
> > > handle both cases - I think it's expecting one or the other (either \0
> > > or \0\n).  I was just throwing that out there as a possible reason
> that
> > > the client may freeze on a read - waiting for the trailing \n that
> never
> > > comes.
> > >
> > >
> > > > -----Original Message-----
> > > > From: chirino@gmail.com [mailto:chirino@gmail.com] On Behalf
> > > > Of Hiram Chirino
> > > > Sent: Monday, July 03, 2006 12:58 PM
> > > > To: activemq-dev@geronimo.apache.org
> > > > Subject: Re:
> > > >
> > > > Hi Nathan,
> > > >
> > > > I'm not so sure about that.  I think that AMQ should support
> > > > receiving a STOMP frame terminated by \0 without a subsequent
> > > > \n.  The STOMP spec does say that white space before a frame
> > > > should be ignored.  Anyways, if anybody can confirm that this
> > > > is not the case, then it's a bug with how we implemented STOMP in
> AMQ.
> > > >
> > > > On 7/3/06, Mittler, Nathan <nathan.mittler@sensis.com> wrote:
> > > > >
> > > > > Hi Naveen,
> > > > > There are a couple of things that might be causing this.
> > > > >
> > > > > 1) The stomp frame ending characters have changed in recent
> > > > versions
> > > > > of AMQ.  AMQ now enforces that stomp frames end with \0\n
> > > > for all commands.
> > > > > If you have an older version of CMS, and a fairly new
> > > > version of AMQ
> > > > > (e.g. 4.0), they may not play nice together.
> > > > >
> > > > > 2) I have seen some deadlocking occur on compilers that
> > > > don't support
> > > > > the PTHREAD_MUTEX_RECURSIVE type for mutexes (the code checks
> > > > > __USE_UNIX98 and __APPLE__ flags to make this determination.  CMS
> > > > > requires recursive mutexes to work properly - it will deadlock
> > > > > otherwise.
> > > > >
> > > > > Regardless of what your particular problem is, I recommend
> > > > downloading
> > > > > and trying out the activemq-cpp code
> > > > >
> > > > (
> https://svn.apache.org/repos/asf/incubator/activemq/trunk/activemq-cp
> > > > > p/ ).  It solves the mutex problem (since it doesn't use recursive
> > > > > mutexes) and has been tested against AMQ 4.0.1 (it actually
> > > > requires
> > > > > 4.0.1 or greater).
> > > > >
> > > > > Give that a try and let me know how it goes.
> > > > >
> > > > > Regards,
> > > > > Nate
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Naveen Rawat [mailto:naveen@in.effectsoft.com]
> > > > > > Sent: Saturday, July 01, 2006 9:15 AM
> > > > > > To: activemq-dev@geronimo.apache.org; user@activemq.codehaus.org
> > > > > > Subject:
> > > > > >
> > > > > > Hi there..!!
> > > > > >
> > > > > >
> > > > > >
> > > > > > I was trying out CMS OPENWIRE C++ APIs on SUSE Linux 10.0(Kernel
> > > > > > release
> > > > > > 2.6.13-15.8-default)
> > > > > > Whenever I try to execute TestMain.cpp it gives the following
> and
> > > > > > goes into sleep mode.
> > > > > >
> > > > > >
> > > > > > Connecting to ActiveMQ broker...
> > > > > > Opening socket to: 127.0.0.1 on port 61666 Sending command:
> > > > > > cmd.id = 1, corr.id = -1, type = CONNECTION_INFO Received
> > > > > > command: cmd.id = 0, corr.id = -1, type =
> > > > WIRE_FORMAT_INFO Received
> > > > > > command: cmd.id = 1, corr.id = -1, type = BROKER_INFO
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > My AMQ Server is running as :
> > > > > >
> > > > > > ACTIVEMQ_HOME: /home/nrawat/incubator-activemq-4.0
> > > > > > Loading message broker from: xbean:activemq.xml Created
> > > > MBeanServer
> > > > > > with ID: da6bf4:10c2b32b38c:-8000:kuwix:1
> > > > > > INFO  BrokerService                  - ActiveMQ 4.0 JMS
> > > > > > Message Broker
> > > > > > (localhost) is starting
> > > > > > INFO  BrokerService                  - For help or more
> > > > > > information please
> > > > > > see: http://incubator.apache.org/activemq/
> > > > > > RMIConnectorServer started at:
> > > > > > service:jmx:rmi://kuwix/jndi/rmi://localhost:1099/jmxrmi
> > > > > > INFO  ManagementContext              - JMX consoles can connect
> to
> > > > > > service:jmx:rmi://kuwix/jndi/rmi://localhost:1099/jmxrmi
> > > > > > INFO  JDBCPersistenceAdapter         - Database driver
> recognized:
> > > > > > [apache_derby_embedded_jdbc_driver]
> > > > > > INFO  JournalPersistenceAdapter      - Journal Recovery
> > > > > > Started from: Active
> > > > > > Journal: using 5 x 20.0 Megs at:
> > > > > > /home/nrawat/incubator-activemq-4.0/activemq-data/journal
> > > > > > INFO  JournalPersistenceAdapter      - Journal Recovered: 0
> > > > > > message(s) in
> > > > > > transactions recovered.
> > > > > > INFO  TransportServerThreadSupport   - Listening for
> > > > connections at:
> > > > > > tcp://kuwix:61666
> > > > > > WARN  MulticastDiscoveryAgent        - brokerName not set
> > > > > > INFO  TransportConnector             - Connector default Started
> > > > > > INFO  TransportServerThreadSupport   - Listening for
> > > > connections at:
> > > > > > tcp://kuwix:61633?wireFormat=stomp
> > > > > > INFO  TransportConnector             - Connector stomp Started
> > > > > > INFO  NetworkConnector               - Network Connector
> > > > > > default Started
> > > > > > INFO  BrokerService                  - ActiveMQ JMS Message
> Broker
> > > > > > (localhost, ID:kuwix-2163-1151775977128-1:0) started
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > Hearty Regards,
> > > > > >
> > > > > > Naveen Rawat
> > > > > >
> > > > >
> > > >
> > > >
> > > >
> > > > --
> > > > Regards,
> > > > Hiram
> > > >
> > > > Blog: http://hiramchirino.com
> > > >
> > >
> >
> >
> >
> > --
> > Regards,
> > Hiram
> >
> > Blog: http://hiramchirino.com
> >
> >
>
>


-- 
Regards,
Hiram

Blog: http://hiramchirino.com

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message