groupbwt / scrapy-boilerplate

Scrapy project boilerplate done right
MIT License
42 stars 25 forks source link

feat(rmq): fix errback method for rmq module #49

Closed AntonGsv closed 4 years ago

AntonGsv commented 4 years ago

При попадании на errback не происходит ack/nack сообщения, ошибка из https://github.com/groupbwt/scrapy-boilerplate/issues/46#issuecomment-664037046. Мерж должен это исправить.

Минимальный пример для воссоздания ошибки (нужно добавить произвольное сообщение в errback_task для запуска). Без мержа паук зависает при получении ошибок в количестве CONCURRENT_REQUESTS.

import scrapy

from rmq.items import RMQItem
from rmq.pipelines import ItemProducerPipeline
from rmq.spiders import TaskToSingleResultSpider
from rmq.utils import get_import_full_name
from rmq.utils.decorators import rmq_callback, rmq_errback

class ErrbackSpider(TaskToSingleResultSpider):
    name = 'errback'

    custom_settings = {
        'LOG_LEVEL': 'DEBUG',
        'DOWNLOAD_TIMEOUT': 0.001,
        'RETRY_TIMES': 2,
        "ITEM_PIPELINES": {
            get_import_full_name(ItemProducerPipeline): 310,
        },
    }

    def start_requests(self):
        yield from ()

    def __init__(self, *args, **kwargs):
        super(ErrbackSpider, self).__init__(*args, **kwargs)
        self.task_queue_name = 'errback_task'
        self.result_queue_name = 'errback_result'

    def next_request(self, _delivery_tag: int, msg_body: bytes):
        return scrapy.Request(
            'https://httpstat.us/200',
            callback=self.parse,
            dont_filter=True,
            errback=self.errback,
        )

    @rmq_callback
    def parse(self, response):
        yield RMQItem()
        self.logger.info('parse')

    @rmq_errback
    def errback(self, failure):
        yield RMQItem()
        yield RMQItem()
        self.logger.info('errback')
AntonGsv commented 4 years ago

@KristobalJunta прими пожалуйста мерж