You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:in consumer'

消费方法代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:22:41