/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package main

import (
	"fmt"
	"github.com/apache/rocketmq-client-go/core"
	"math/rand"
	"sync/atomic"
)

// Change to main if you want to run it directly
func main3() {
	pConfig := &rocketmq.PushConsumerConfig{
		ClientConfig: rocketmq.ClientConfig{
			GroupID:    "GID_XXXXXXXXXXXX",
			NameServer: "http://XXXXXXXXXXXXXXXXXX:80",
			Credentials: &rocketmq.SessionCredentials{
				AccessKey: "Your Access Key",
				SecretKey: "Your Secret Key",
				Channel:   "ALIYUN/OtherChannel",
			},
		},
		Model:         rocketmq.Clustering,
		ConsumerModel: rocketmq.Orderly,
	}
	ConsumeWithOrderly(pConfig)
}
func ConsumeWithOrderly(config *rocketmq.PushConsumerConfig) {

	consumer, err := rocketmq.NewPushConsumer(config)
	if err != nil {
		println("create Consumer failed, error:", err)
		return
	}

	ch := make(chan interface{})
	var count = (int64)(1000000)
	// ********************************************
	// MUST subscribe topic before consumer started.
	// *********************************************
	consumer.Subscribe("YourOrderlyTopicXXXXXXXX", "*", func(msg *rocketmq.MessageExt) rocketmq.ConsumeStatus {
		fmt.Printf("A message received, MessageID:%s, Body:%s \n", msg.MessageID, msg.Body)
		if atomic.AddInt64(&count, -1) <= 0 {
			ch <- "quit"
		}
		if 0 == rand.Int()%7 {
			fmt.Printf("Consumer Later, MessageID:%s \n", msg.MessageID)
			return rocketmq.ReConsumeLater
		}
		return rocketmq.ConsumeSuccess
	})

	err = consumer.Start()
	if err != nil {
		println("consumer start failed,", err)
		return
	}

	fmt.Printf("consumer: %s started...\n", consumer)
	<-ch
	err = consumer.Shutdown()
	if err != nil {
		println("consumer shutdown failed")
		return
	}
	println("consumer has shutdown.")
}
