fix(NSQ): close service after waiting all job completed. (#601)
This commit is contained in:
		
							parent
							
								
									87be86be08
								
							
						
					
					
						commit
						d6b4a0ae39
					
				| 
						 | 
				
			
			@ -80,6 +80,11 @@ services:
 | 
			
		|||
- name: redis
 | 
			
		||||
  image: redis
 | 
			
		||||
 | 
			
		||||
- name: nsq
 | 
			
		||||
  image: nsqio/nsq
 | 
			
		||||
  commands:
 | 
			
		||||
  - /nsqd
 | 
			
		||||
 | 
			
		||||
volumes:
 | 
			
		||||
- name: gopath
 | 
			
		||||
  temp: {}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,3 +36,4 @@ custom
 | 
			
		|||
release
 | 
			
		||||
coverage.txt
 | 
			
		||||
node_modules
 | 
			
		||||
config.yml
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,6 +118,13 @@
 | 
			
		|||
        name: 'redis',
 | 
			
		||||
        image: 'redis',
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        name: 'nsq',
 | 
			
		||||
        image: 'nsqio/nsq',
 | 
			
		||||
        commands: [
 | 
			
		||||
          "/nsqd",
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,7 +98,10 @@ func (s *Worker) AfterRun() error {
 | 
			
		|||
 | 
			
		||||
// Run start the worker
 | 
			
		||||
func (s *Worker) Run(quit chan struct{}) error {
 | 
			
		||||
	wg := &sync.WaitGroup{}
 | 
			
		||||
	s.q.AddHandler(nsq.HandlerFunc(func(msg *nsq.Message) error {
 | 
			
		||||
		wg.Add(1)
 | 
			
		||||
		defer wg.Done()
 | 
			
		||||
		var notification gorush.PushNotification
 | 
			
		||||
		if err := json.Unmarshal(msg.Body, ¬ification); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
| 
						 | 
				
			
			@ -110,6 +113,8 @@ func (s *Worker) Run(quit chan struct{}) error {
 | 
			
		|||
	select {
 | 
			
		||||
	case <-quit:
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	wg.Wait()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
package nsq
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"log"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/appleboy/gorush/logx"
 | 
			
		||||
	"github.com/appleboy/gorush/queue"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestMain(m *testing.M) {
 | 
			
		||||
	if err := logx.InitLog(
 | 
			
		||||
		"debug",
 | 
			
		||||
		"stdout",
 | 
			
		||||
		"debug",
 | 
			
		||||
		"stdout",
 | 
			
		||||
	); err != nil {
 | 
			
		||||
		log.Fatalf("Can't load log module, error: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	m.Run()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestShutdown(t *testing.T) {
 | 
			
		||||
	w := NewWorker(
 | 
			
		||||
		WithAddr("nsq:4150"),
 | 
			
		||||
		WithTopic("test"),
 | 
			
		||||
	)
 | 
			
		||||
	q := queue.NewQueue(w, 2)
 | 
			
		||||
	q.Start()
 | 
			
		||||
	time.Sleep(1 * time.Second)
 | 
			
		||||
	q.Shutdown()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -64,7 +64,9 @@ func (q *Queue) Queue(job interface{}) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (q *Queue) work(num int) {
 | 
			
		||||
	q.worker.BeforeRun()
 | 
			
		||||
	if err := q.worker.BeforeRun(); err != nil {
 | 
			
		||||
		logx.LogError.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	q.routineGroup.Run(func() {
 | 
			
		||||
		// to handle panic cases from inside the worker
 | 
			
		||||
		// in such case, we start a new goroutine
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +81,9 @@ func (q *Queue) work(num int) {
 | 
			
		|||
		q.worker.Run(q.quit)
 | 
			
		||||
		logx.LogAccess.Info("closed the worker num ", num)
 | 
			
		||||
	})
 | 
			
		||||
	q.worker.AfterRun()
 | 
			
		||||
	if err := q.worker.AfterRun(); err != nil {
 | 
			
		||||
		logx.LogError.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (q *Queue) startWorker() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue