82 lines
2.4 KiB
Python
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() |