This commit is contained in:
2026-01-25 21:59:00 +08:00
parent 7fd537bef3
commit 4cad3f0250
118 changed files with 30473 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
package service
import (
"context"
"log"
"time"
)
// ExchangeRateScheduler handles scheduled fetching of exchange rates
type ExchangeRateScheduler struct {
yunAPIClient *YunAPIClient
interval time.Duration
stopChan chan struct{}
}
// NewExchangeRateScheduler creates a new ExchangeRateScheduler
func NewExchangeRateScheduler(yunAPIClient *YunAPIClient, interval time.Duration) *ExchangeRateScheduler {
return &ExchangeRateScheduler{
yunAPIClient: yunAPIClient,
interval: interval,
stopChan: make(chan struct{}),
}
}
// Start begins the scheduled fetching of exchange rates
// It fetches immediately on start, then every interval
func (s *ExchangeRateScheduler) Start(ctx context.Context) {
log.Printf("[Scheduler] Starting exchange rate scheduler with interval: %v", s.interval)
// Fetch immediately on start
s.fetchRates()
// Create ticker for periodic fetching
ticker := time.NewTicker(s.interval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
s.fetchRates()
case <-s.stopChan:
log.Println("[Scheduler] Exchange rate scheduler stopped")
return
case <-ctx.Done():
log.Println("[Scheduler] Exchange rate scheduler stopped due to context cancellation")
return
}
}
}
// Stop stops the scheduler
func (s *ExchangeRateScheduler) Stop() {
close(s.stopChan)
}
// fetchRates calls the YunAPI client to fetch and save rates
func (s *ExchangeRateScheduler) fetchRates() {
log.Println("[Scheduler] Triggering exchange rate fetch...")
if err := s.yunAPIClient.FetchAndSaveRates(); err != nil {
log.Printf("[Scheduler] Error fetching exchange rates: %v", err)
}
}