我的问题是我有一个通过celery的apply_async每3天执行一次的功能。如果未在2天内获得批准,我会将挂单设置为取消。问题是,如果管理员重新考虑它并将状态更改回挂起,则计时器应重新启动,到期时间不会终止。我不确定celery的.revoke()是否会专门取消一个.expire()调用。我不希望他们都只停止一个特定的。有人可以帮忙吗?
tasks.py
@app.task(name="expire")
def expire(order_id):
print(order_id)
print("this works")
try:
order = Order.objects.get(id=order_id)
print(order)
except:
print(f"Failed retrieving order object of id {order_id}")
return
if order.status != "P":
return
# Place products back to inventory
line_items = order.orderlineitems_set.all()
for line_item in line_items:
product = line_item.product
quantity = line_item.quantity
product.quantity += quantity
product.save()
# Cancel order
order.status = "C"
print(order.status)
order.save()
views.py
class PurchaseView(View):
@staticmethod
@login_required
@customer_required
def get(request):
cart = Cart(request=request)
if not cart.is_approved:
print("Cart is not approved")
return redirect("/checkout/cart/")
customer = Customer.objects.get(user=request.user)
order = cart.convert_to_order(customer=customer)
cart.reset_cart()
print(order.status)
expire.apply_async(args=(order.id,), eta=datetime.utcnow() + timedelta(days=3))
context = make_context(request)
context["total_price"] = order.total_price
return render(request, 'purchase.html', context)
答案 0 :(得分:0)
我通过添加bind = True并使用self来获取任务ID
来解决这个问题@app.task(bind=True, name="expire")
def expire(self,order_id):
print(f"the task queue id is {self.request.id}")
try:
order = Order.objects.get(id=order_id)
print(f"the order status is {order.status}")
except:
print(f"Failed retrieving order object of id {order_id}")
return
if order.status == "C":
print(f"this process terminated, order status:{order.status}")
app.control.revoke(self.request.id, terminate = True)