diff --git a/main.go b/main.go index 98d5677..2834f62 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "local3/rssmon2/rss" "local3/rssmon2/server" "local3/rssmon2/store" + "time" ) const nsForFeeds = "FEEDS" @@ -30,28 +31,34 @@ func main() { if !ok { feed, items, err = rss.New(url, "Blue", "") if err != nil { + logger.Log("can't create new RSS %q: %v", url, err) return } } else { items, err = allFeeds[url].Update() if err != nil { + logger.Log("can't update old RSS %q: %v", url, err) return } } b, err := feed.Serialize() if err != nil { + logger.Log("can't serialize to save RSS %q: %v", url, err) return } if err := sclient.Set(nsForFeeds, feed.ID(), b); err != nil { + logger.Log("can't save RSS %q.%q: %v", nsForFeeds, feed.ID(), err) return } logger.Log("Saved feed", feed) for i := range items { b, err := items[i].Serialize() if err != nil { + logger.Log("can't save rss item %q.%q: %v", url, items[i].Link, err) return } if err := sclient.Set(feed.ID(), items[i].ID(), b); err != nil { + logger.Log("can't save rss item %q.%q: %v", feed.ID(), items[i].ID(), err) return } logger.Log("Saved feed item", feed.ID(), items[i].ID(), items[i]) @@ -77,7 +84,11 @@ func main() { }() */ - server, err := server.New(config.Port) + server, err := server.New(config.Port, func(url string, interval time.Duration) { + if err := mon.Submit(url, interval); err != nil { + logger.Log("Cannot accept new feed %q: %v", url, err) + } + }) if err != nil { panic(err) } diff --git a/monitor/monitor.go b/monitor/monitor.go index 58dd670..726845c 100644 --- a/monitor/monitor.go +++ b/monitor/monitor.go @@ -23,6 +23,18 @@ func New(port string, trigger func(string)) (*Monitor, error) { }, nil } +func (monitor *Monitor) Submit(url string, interval time.Duration) error { + select { + case monitor.newItems <- Item{ + URL: url, + Interval: Duration{interval}, + }: + case <-time.After(time.Second * 5): + return errors.New("timeout submitting new item") + } + return nil +} + func (monitor *Monitor) Start() error { errs := make(chan error) go func() { diff --git a/monitor/monitor_test.go b/monitor/monitor_test.go index 16850f5..8b9d956 100644 --- a/monitor/monitor_test.go +++ b/monitor/monitor_test.go @@ -17,19 +17,14 @@ func Test_Monitor(t *testing.T) { if err != nil { t.Fatalf("cannot create new monitor: %v", err) } - itemsNew := make(chan Item, 1) - m.newItems = itemsNew if err := m.Start(); err != nil { t.Fatalf("cannot start monitor: %v", err) } for i := 0; i < numItems; i++ { - item := NewItem("item"+strconv.Itoa(i), time.Second+time.Second*time.Duration(i)*1) - select { - case itemsNew <- *item: - case <-time.After(time.Second * 5): - t.Fatalf("could not add new item in time limit") + if err := m.Submit("item"+strconv.Itoa(i), time.Second+time.Second*time.Duration(i)); err != nil { + t.Errorf("failed to submit item %d: %v", i, err) } } diff --git a/server/server.go b/server/server.go index a2471ab..dad1d7b 100644 --- a/server/server.go +++ b/server/server.go @@ -7,15 +7,18 @@ import ( "path" "strings" "syscall" + "time" ) type Server struct { - addr string + addr string + newItemHandler func(string, time.Duration) } -func New(addr string) (*Server, error) { +func New(addr string, newItemHandler func(string, time.Duration)) (*Server, error) { return &Server{ - addr: addr, + addr: addr, + newItemHandler: newItemHandler, }, nil }