/* * Copyright 2002-2016 the original author or authors. * * Licensed 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.springframework.integration.store; import java.util.Collection; import java.util.Iterator; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.messaging.Message; /** * Defines additional storage operations on groups of messages linked by a group id. * * @author Dave Syer * @author Oleg Zhurakousky * @author Gary Russell * @author Artem Bilan * * @since 2.0 * */ public interface MessageGroupStore extends BasicMessageGroupStore { /** * Optional attribute giving the number of messages in the store over all groups. * Implementations may decline to respond by throwing an exception. * @return the number of messages * @throws UnsupportedOperationException if not implemented */ @ManagedAttribute int getMessageCountForAllMessageGroups(); /** * Optional attribute giving the number of message groups. * Implementations may decline to respond by throwing an exception. * @return the number message groups * @throws UnsupportedOperationException if not implemented */ @ManagedAttribute int getMessageGroupCount(); /** * Persist the deletion of messages from the group. * @param key The groupId for the group containing the message(s). * @param messages The messages to be removed. * @since 4.2 */ void removeMessagesFromGroup(Object key, Collection<Message<?>> messages); /** * Persist the deletion of messages from the group. * @param key The groupId for the group containing the message(s). * @param messages The messages to be removed. * @since 4.2 */ void removeMessagesFromGroup(Object key, Message<?>... messages); /** * Register a callback for when a message group is expired through {@link #expireMessageGroups(long)}. * @param callback A callback to execute when a message group is cleaned up. */ void registerMessageGroupExpiryCallback(MessageGroupCallback callback); /** * Extract all expired groups (whose timestamp is older than the current time less the threshold provided) and call * each of the registered callbacks on them in turn. For example: call with a timeout of 100 to expire all groups * that were created more than 100 milliseconds ago, and are not yet complete. Use a timeout of 0 (or negative to be * on the safe side) to expire all message groups. * @param timeout the timeout threshold to use * @return the number of message groups expired * @see #registerMessageGroupExpiryCallback(MessageGroupCallback) */ @ManagedOperation int expireMessageGroups(long timeout); /** * Allows you to set the sequence number of the last released Message. Used for Resequencing use cases * @param groupId The group identifier. * @param sequenceNumber The sequence number. */ void setLastReleasedSequenceNumberForGroup(Object groupId, int sequenceNumber); /** * @return The iterator of currently accumulated {@link MessageGroup}s. */ Iterator<MessageGroup> iterator(); /** * Completes this MessageGroup. Completion of the MessageGroup generally means * that this group should not be allowing any more mutating operation to be performed on it. * For example any attempt to add/remove new Message form the group should not be allowed. * @param groupId The group identifier. */ void completeGroup(Object groupId); /** * Obtain the group metadata without fetching any messages; must supply all other * group properties; may include the id of the first message. * @param groupId The group id. * @return The metadata. * @since 4.0 */ MessageGroupMetadata getGroupMetadata(Object groupId); /** * Return the one {@link Message} from {@link MessageGroup}. * @param groupId The group identifier. * @return the {@link Message}. * @since 4.0 */ Message<?> getOneMessageFromGroup(Object groupId); /** * Store messages with an association to a group id. * This can be used to group messages together. * @param groupId The group id to store messages under. * @param messages The messages to add. * @since 4.3 */ void addMessagesToGroup(Object groupId, Message<?>... messages); /** * Retrieve messages for the provided group id. * @param groupId The group id to retrieve messages for. * @return the messages for group. * @since 4.3 */ Collection<Message<?>> getMessagesForGroup(Object groupId); /** * Invoked when a MessageGroupStore expires a group. */ @FunctionalInterface interface MessageGroupCallback { void execute(MessageGroupStore messageGroupStore, MessageGroup group); } }