2014-10-30 2 views
-1

작은 Java 클래스를 작성하여 xls 파일에서 임베드 된 이미지를 읽고 내 Ruby on Rails 응용 프로그램의 백그라운드 프로세스 (Sidekiq 사용)에서 사용해야 할 것입니다. 그러나 sidekiq 프로세스가 Rjb가 사용되는 메소드의 실행을 시작할 때 JVM이 오류 guarantee(get_thread() == thread) failed: must be the same thread, quickly을 던지므로 스레딩에 몇 가지 문제가있는 것처럼 보입니다.Ruby Java Bridge with threads (Sidekiq)

이렇게 설정하는 방법입니다.

는 내가이

require 'rjb' 

JARS = Dir.glob("#{Rails.root}/lib/java_libs/*.jar").join(':') 
Rjb::load(JARS) 
EXCEL_IMAGE_READER = Rjb::import('tools.ImageReader') 

가 그럼 난 내 백그라운드 프로세스에서 그것을 사용하는 상기 R1b가

def get_excel_images 
    p 'Starting to get the images' 
    images = [] 
    image_reader = EXCEL_IMAGE_READER.new(@excel_path) 
    image_reader.get_file_names.each do |file_name| 
     images << Attachment.new_from_bytes(image_reader.get_file(file_name), file_name) 
    end 
    images 
    end 

은 그러나 즉시 방법을 실행하기 시작함에 따라 JVM이를 throw 설정하는 초기화를 썼다 예외. Sidekiq의 로그입니다.

2014-10-30T09:47:02Z 11748 TID-17e7qk INFO: Running in ruby 2.1.1p76 (2014-02-24 revision 45161) [i686-linux] 
2014-10-30T09:47:02Z 11748 TID-17e7qk INFO: See LICENSE and the LGPL-3.0 for licensing details. 
2014-10-30T09:47:02Z 11748 TID-17e7qk INFO: Starting processing, hit Ctrl-C to stop 
2014-10-30T09:47:31Z 11748 TID-19393k Sidekiq::Extensions::DelayedClass JID-08eac9ed686f8d6146cda67f INFO: start 
"Starting to get the images" 
# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# Internal Error (threadLocalStorage.cpp:60), pid=11748, tid=2960567104 
# guarantee(get_thread() == thread) failed: must be the same thread, quickly 
# 
# JRE version: OpenJDK Runtime Environment (7.0_65-b32) (build 1.7.0_65-b32) 
# Java VM: OpenJDK Client VM (24.65-b04 mixed mode, sharing linux-x86) 
# Derivative: IcedTea 2.5.3 
# Distribution: Ubuntu 12.04 LTS, package 7u71-2.5.3-0ubuntu0.12.04.1 
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again 
# 
# An error report file with more information is saved as: 
# /home/mika/projects/my_project/hs_err_pid11748.log 
# 
# If you would like to submit a bug report, please include 
# instructions on how to reproduce the bug and visit: 
# http://icedtea.classpath.org/bugzilla 
# 
Aborted (core dumped) 

은 내가 get_excel_images 방법으로 초기화에서 물건을 이동하려하지만 아무런 영향을 미치지 않았다. 이 코드는 콘솔이나 rspec 테스트를 통해 직접 실행하면 작동합니다.

아무도 아이디어를 어떻게 해결할 수 있습니까?

+0

답변을 업데이트로 옮기고 답변을 수락하는 것이 좋습니다. IMO 나는이 질문을 끝내 겠지만 명확한 깃발이 없다. 상세한 Q를 들었지만 그 대답은 Java를 지원하는 Ruby 구현으로 짧게 변경되었습니다. 지금 생각해 보면, 대부분의 사람들은 Java를 프로젝트에 추가하고자한다면 JRuby로 직행 할 것이라고 생각합니다. – onebree

+0

음. 나는 최근에 MRI Ruby로 다시 전환했으며 모든 자바 항목을 독립적 인 데몬 프로세스로 옮겼습니다. 루비와 데몬은 TCP 소켓을 통해 통신하고 있습니다. 나는 JRuby의 느린 속도에 좌절감을 느꼈다. 이제 MRI Ruby로 다시 앱을 개발할 수있게 된 것을 기쁘게 생각합니다. – Mika

+0

그 의견으로 답을 업데이트하고 JRuby를 선택한 이유를 설명하고 MRI로 다시 전환하는 방법을 설명했습니다. 답변에 "업데이트"를 포함시키고 질문에서 제거하십시오. 가능한 경우 답변에 코드를 표시하십시오. 그런 다음이 Q & A를 "완료"하기 위해 그것을 수락하십시오. – onebree

답변

1

Rjb Github의 정보에서 https://github.com/arton/rjb/issues/24을 발견했습니다. 루비 1.9.3으로 다운 그레이드하는 것처럼 보이고 rjb 1.4.9가이 문제를 해결할 수도 있지만, 루비 1.9.3이 보안 패치를 2 ~ 3 개월 만 더받을 예정이므로 좋은 해결책은 아닙니다. 스레드가 생성되는 방법과 루비가 루비 1.9.3에서 루비 2로 변경된 방법이 문제입니다.

여러 솔루션을 시도한 후에 JRuby로 이동했습니다. 이제 자바 상호 작용이 쉽게 작동합니다.

UPDATE : 나는 독립적 인 데몬 프로세스에 내 모든 자바 물건을 이동하고 데이터를 전송하는 JSON을 사용하여 TCP 소켓을 통해 데몬과 통신

JRuby에서의 속도 저하의 해 고통 후. 이제 나는 MRI 루비로 돌아 왔고, 개발은 즐겁다.

+0

Q & A를 완료하려면이 "체크 표시"를 수락하십시오. – onebree