github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/cmd/fastcache1e6/prod_nats.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "github.com/angenalZZZ/gofunc/f" 6 nat "github.com/angenalZZZ/gofunc/rpc/nats" 7 "github.com/nats-io/nats.go" 8 "log" 9 "os" 10 "syscall" 11 ) 12 13 func ProdNatS() { 14 var ( 15 name = "cache.>" 16 sub *nats.Subscription 17 ) 18 19 // "*" matches any token, at any level of the subject. 20 // ">" matches any length of the tail of a subject, and can only be the last token 21 // E.g. 'cache.>' will match 'cache.set.123', 'cache.get.123', 'cache.del.123' 22 if *flagName != "" { 23 name = *flagName + ".>" 24 } 25 26 nc, err := nat.New("fastcache1e6", *flagAddr, "", *flagToken, *flagCert, *flagKey) 27 28 if err != nil { 29 nat.Log.Error().Msgf("Nats failed connect to server: %v\n", err) 30 os.Exit(1) 31 } 32 33 // Handle panic. 34 defer func() { 35 err := recover() 36 if err != nil { 37 nat.Log.Error().Msgf("[nats] run error > %v", err) 38 } 39 40 // Unsubscribe will remove interest in the given subject. 41 _ = sub.Unsubscribe() 42 // Drain connection (Preferred for responders), Close() not needed if this is called. 43 _ = nc.Drain() 44 45 // os.Exit(1) 46 if err != nil { 47 log.Fatal(err) 48 } 49 }() 50 51 // Async Subscriber. 52 sub, err = nc.Subscribe(name, func(m *nats.Msg) { 53 result := defaultService.Handle(m.Data) 54 if err = m.Respond(result); err != nil { 55 _ = fmt.Errorf("Nats failed to Write: %v\n", err) 56 } 57 //if err = nc.Publish(m.Reply, result); err != nil { 58 // _ = fmt.Errorf("Nats failed to Write: %v\n", err) 59 //} 60 }) 61 // Set listening. 62 nat.SubscribeErrorHandle(sub, true, err) 63 if err != nil { 64 os.Exit(1) 65 } 66 67 // Set pending limits. 68 nat.SubscribeLimitHandle(sub, 10000000, 1048576) 69 70 // Flush connection to server, returns when all messages have been processed. 71 nat.FlushAndCheckLastError(nc) 72 73 // Pass the signals you want to end your application. 74 death := f.NewDeath(syscall.SIGINT, syscall.SIGTERM) 75 // When you want to block for shutdown signals. 76 death.WaitForDeathWithFunc(func() { 77 nat.Log.Error().Msg("[nats] run forced termination") 78 }) 79 }