Мой рабочий процесс - электронная почта - sendgrid - griddler, а приложение rails запускается на heroku.Все входящие электронные письма имеют вложения, а некоторые довольно большие.Я продолжаю получать тайм-ауты H12 на Heroku, потому что вложения загружаются в Google Cloud Storage более 30 секунд.
Я использовал отложенное задание для всего, что могу, но я НЕ ДУМАЮ, что могу передать вложение из griddler в отложенное задание, поскольку вложение является эфемерным.У меня был друг, предложивший просто перейти к получению электронных писем из gmail вместо использования sendgrid и griddler, но это было бы больше переписать, чем сейчас.В идеальном мире я мог бы передать вложения на отложенную работу, но я не знаю, возможно ли это в конце концов.
email_processor.rb
if pdfs = attachments.select { |attachment| attachment.content_type == 'application/pdf' }
pdfs.each do |att|
# att is a ActionDispatch::Http::UploadedFile type
# content_type = MIME::Types.type_for(att.to_path).first.content_type
content_type = att.content_type
if content_type == 'application/pdf'
# later if we use multiple attachments in single fax, change num_pages
fax = @email_address.phone_number.faxes.create(sending_email: @email_address.address ,twilio_to: result, twilio_from: @email_address.phone_number.number, twilio_num_pages: 1)
attachment = fax.create_attachment
# next two rows should be with delay
attachment.upload_file!(att)
#moved to attachment model for testing
#fax.send!
end
end
file upload from another model
def upload_file!(file)
# file should be ActionDispatch::Http::UploadedFile type
filename = file.original_filename.gsub(/\s+/, '_')
filename = filename[0..15] if filename.size > 16
path = "fax/#{fax.id}/att-#{id}-#{filename}"
upload_out!(file.open, path)
#self.fax.send!
#make_thumbnail_pdf!(file.open)
end
def upload_out!(file, path)
upload = StorageBucket.files.new key: path, body: file, public: true
upload.save # upload file
update_columns url: upload.public_url
self.fax.update(status: 'outbound-uploaded')
self.fax.process!
end