lib/amqp/rpc.rb in amqp-0.7.5 vs lib/amqp/rpc.rb in amqp-0.8.0.beta1

- old
+ new

@@ -1,114 +1,18 @@ -# encoding: utf-8 +$stdout.puts <<-MESSAGE +------------------------------------------------------------------------------------- +DEPRECATION WARNING! -module AMQP +Use of amqp/rpc.rb is deprecated. Instead of - # encoding: utf-8 + require "amqp/rpc" - if defined?(BasicObject) - BlankSlate = BasicObject - else - class BlankSlate #:nodoc: - instance_methods.each { |m| undef_method m unless m =~ /^__/ } - end - end +please use + require "amqp/deprecated/rpc" - # Basic RPC (remote procedure call) facility. - # - # Needs more detail and explanation. - # - # EM.run do - # server = AMQP::Channel.new.rpc('hash table node', Hash) - # - # client = AMQP::Channel.new.rpc('hash table node') - # client[:now] = Time.now - # client[:one] = 1 - # - # client.values do |res| - # p 'client', :values => res - # end - # - # client.keys do |res| - # p 'client', :keys => res - # EM.stop_event_loop - # end - # end - # - class RPC < ::AMQP::BlankSlate - # Takes a channel, queue and optional object. - # - # The optional object may be a class name, module name or object - # instance. When given a class or module name, the object is instantiated - # during this setup. The passed queue is automatically subscribed to so - # it passes all messages (and their arguments) to the object. - # - # Marshalling and unmarshalling the objects is handled internally. This - # marshalling is subject to the same restrictions as defined in the - # Marshal[http://ruby-doc.org/core/classes/Marshal.html] standard - # library. See that documentation for further reference. - # - # When the optional object is not passed, the returned rpc reference is - # used to send messages and arguments to the queue. See #method_missing - # which does all of the heavy lifting with the proxy. Some client - # elsewhere must call this method *with* the optional block so that - # there is a valid destination. Failure to do so will just enqueue - # marshalled messages that are never consumed. - # - def initialize(mq, queue, obj = nil) - @mq = mq - @mq.rpcs[queue] ||= self - if obj - @obj = case obj - when ::Class - obj.new - when ::Module - (::Class.new do include(obj) end).new - else - obj - end +Both amqp/rpc.rb and AMQP::RPC implementation will be REMOVED before 1.0 release. +If you need RPC, we recommend the rpc gem (see https://github.com/ruby-amqp/rpc). +MESSAGE - @mq.queue(queue).subscribe(:ack => true) { |info, request| - method, *args = ::Marshal.load(request) - ret = @obj.__send__(method, *args) - - info.ack - - if info.reply_to - @mq.queue(info.reply_to, :auto_delete => true).publish(::Marshal.dump(ret), :key => info.reply_to, :message_id => info.message_id) - end - } - else - @callbacks ||= {} - # XXX implement and use queue(nil) - @queue = @mq.queue(@name = "random identifier #{::Kernel.rand(999_999_999_999)}", :auto_delete => true).subscribe { |info, msg| - if blk = @callbacks.delete(info.message_id) - blk.call ::Marshal.load(msg) - end - } - @remote = @mq.queue(queue) - end - end - - # Calling AMQP::Channel.rpc(*args) returns a proxy object without any methods beyond - # those in Object. All calls to the proxy are handled by #method_missing which - # works to marshal and unmarshal all method calls and their arguments. - # - # EM.run do - # server = AMQP::Channel.new.rpc('hash table node', Hash) - # client = AMQP::Channel.new.rpc('hash table node') - # - # # calls #method_missing on #[] which marshals the method name and - # # arguments to publish them to the remote - # client[:now] = Time.now - # .... - # end - # - def method_missing(meth, *args, &blk) - # XXX use uuids instead - message_id = "random message id #{::Kernel.rand(999_999_999_999)}" - @callbacks[message_id] = blk if blk - @remote.publish(::Marshal.dump([meth, *args]), :reply_to => blk ? @name : nil, :message_id => message_id) - end - end -end +require "amqp/deprecated/rpc"