我一直在尝试创建一个延迟作业,用于检查Etsy上的产品是否仍然可用。每当我使用 bin / delayed_job start 运行它时会出现错误(尽管由于某种原因它可以正常运行 rake jobs:work )。我得到的错误是:
Job CheckInventoryStatus (id=1174) FAILED (0 prior attempts) with ActiveRecord::StatementInvalid: PG::ConnectionBad: PQconsumeInput() server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
: SELECT a.attname, format_type(a.atttypid, a.atttypmod),
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
FROM pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = '"spree_stock_items"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
我认为违规行是首先尝试进行SQL查找的地方:
etsy_location = variant.stock_locations.where(vendor_type: 2).first
完整的代码如下。
CheckInventoryStatus = Struct.new(:empty) do
def perform
Delayed::Backend::ActiveRecord::Job.after_fork
Spree::Variant.where('spree_variants.inventory_link != ?',"").each do |variant|
begin
page = Nokogiri::HTML(open(variant.inventory_link))
etsy_location = variant.stock_locations.where(vendor_type: 2).first
unless etsy_location.nil?
if !page.at_xpath('//meta[@itemprop="availability"]/@content').nil?
if etsy_location.count_on_hand(variant) <= 10
etsy_location.restock(variant, 10-etsy_location.count_on_hand(variant))
end
else
etsy_location.unstock(variant, etsy_location.count_on_hand(variant))
end
end
rescue => error
Delayed::Worker.logger.info "Error for "+variant.inventory_link
Delayed::Worker.logger.info error.backtrace
end
end
end
...
end