1

레일즈 5.1.4 서버 (단일 모드에서 Puma v. 3.10.0)를 실행 중이지만 정확하게 대기열에 포함 된 특정 ActionJob에 문제가있는 경우가 있습니다. 공연.Rails 5.1 ActiveJob on Puma가 특정 대기열에 넣은 작업을 수행하지 않습니다.

저는 소수의 일자리가 있습니다. 특정 작업을 제외한 모든 작업은 항상 대기열에 넣은 직후 예상대로 비동기 적으로 수행됩니다.

서버를 처음 재시작 한 후 새 큐잉 후에 특정 작업이 올바르게 수행됩니다. 그러나 첫 번째 성공적인 실행 후에는 대기열을 다음과 같이 수행 할 수 없습니다.

나는 모든 작업을 일반적으로 perform_later으로 대기 중입니다.

나는 rails console을 사용하여 특정 작업을 대기열에 넣음으로써 테스트를 마쳤습니다. 콘솔에 대기열을 만들 때마다 즉각적으로 수행됩니다. 같은 세션에서도. rails server에 대기 중일 때 응용 프로그램에서 사용 된 것과 동일한 인수로 시도했지만 서버에서는 대기 중입니다. 수행하지 마십시오.

나는 로그 파일을 검사했다. 아무런 오류도없고 치명적인 오류도 경고도 없다. 단순히 [ActiveJob] Enqueued FooBaaJob을 나타내지 만 작업을 수행하지 않습니다.

작업이 실제로 실패한 경우 적어도 로그에 [ActiveJob] [FooBaaJob] [id] Performing FooBaaJob을 기록해야하지만 그렇지 않습니다. 그리고 https://github.com/rails/rails/blob/master/activejob/lib/active_job/logging.rb#L78은 실제로 실패한 경우 예외를 catch하고 기록해야합니다. 두 번째로 결코 콘솔에서 작동하지 않으므로 그렇게해서는 안됩니다.

어디서 볼 것인가?

+1

개발 환경에 대해 작업 큐를 어떻게 설정 했습니까? –

+0

'async' (기본값 - 명시 적으로 설정되지 않음)와'default' 대기열에있는 모든 작업. 작업 대기열'inline'을 실행할 때마다 항상 작업이 성공적으로 실행됩니다. – mtrolle

+0

그리고 푸마에게 하나의 스레드 만 허용하는 구성을 전달하고 있습니까? 'async'가 새 스레드를 생성 할 것이므로 이것은 아마도 여러분의 문제일까요? –

답변

1

오케이, 마침내이 문제를 디버깅하는 방법을 발견했습니다. 이 라인 config/initializers의 초기화 파일을 만들어

: Concurrent.use_stdlib_logger(Logger::DEBUG)

나는 지금 내 콘솔에 오류 데이터 출력을 얻을.

[ActiveJob] Enqueued FooBaaJob (Job ID: ...) to Async(default) with arguments: #<GlobalID:0...0 @uri=#<URI::GID gid://test-app/FooBaa/8>> 
[2017-10-29 16:10:56.676] DEBUG -- : Error while trying to deserialize arguments: Couldn't find FooBaa with 'id'=8 (ActiveJob::DeserializationError) 

번째 줄은 Concurrent.use_stdlib_logger(Logger::DEBUG) 개시제 파일을 추가 한 결과이다. 내 경우

레코드의 결과가 완전히 때 ActiveJob SQLite는 DB 아직 최선을 다하고되지 않는 것을하는 방식으로 즉시됩니까 내 모델에 after_create에서 작업을 시작 그리고 난 작업 실행을 같은데요 로드하려고합니다. 그것은 MySQL에서도 마찬가지였습니다.

레일스 5.0이 after_[create|update|destroy]_commit을 도입 했으므로 나의 after_createafter_create_commit으로 변경하여 문제가 해결되고 작업 할 때마다 예상대로 작동합니다.

이전 버전의 레일에서는 after_commit으로 on: :create 인수 또는 이와 비슷한 값으로 이동할 수있었습니다.