Stomp client Timeout::timeout issue + hack monkey patch fix
-----------------------------------------------------------

                 Key: JRUBY-4941
                 URL: http://jira.codehaus.org/browse/JRUBY-4941
             Project: JRuby
          Issue Type: Bug
          Components: Core Classes/Modules
    Affects Versions: JRuby 1.5.1
         Environment: osx / jvm 1.6
            Reporter: victor igumnov
         Attachments: consumer.rb, producer.rb

The stomp consumer times out after 5 seconds throwing the following error.


consumer.rb:18:in `_receive': execution expired 
(Stomp::Error::PacketParsingTimeout)
        from consumer.rb:12:in `_receive'
        from consumer.rb:7:in `_receive'
        from 
/Users/victori/Documents/Java/jruby-1.4/lib/ruby/gems/1.8/gems/stomp-1.1.6/lib/stomp/connection.rb:325:in
 `__old_receive'
        from 
/Users/victori/Documents/Java/jruby-1.4/lib/ruby/gems/1.8/gems/stomp-1.1.6/lib/stomp/connection.rb:335:in
 `receive'
        from 
/Users/victori/Documents/Java/jruby-1.4/lib/ruby/gems/1.8/gems/stomp-1.1.6/lib/stomp/client.rb:289:in
 `start_listeners'
        from 
/Users/victori/Documents/Java/jruby-1.4/lib/ruby/gems/1.8/gems/stomp-1.1.6/lib/stomp/client.rb:287:in
 `start'
        from 
/Users/victori/Documents/Java/jruby-1.4/lib/ruby/gems/1.8/gems/stomp-1.1.6/lib/stomp/client.rb:287:in
 `start_listeners'
        from 
/Users/victori/Documents/Java/jruby-1.4/lib/ruby/gems/1.8/gems/stomp-1.1.6/lib/stomp/client.rb:96:in
 `initialize'
        from consumer.rb:53:in `new'
        from consumer.rb:53


Here is the code to this example

consumer.rb

require 'rubygems'
require 'stomp'

client = Stomp::Client.new 
"failover:(stomp://localhost:61613)?initialReconnectDelay=100"
client.subscribe('/queue/test_queue',  {:ack => "client", 
"activemq.prefetchSize" => 1, "activemq.exclusive" => true }) do |msg|
  p msg.body
  client.acknowledge(msg)
end

client.join


producer.rb


require 'rubygems'
require 'stomp'

client = Stomp::Client.new 
"failover:(stomp://localhost:61613)?initialReconnectDelay=100"
client.publish("/queue/test_queue", "hello world!",{:persistent=>true})


And here is the money patch that fixes the issue; commenting out the timeout 
callback

# for stomp subscriber
if defined?(JRUBY_VERSION)
  module Stomp
    class Connection
      def _receive( read_socket )
        @read_semaphore.synchronize do
           line = read_socket.gets
           return nil if line.nil?

           # If the reading hangs for more than 5 seconds, abort the parsing 
process
           #Timeout::timeout(5, Stomp::Error::PacketParsingTimeout) do
             # Reads the beginning of the message until it runs into a empty 
line
             message_header = ''
             begin
               message_header += line
               begin
                 line = read_socket.gets
               rescue
                  p read_socket
               end
             end until line =~ /^\s?\n$/

             # Checks if it includes content_length header
             content_length = message_header.match 
/content-length\s?:\s?(\d+)\s?\n/
             message_body = ''

             # If it does, reads the specified amount of bytes
             char = ''
             if content_length
               message_body = read_socket.read content_length[1].to_i
               raise Stomp::Error::InvalidMessageLength unless 
parse_char(read_socket.getc) == "\0"
             # Else reads, the rest of the message until the first \0
             else
               message_body += char while read_socket.ready? && (char = 
parse_char(read_socket.getc)) != "\0"
             end

             # If the buffer isn't empty, reads the next char and returns it to 
the buffer
             # unless it's a \n
             if read_socket.ready?
               last_char = read_socket.getc
               read_socket.ungetc(last_char) if parse_char(last_char) != "\n"
             end

             # Adds the excluded \n and \0 and tries to create a new message 
with it
             Message.new(message_header + "\n" + message_body + "\0")
           end
         #end
      end
    end
  end
end

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to