// Path: src/main/java/com/github/phantomthief/collection/BufferTrigger.java
// public interface BufferTrigger<E> extends AutoCloseable {
// 
//     /**
//      * 将需要定时处理的元素推入缓存.
//      *
//      * @throws IllegalStateException 当实例被关闭时，调用该方法可能会引起该异常.
//      */
//     void enqueue(E element);
// 
//     /**
//      * 手动触发一次缓存消费.
//      * <p>一般处于缓存关闭方法{@link #close()}实现中.
//      */
//     void manuallyDoTrigger();
// 
//     /**
//      * 获取当前缓存中未消费元素个数.
//      */
//     long getPendingChanges();
// 
//     /**
//      * 快捷创建{@link GenericSimpleBufferTriggerBuilder}建造器，用于构造{@link SimpleBufferTrigger}实例.
//      * <p>
//      * 推荐用该方法构造{@link SimpleBufferTrigger}实例，适用用大多数场景
//      *
//      * @param <E> 元素类型
//      * @param <C> 持有元素的容器类型，如使用默认容器实现（不指定 {@link GenericSimpleBufferTriggerBuilder#setContainerEx}），默认为 {@link ConcurrentHashMap#newKeySet()}，
//      * <p>此时本泛型可以考虑设置为 <code>Set&lt;E&gt;</code>
//      * <p>注意，强烈不建议使用默认容器，任何时候，都应该优先考虑自行设计容器类型!
//      * @return {@link GenericSimpleBufferTriggerBuilder} 实例
//      */
//     static <E, C> GenericSimpleBufferTriggerBuilder<E, C> simple() {
//         return new GenericSimpleBufferTriggerBuilder<>(SimpleBufferTrigger.newBuilder());
//     }
// 
//     /**
//      * 该方法即将废弃，可更换为{@link #simple()}.
//      */
//     @Deprecated
//     static SimpleBufferTriggerBuilder<Object, Object> simpleTrigger() {
//         return SimpleBufferTrigger.newBuilder();
//     }
// 
//     /**
//      * 提供自带背压(back-pressure)的简单批量归并消费能力.
//      * <p>
//      *
//      * <p>
//      * FIXME: 高亮注意，目前 {@link #simple()} 也提供了背压能力 {@link GenericSimpleBufferTriggerBuilder#enableBackPressure()}
//      * 所以本模式的意义已经小的多，如果没特殊情况，可以考虑都切换到 {@link SimpleBufferTrigger} 版本.
//      */
//     static <E> GenericBatchConsumerTriggerBuilder<E> batchBlocking() {
//         return new GenericBatchConsumerTriggerBuilder<>(
//                 BatchConsumeBlockingQueueTrigger.newBuilder());
//     }
// 
//     /**
//      * 该方法即将废弃，请使用{@link #batchBlocking()}替代.
//      */
//     @Deprecated
//     static BatchConsumerTriggerBuilder<Object> batchBlockingTrigger() {
//         return BatchConsumeBlockingQueueTrigger.newBuilder();
//     }
// 
//     /**
//      * 停止该实例，释放所持有资源.
//      * <p>
//      * 请注意自动关闭特性仅在处于{@code try}-with-resources时才会生效，其它场景请在服务停止的回调方法中显式调用该方法.
//      */
//     @Override
//     void close(); // override to remove throws Exception.
// }


import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
import static java.time.Duration.ofSeconds;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.time.Duration;
import org.junit.jupiter.api.Test;
import com.github.phantomthief.collection.BufferTrigger;
package com.github.phantomthief.test;





/**
 * @author w.vela
 * Created on 2019-12-03.
 */
class BatchBlockDynamicTest {

    @Test
    void test() {
        Duration[] linger = {ofSeconds(1)};
        int[] consumed = {0};
        BufferTrigger<String> buffer = BufferTrigger.<String> batchBlocking()
                .batchSize(100)
                .linger(() -> linger[0])
// Path: src/main/java/com/github/phantomthief/collection/BufferTrigger.java
// public interface BufferTrigger<E> extends AutoCloseable {
// 
//     /**
//      * 将需要定时处理的元素推入缓存.
//      *
//      * @throws IllegalStateException 当实例被关闭时，调用该方法可能会引起该异常.
//      */
//     void enqueue(E element);
// 
//     /**
//      * 手动触发一次缓存消费.
//      * <p>一般处于缓存关闭方法{@link #close()}实现中.
//      */
//     void manuallyDoTrigger();
// 
//     /**
//      * 获取当前缓存中未消费元素个数.
//      */
//     long getPendingChanges();
// 
//     /**
//      * 快捷创建{@link GenericSimpleBufferTriggerBuilder}建造器，用于构造{@link SimpleBufferTrigger}实例.
//      * <p>
//      * 推荐用该方法构造{@link SimpleBufferTrigger}实例，适用用大多数场景
//      *
//      * @param <E> 元素类型
//      * @param <C> 持有元素的容器类型，如使用默认容器实现（不指定 {@link GenericSimpleBufferTriggerBuilder#setContainerEx}），默认为 {@link ConcurrentHashMap#newKeySet()}，
//      * <p>此时本泛型可以考虑设置为 <code>Set&lt;E&gt;</code>
//      * <p>注意，强烈不建议使用默认容器，任何时候，都应该优先考虑自行设计容器类型!
//      * @return {@link GenericSimpleBufferTriggerBuilder} 实例
//      */
//     static <E, C> GenericSimpleBufferTriggerBuilder<E, C> simple() {
//         return new GenericSimpleBufferTriggerBuilder<>(SimpleBufferTrigger.newBuilder());
//     }
// 
//     /**
//      * 该方法即将废弃，可更换为{@link #simple()}.
//      */
//     @Deprecated
//     static SimpleBufferTriggerBuilder<Object, Object> simpleTrigger() {
//         return SimpleBufferTrigger.newBuilder();
//     }
// 
//     /**
//      * 提供自带背压(back-pressure)的简单批量归并消费能力.
//      * <p>
//      *
//      * <p>
//      * FIXME: 高亮注意，目前 {@link #simple()} 也提供了背压能力 {@link GenericSimpleBufferTriggerBuilder#enableBackPressure()}
//      * 所以本模式的意义已经小的多，如果没特殊情况，可以考虑都切换到 {@link SimpleBufferTrigger} 版本.
//      */
//     static <E> GenericBatchConsumerTriggerBuilder<E> batchBlocking() {
//         return new GenericBatchConsumerTriggerBuilder<>(
//                 BatchConsumeBlockingQueueTrigger.newBuilder());
//     }
// 
//     /**
//      * 该方法即将废弃，请使用{@link #batchBlocking()}替代.
//      */
//     @Deprecated
//     static BatchConsumerTriggerBuilder<Object> batchBlockingTrigger() {
//         return BatchConsumeBlockingQueueTrigger.newBuilder();
//     }
// 
//     /**
//      * 停止该实例，释放所持有资源.
//      * <p>
//      * 请注意自动关闭特性仅在处于{@code try}-with-resources时才会生效，其它场景请在服务停止的回调方法中显式调用该方法.
//      */
//     @Override
//     void close(); // override to remove throws Exception.
// }


// Path: src/test/java/com/github/phantomthief/test/BatchBlockDynamicTest.java
import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
import static java.time.Duration.ofSeconds;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.time.Duration;
import org.junit.jupiter.api.Test;
import com.github.phantomthief.collection.BufferTrigger;

package com.github.phantomthief.test;





/**
 * @author w.vela
 * Created on 2019-12-03.
 */
class BatchBlockDynamicTest {

    @Test
    void test() {
        Duration[] linger = {ofSeconds(1)};
        int[] consumed = {0};
        BufferTrigger<String> buffer = BufferTrigger.<String> batchBlocking()
                .batchSize(100)
                .linger(() -> linger[0])
                .setConsumerEx(it -> consumed[0]++)