2016-02-23 4 views
2

Обновление: Я добавил раствор нижеБлестящая сервер: гнездо повесить

Проблема

Немного предыстории: Я бегу Блестящая v1.5 сервера в точном сервере Ubuntu. В принципе у меня есть страница rmarkdown, которая позволяет пользователю играть с некоторыми параметрами, а затем имеет кнопку загрузки, который создает документ, используя блестящие, как так:

```{r,echo=FALSE} 
downloadHandler(
    filename = "report.pdf", 
    content = function(file) { 
    knitr::knit2pdf("report.Rnw",envir=environment()) 
    file.rename(normalizePath('report.pdf'), file) 
    } 
) 
``` 

Блестящая приложение отлично работает на моей локальной машине, но падает на сервер. Более конкретно, веб-страница r markdown работает нормально, но как только я нажимаю кнопку загрузки, приложение падает примерно через 30 секунд. Журналы сервера указывают на ошибку сокета тайм-аут:

[2016-02-24 03:38:52.240] [INFO] shiny-server - Starting listener on 0.0.0.0:3838 
[2016-02-24 03:49:30.183] [ERROR] shiny-server - Uncaught exception: Error: socket hang up 
[2016-02-24 03:49:30.184] [ERROR] shiny-server - Error: socket hang up 
    at createHangUpError (_http_client.js:215:15) 
    at Socket.socketCloseListener (_http_client.js:247:23) 
    at Socket.emit (events.js:129:20) 
    at TCP.close (net.js:485:12) 
[2016-02-24 03:49:30.184] [INFO] shiny-server - Stopping listener on 0.0.0.0:3838 
[2016-02-24 03:49:30.185] [INFO] shiny-server - Shutting down worker processes (with notification) 
/opt/shiny-server/lib/main.js:364 
    throw err; 
     ^
Error: socket hang up 
    at createHangUpError (_http_client.js:215:15) 
    at Socket.socketCloseListener (_http_client.js:247:23) 
    at Socket.emit (events.js:129:20) 
    at TCP.close (net.js:485:12) 

Это PDF занимает довольно много времени, чтобы генерировать (около пяти минут), так что я заподозрить, что я пропустил некоторое время ожидания параметр где-нибудь. Это то, что я сделал в своей блестящей конфигурации:

run_as shiny; 
app_init_timeout 999999; 
app_idle_timeout 999999; 

# Define a server that listens on port 3838 
server { 
    listen 3838; 
    .... 
} 

... но безуспешно, потому что я все еще получаю сообщение об ошибке. Любые предложения будут ценны!

Решение

Как упомянуто @daattali, вы не можете иметь что-то считать, что долго внутри downloadButton, изменение настроек сервера ничего об этом не изменится. Так что я в конечном итоге расщепление поколения & скачать функциональность двух частей, как так:

```{r, echo=FALSE} 
shinyApp(
    ui = fluidPage(
    fluidRow(
     column(2, 
     conditionalPanel(
      condition = "!$('makeReport').hasClass('shiny-busy')", 
      actionButton("makeReport","Generate Report",icon=icon("file")) 
     ) 
    ), 
     column(4, 
     conditionalPanel(
     condition = "!$('makeReport').hasClass('shiny-busy')", 
     uiOutput("downloadButton") 
     #downloadButton("downloadReport", "Download Report") 
    ) 
    ) 
    ) 
), 
    server = function(input, output) { 
    output$download_button <- renderUI({ 
     downloadButton("downloadReport", "Download Results") 
    }) 
    makeReportAction <- eventReactive(input$makeReport, { 
     ... 
     knitr::knit2pdf("report.Rnw",envir=globalenv()) 
    }) 
    output$downloadButton <- renderUI({ 
     makeReportAction() #only appear after first click on generate 
     downloadButton("downloadReport", "Download Report") 
    }) 
    output$downloadReport <- downloadHandler(
     filename = "report.pdf", 
     content = function(file) { 
     cat(paste("Does the pdf exist?",file.exists("report.pdf"))) 
     file.rename(normalizePath('report.pdf'), file) 
     } 
    ) 
    } 
) 
``` 

ответ

1

Это может быть та же проблема, кто-то спросил Джо Ченг о в правлении Google на прошлой неделе

https://groups.google.com/forum/#!topic/shiny-discuss/4bL9jFaYly0

Похоже, что есть ограничение на время для обработчика загрузки, поэтому, возможно, попробуйте посмотреть, можно ли предварительно создать файл и только обслуживать файл при нажатии кнопки.

Смежные вопросы