@@ -41,6 +41,7 @@ import { EntityRepository } from "@mikro-orm/postgresql";
4141import { z } from "zod" ;
4242import { CacheStorageService } from "../cache-storage/cache-storage.service" ;
4343import { PartitionedFeedArticleFieldStoreService } from "../articles/partitioned-feed-article-field-store.service" ;
44+ import dayjs from "dayjs" ;
4445
4546@Injectable ( )
4647export class FeedEventHandlerService {
@@ -366,8 +367,6 @@ export class FeedEventHandlerService {
366367
367368 await this . updateFeedArticlesInCache ( { event, articles : allArticles } ) ;
368369
369- // START TEMPORARY - Should revisit this for a more robust retry strategy
370-
371370 const foundRetryRecord = await this . feedRetryRecordRepo . findOne (
372371 {
373372 feed_id : event . data . feed . id ,
@@ -389,8 +388,6 @@ export class FeedEventHandlerService {
389388 } ) ;
390389 }
391390
392- // END TEMPORARY
393-
394391 if ( ! articles . length ) {
395392 this . debugLog (
396393 `Debug ${ event . data . feed . id } : Ignoring feed event due to no` +
@@ -484,17 +481,31 @@ export class FeedEventHandlerService {
484481 stack : ( err as Error ) . stack ,
485482 } ) ;
486483
487- const retryRecord = await this . feedRetryRecordRepo . findOne (
488- {
489- feed_id : event . data . feed . id ,
490- } ,
491- {
492- fields : [ "id" , "attempts_so_far" ] ,
493- }
494- ) ;
484+ const retryRecord = await this . feedRetryRecordRepo . findOne ( {
485+ feed_id : event . data . feed . id ,
486+ } ) ;
495487
496- // Rudimentary retry to alleviate some pressure
497- if ( retryRecord ?. attempts_so_far && retryRecord . attempts_so_far >= 8 ) {
488+ const createdAt = retryRecord ?. created_at ;
489+ let disableFeed = false ;
490+
491+ if ( createdAt ) {
492+ const cutoffTime = dayjs ( createdAt ) . add ( 1 , "day" ) ;
493+
494+ if ( dayjs ( ) . isAfter ( cutoffTime ) ) {
495+ logger . info (
496+ `Feed ${ event . data . feed . id } exceeded retry cutoff date for invalid feed` +
497+ `, sending disable event` ,
498+ {
499+ xml : err . feedText ,
500+ }
501+ ) ;
502+
503+ disableFeed = true ;
504+ }
505+ } else if (
506+ retryRecord ?. attempts_so_far &&
507+ retryRecord . attempts_so_far >= 8
508+ ) {
498509 logger . info (
499510 `Feed ${ event . data . feed . id } exceeded retry limit for invalid feed` +
500511 `, sending disable event` ,
@@ -503,6 +514,11 @@ export class FeedEventHandlerService {
503514 }
504515 ) ;
505516
517+ disableFeed = true ;
518+ }
519+
520+ // Rudimentary retry to alleviate some pressure
521+ if ( disableFeed && retryRecord ) {
506522 this . amqpConnection . publish (
507523 "" ,
508524 MessageBrokerQueue . FeedRejectedDisableFeed ,
@@ -532,6 +548,7 @@ export class FeedEventHandlerService {
532548 await this . feedRetryRecordRepo . upsert ( {
533549 feed_id : event . data . feed . id ,
534550 attempts_so_far : ( retryRecord ?. attempts_so_far || 0 ) + 1 ,
551+ created_at : retryRecord ?. created_at || new Date ( ) ,
535552 } ) ;
536553 }
537554
0 commit comments