001/*
002 * Copyright 2006-2007 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      https://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.springframework.batch.item.jms;
018
019import javax.jms.JMSException;
020import javax.jms.Message;
021
022import org.springframework.batch.item.UnexpectedInputException;
023import org.springframework.retry.interceptor.NewMethodArgumentsIdentifier;
024
025/**
026 * A {@link NewMethodArgumentsIdentifier} for JMS that looks for a message in
027 * the arguments and checks its delivery status.
028 * 
029 * @author Dave Syer
030 * 
031 */
032public class JmsNewMethodArgumentsIdentifier<T> implements NewMethodArgumentsIdentifier {
033
034        /**
035         * If any of the arguments is a message, check the JMS re-delivered flag and
036         * return it, otherwise return false to be on the safe side.
037         * 
038         * @see org.springframework.retry.interceptor.NewMethodArgumentsIdentifier#isNew(java.lang.Object[])
039         */
040    @Override
041        public boolean isNew(Object[] args) {
042
043                for (Object item : args) {
044                        if (item instanceof Message) {
045                                try {
046                                        return !((Message) item).getJMSRedelivered();
047                                }
048                                catch (JMSException e) {
049                                        throw new UnexpectedInputException("Could not extract message ID", e);
050                                }
051                        }
052                }
053                return false;
054        }
055
056}