jruby-jms-1.3.0-java gem(最新版本)中的 create_destination 方法与 jRuby 9.4.5.0 仍然有 java_kind_of?(JMS::Destination) 这给了我错误:
"undefined method `java_kind_of?' for #<Java::OrgApacheActivemqCommand::ActiveMQQueue:0x70d2433a>", "Did you mean? java_send (NoMethodError)"]
我正在调用 create_destination,但它仅对消费者给出此错误。
/usr/jruby-9.4.5.0/lib/ruby/gems/shared/gems/jruby-jms-1.3.0-java/lib/jms/session.rb:180:in `create_destination'
/usr/jruby-9.4.5.0/lib/ruby/gems/shared/gems/jruby-jms-1.3.0-java/lib/jms/session.rb:350:in `consumer'
jms_consume方法:
def jms_consume _queue = self.receive_queue, _selector = ''
consumed = nil
JMS::Connection.session(@jms_config) { |session|
session.queue(_queue){ |q|
session.consumer(:destination => q, :selector=>_selector) { |consumer|
message = consumer.get(:timeout => 5000)
log.debug "Consumed message #{message.data}" unless message.nil?
consumed = message != nil ? message.data : nil
}
}
}
consumed
end
根据此问题,java_kind_of 已被删除,必须替换为 kind_of。 如果我更改它,它就可以工作,但每次安装工具时都必须更改它。
我该如何进行?
显然 jruby-jms gem 的最后一个版本是在 2019 年 1 月,GitHub 存储库 于 2020 年 1 月存档。看起来这个项目不再被维护了。
如果您仍然想继续使用这个 gem,一种选择可能是自己 fork 并修复它。这种情况下的实际修复很简单:只需在 gem 代码中搜索
java_kind_of?
的任何用途并将其替换为 kind_of?
。
如果您还向公众发布固定的gem,而不仅仅是维护一个私人分叉,这也可以让其他人从您的改进和维护中受益,也许还可以贡献自己的改进。
或者,如果您真的不想分叉 gem,另一种选择是对已删除的
java_kind_of?
方法进行猴子修补,如 enebo 在您在问题中链接的问题线程上所建议的:
class Object
alias java_kind_of? kind_of?
end
当然,您需要在调用任何使用
java_kind_of?
方法的代码之前应用此补丁。一个安全的地方是在需要 jms
gem 之前,或者如果您正在使用例如Bundler要加载gem,在你的应用程序启动代码之前加载Bundler。 (在 Rails 应用程序中,将此代码放入初始化程序中也可能有效,至少除非您以某种方式在应用程序启动代码中使用 jms
gem。)
当然,像这样的兼容性补丁实际上只是一个临时修复。真正的问题是您正在使用未维护的 gem 依赖项,随着时间的推移,它可能会积累越来越多的“位腐烂”。除非其他人碰巧站出来分叉宝石并接管其维护,否则最终您可能必须在自己分叉和维护它或放弃它并转向其他解决方案之间做出决定。
按照上面的建议,有两种方法可以做到这一点:
jms
宝石之前)。monkey_patch.rb
(与application.rb
同一目录):
class Object
alias java_kind_of? kind_of?
end
在
application.rb
中添加以下行(初始化应用程序)
require_relative 'monkey_patch.rb'