Ruby on Rails:操作正在进行中 - connect(2) 会阻塞

goo*_*oon 5 ruby ruby-on-rails actionmailer

我在别人制作的网站上工作。有一个生产版本。

我正在尝试向属性在 30 天内未更新的用户发送电子邮件。

一切正常,直到我尝试使用deliver_later. 我使用的原因deliver_laterdeliver_now导致每秒发送过多电子邮件的问题。我目前正在使用 Mailtrap 进行测试,但我认为我会在生产中遇到那种问题。

所以我选择为每封电子邮件等待 1 秒:

      @testproperties = Property.has_not_updated.includes(:user)
      @testproperties.each do |property|
          UserMailer.with(property: property, user: property.user).check_listing.deliver_later(wait:1.seconds)
      end
Run Code Online (Sandbox Code Playgroud)

这导致 IO::EINPROGRESSWaitWritable Operation now in progress - connect(2) would block

没有任何东西发送。

我不知道如何解决这个问题。

编辑:我可以在生产站点上看到我可以访问路由/sidekiq。路由文件有这个块:

  authenticate :user, lambda { |u| u.admin? } do
    mount Sidekiq::Web => '/sidekiq'
  end
Run Code Online (Sandbox Code Playgroud)

我可以查看 Web 界面并查看所有作业。这一切都在那里工作。但我需要访问在localhost:3000.

尝试在本地访问它仍然会导致:

Operation now in progress - connect(2) would block

  #  # Socket#connect
  def connect_nonblock(addr, exception: true)
    __connect_nonblock(addr, exception)
  end
end
Run Code Online (Sandbox Code Playgroud)

Sidekiq.rb:

require 'sidekiq'

unless Rails.env.test?
  host = 'localhost'
  port = '6379'
  namespace = 'sitename'

  Sidekiq.configure_server do |config|
    config.redis = { url: "redis://#{host}:#{port}", namespace: namespace }
    schedule_file = "config/schedule.yml"
    if File.exists?(schedule_file)
      Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file)
    end
    config.server_middleware do |chain|
      chain.add Sidekiq::Status::ServerMiddleware, expiration: 30.minutes
    end
    config.client_middleware do |chain|
      chain.add Sidekiq::Status::ClientMiddleware, expiration: 30.minutes
    end
  end

  Sidekiq.configure_client do |config|
    config.redis = { url: "redis://#{host}:#{port}", namespace: namespace }
    config.client_middleware do |chain|
      chain.add Sidekiq::Status::ClientMiddleware, expiration: 30.minutes
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

对于 cable.yml:

development:
  adapter: async
  url: redis://localhost:6379/1
  channel_prefix: sitename_dev

test:
  adapter: async

production:
  adapter: redis
  url: redis://localhost:6379/1
  channel_prefix: sitename_production

Run Code Online (Sandbox Code Playgroud)

goo*_*oon 16

生产服务器正在运行 Ubuntu 并且他们已经安装了redis-server.

我没有在本地安装那个。(我通过 Windows WSL 使用 Ubuntu)

sudo apt install redis-server
Run Code Online (Sandbox Code Playgroud)

我现在可以访问网络界面。

  • 我处于完全相同的情况,这就是问题所在!在我的 WSL 环境中安装并启动了 redis-server 服务并且它起作用了。谢谢! (3认同)