/**
 * 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.camel;

import java.util.Queue;

/**
 * A consumer of a batch of message exchanges from an {@link Endpoint}
 *
 * @version 
 */
public interface BatchConsumer extends Consumer {

    /**
     * Sets a maximum number of messages as a limit to poll at each polling.
     * <p/>
     * Can be used to limit eg to 100 to avoid when starting and there are millions
     * of messages for you in the first poll.
     * <p/>
     * Is default unlimited, but use 0 or negative number to disable it as unlimited.
     *
     * @param maxMessagesPerPoll  maximum messages to poll.
     */
    void setMaxMessagesPerPoll(int maxMessagesPerPoll);

    /**
     * Processes the list of {@link org.apache.camel.Exchange} in a batch. 
     * <p/>
     * Each message exchange will be processed individually but the batch
     * consumer will add properties with the current index and total in the batch.
     * The items in the Queue may actually be Holder objects that store other 
     * data alongside the Exchange.
     *
     * @param exchanges list of items in this batch
     * @return number of messages actually processed
     * @throws Exception if an internal processing error has occurred.
     */
    int processBatch(Queue<Object> exchanges) throws Exception;

    /**
     * Whether processing the batch is still allowed.
     * <p/>
     * This is used during shutdown to help indicate whether to complete the pending
     * exchanges or stop after current exchange has been processed.
     *
     * @return <tt>true</tt> to continue processing from the batch, or <tt>false</tt> to stop.
     * @see org.apache.camel.ShutdownRunningTask
     */
    boolean isBatchAllowed();
}
