2025-05-28 21:53:03 +00:00

82 lines
2.4 KiB
Python

import logging
from datetime import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger
from app.core.config import settings
from app.db.session import SessionLocal
from app.services.scanner import BlockScanner
logger = logging.getLogger(__name__)
class BlockScanScheduler:
"""
Scheduler for periodic blockchain scanning
"""
def __init__(self):
self.scheduler = BackgroundScheduler()
self.scan_job = None
def start(self):
"""
Start the scheduler
"""
if self.scan_job is None:
# Add job for scanning blocks periodically
self.scan_job = self.scheduler.add_job(
self._scan_blocks,
IntervalTrigger(seconds=settings.SCAN_INTERVAL_SECONDS),
id="scan_blocks",
name="Periodic Block Scan",
replace_existing=True,
)
logger.info(f"Scheduled block scanning every {settings.SCAN_INTERVAL_SECONDS} seconds")
# Start the scheduler
self.scheduler.start()
logger.info("Block scan scheduler started")
def shutdown(self):
"""
Shutdown the scheduler
"""
if self.scheduler.running:
self.scheduler.shutdown()
logger.info("Block scan scheduler shut down")
def _scan_blocks(self):
"""
Scan blocks for arbitrage transactions
"""
logger.info("Starting periodic block scan")
db = SessionLocal()
try:
scanner = BlockScanner(db)
# Skip if a scan is already in progress
if scanner.scan_in_progress:
logger.warning("Scan already in progress, skipping scheduled scan")
return
# Scan latest blocks
events = scanner.scan_blocks(settings.SOLANA_BLOCKS_TO_SCAN)
logger.info(
f"Completed block scan at {datetime.utcnow().isoformat()}, "
f"found {len(events)} arbitrage events"
)
except Exception as e:
logger.error(f"Error during scheduled block scan: {str(e)}")
finally:
db.close()
# Singleton instance
scheduler = BlockScanScheduler()