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  }