2011-03-23 1 views
0

새우를 사용할 때 렌더링/빌드 프로세스 전에 파일 스트림을 시작하는 예가 있습니까?렌더링 전 Prawn/Prawnto에서 출력되는 스트리밍

상황은 내 워크 스테이션에서 실행하는 데 약 60 초가 걸리는 350 페이지 정도의 보고서가 있지만 상황을 프로덕션 (EC2)으로 옮길 때 보고서 실행 시간이 300 초 이상 끝나면 PDF를 브라우저로 보내지 않습니다.

사용자 의견이없는 경우에도 60 초가 오래 걸리지 만 기다리는 경우에도 300은 작동하지 않습니다. 내가 한 일은 렌더링 과정 (적어도 Prawnto와 함께 .pdf.prawn보기를 사용하고 있습니다) 전에 파일 다운로드를 시작하여 적어도 사용자가 처리하는 동안 어떤 일이 일어나는 것을 볼 수 있도록하는 것입니다. 지금까지이 일을 할 수 없었다. 모든 예제와 가이드는 렌더링이 끝나고 기다린 후에 다운로드를 시작합니다.

그 밖의 모든 것이 실패하면 보고서 일정을 검토 하겠지만 이상적으로 사용자는 보고서를보고 변경 한 다음 다시 실행하여 분명히 허용하지 않을 것입니다.

실제로 Prawnto에서 보여줄 코드는보기의 모든 PDF 레이아웃이므로 제어기에서이 코드를 호출해야합니다. 나는 send_file을 시도해 보았고 Prawnto없이 PDF 레이아웃을 컨트롤러로 옮겨서 모든 변경 사항이 같은 결과를주는 것처럼 보였다. PDF는 오랜 기다림 후에 브라우저로 보내진다.

나는이 시점에서 아이디어가 없으므로 어떤 아이디어라도 고맙게 생각합니다.

respond_to do |format| 
    format.pdf { 
    prawnto :prawn => {:page_layout => :portrait, :skip_page_creation => true}, :inline => false 
    render :layout => false 
    } 
+0

아마도 레일스 2.3.9와 새우 0.11.1.pre와 함께 프로덕션을 위해 승객을 사용하고 있습니다. – ChriX

+0

300 초가 넘는 시간에 PDF를 스트리밍하는 것이 300 초 대기 시간보다 훨씬 더 효과적인지 확신 할 수 없습니다. 사용자가 비동기 보고서 생성을 트리거 한 다음 완료되면 사용자에게 전자 메일 알림을 보낼 수 있습니까? 또는 30-40 페이지 정도의 그룹으로 "덩어리 (chunk)"하고 한 번에 한 부분 씩 생성하는 옵션을 사용자에게 제공 할 수 있습니다. –

답변

2

PDF를 생성하는 데 60 분 이상의 시간이 걸리는 경우 배경 작업자에게 맡기는 것이 좋습니다. Delayed :: Job 또는 Resque를 사용하는 것이 좋습니다.

작업자가 PDF를 작성하여 디스크에 저장하도록하십시오. PDF를 다운로드 할 준비가되었음을 나타 내기 위해 플래그를 던지십시오 (예 : 데이터베이스 등).

이렇게하면 앱에 약간의 복잡성이 추가되지만 사용자 환경이 크게 향상되고 설명하는 'PDF를 다운로드 할 수 없음'문제가 발생하지 않습니다. 또한 응용 프로그램이 많이 사용되는 경우 PDF 작성 작업자를 다른 서버로 쉽게 옮길 수 있습니다.

+0

제안 해 주셔서 감사합니다. 나는 그것들의 조합을 사용했다. 지연 : 처리 할 작업 및 작업이 완료되면 문서를 첨부 파일로 사용자에게 전자 메일로 보냅니다. – ChriX