/*
 *
 *   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 org.apache.dubbo.samples.resilience4jboot2.provider.impl;

import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.samples.resilience4jboot2.api.CircuitBreakerService;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 2018/12/26
 */
@DubboService(interfaceClass = CircuitBreakerService.class)
public class CircuitBreakerServiceImpl implements CircuitBreakerService {
    private AtomicLong count = new AtomicLong(0);

    @Override
    public String say(String name) {
        long countLong = count.incrementAndGet();
        if (name.startsWith("half") && countLong % 20 < 18) {
            return "Hello " + name + " - " + countLong;
        } else if (name.startsWith("off")) {
            return "Hello " + name + " - " + countLong;
        }
        throw new RuntimeException("Exception to show resilience enabled." + name);
    }
}
