JRuby 9.4.5.0中jruby-jms-1.3.0-java的create_destination报错求助
JRuby 9.4.5.0 下 jruby-jms-1.3.0-java gem 消费者场景报错解决方案
问题详情
在JRuby 9.4.5.0环境使用jruby-jms-1.3.0-java gem时,调用create_destination方法仅在消费者场景下报错,错误信息:
"undefined method `java_kind_of?' for #Java::OrgApacheActivemqCommand::ActiveMQQueue:0x70d2433a", "Did you mean? java_send (NoMethodError)"
报错堆栈:
/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:inconsumer'
消费方法代码:
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
已知原因:JRuby 9.4+ 版本移除了java_kind_of?方法,需替换为kind_of?,手动修改jms/session.rb第180行后可正常运行,但每次安装gem都要重复修改,需永久解决方案。
解决方案
1. 使用补丁工具自动修改
借助gem-patch工具或自定义脚本,在gem安装后自动替换代码:
- 创建补丁文件
jruby-jms-fix-java-kind-of.patch:--- lib/jms/session.rb +++ lib/jms/session.rb @@ -177,7 +177,7 @@ module JMS # Create a destination based on the type of destination def create_destination(destination, type=nil) if destination.is_a?(String) - if type && destination.java_kind_of?(javax.jms.Destination) + if type && destination.kind_of?(javax.jms.Destination) # Already a destination instance, just return it destination else - 在Gemfile或bundle配置中指定补丁,确保每次安装gem时自动应用。
2. 自定义修复版gem
- 克隆jruby-jms仓库,修改
lib/jms/session.rb中的java_kind_of?为kind_of? - 将修改后的代码推送到自己的代码仓库
- 在Gemfile中指定使用自定义版本:
gem 'jruby-jms', :git => 'https://github.com/your-username/jruby-jms.git', :branch => 'fix-java-kind-of'
3. 全局兼容方法
在项目初始化代码中添加以下代码,为Java对象兼容旧方法:
class Java::Lang::Object def java_kind_of?(klass) kind_of?(klass) end end
此方法无需修改gem源码,可快速临时解决问题。
内容的提问来源于stack exchange,提问作者Shivam Madan
相关产品推荐
相关产品推荐

