gpt4 book ai didi

ruby - 后台工作人员在 Rails 应用程序中查看通信

转载 作者:数据小太阳 更新时间:2023-10-29 06:53:03 27 4
gpt4 key购买 nike

假设我有一个包含帖子的博客应用程序。创建帖子后,将创建一个工作人员来处理一些后台操作。我的情况是,在提交表单后我想显示某种加载消息(gif 加载器等),当工作人员完成时我想隐藏加载消息并显示工作人员提供的一些数据。我的问题是,传达工作人员已完成工作并将其显示在用户前端的最佳方式是什么。 worker 回调看起来像这样

def worker_finish
#message the user
end

最佳答案

我认为您可能忽略了拥有后台工作人员的意义,基本上,您试图做的是弄巧成拙。 -- 如果用户提交表单并且你在你的 Controller 中排队作业,只是为了让用户等待工作人员开始和完成,你不仅完全完成了 Controller 本身可以完成的工作,而且你已经使过程变得更加复杂(并且这种类型的功能没有内置到 resque 或 sidekiq 中)。

当卸载要由队列处理的作业时,您希望立即向客户端返回响应,即

class PostsController < ApplicationController
def create
@post = Post.create(params[:post])
BackgroundBlogOperation.enque(@post.id)
respond_with(@post)
end
end

然后 BackgroundBlogOperation 类将被放入队列中,供工作人员通过并开始工作。如果您需要 BackgroundBlogOperation worker 在完成后执行其他操作,您可以这样做,但这应该在作业本身内进行,以便 worker 可以对此负责。

如果您只是想在创建帖子后显示和隐藏微调器,而不重新加载页面,只需在单击提交按钮之前显示 javascript 微调器,并确保请求类型为 js(添加 :remote =>真实的形式)。然后创建一个 javascript View 响应,如下所示:

class PostsController < ApplicationController
respond_to :js, :only => [:create]
def create
@post = Post.create(params[:post])
BackgroundBlogOperation.enque(@post.id)
respond_with(@post)
end
end

create.js.erb 也可以附加一条消息,告诉他们无论您在后台做什么都已排队,如果它比创建帖子或其他任何东西更复杂的话。

$("#spinner").hide();

现在——尽管你最初的要求没有任何作用(因为在完成工作时显示和隐藏微调器需要等待 Controller 完成操作)——有些情况下需要向客户端显示作业已完成处理很有用。

首先让我们定义一个后台处理实际有用的场景。假设您有一个按钮,单击该按钮会从某些外部 api 中提取数据,并且在从外部站点获取数据后,您将根据响应执行数据库操作。这将是何时使用后台进程的一个很好的例子。基本上在 Controller 中你会做类似的事情:

class ApiController < ApplicationController
respond_to :js, :only => [:create]

def sync_tweets
TwitterApiJob.enque(current_user.twitter_username)
respond_with(message: 'Syncing Tweets')
end

end

现在,告诉用户推文何时完成同步有点复杂,您有 3 个基本选项:

1) 通过电子邮件通知用户(在我看来通常是最糟糕的选择)2) 使用某种 html5 或支持 websocket 的 rails 服务器来运行 rails,并通过 websocket 向客户端发送推送,这虽然非常酷,但在大多数情况下是矫枉过正并且超出了此响应的范围。如果您想查看选项,请使用 Google Rails websocket pushing。3) IMO 大多数情况下的最佳选择,创建一个通知模型来处理各种用户通知,并在你的工作中,在工作完成后,做类似的事情

Notification.create(:user_id => user.id, :message => 'Sync has finished', type => 'sync_complete')

然后,在用户请求的下一页,在标题工具栏或任何地方,我会通知用户有未读通知,提醒用户点击它。

--- 另外我认为在您的帖子中您提到您正在使用 resque。我尝试了 resque,它很不错,但我发现它在生产中的调试过于复杂,而且它使用了疯狂的内存——我建议你检查一下 sidekiq,如果你还没有的话,它也使用 redis,但使用起来要快得多线程:

https://github.com/mperham/sidekiq

恕我直言,它更快、更干净且易于设置。

关于ruby - 后台工作人员在 Rails 应用程序中查看通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13378664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com