Migration to Spring Boot 2 and using Spring Batch 4

前端 未结 3 496
心在旅途
心在旅途 2020-12-09 23:46

I am migrating Spring Boot from 1.4.2 to 2.0.0, which also includes migrating Spring batch from 3.0.7 to 4.0.0 and it looks like batch process is no longer working when i tr

3条回答
  •  春和景丽
    2020-12-10 00:25

    In the solution by @anotherdave and @michael-minella, you could also replace the plain XStreamExecutionContextStringSerializer with an instance of the following class. It accepts both formats when deserializing and serializes to the new format.

    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Map;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import org.springframework.batch.core.repository.ExecutionContextSerializer;
    import org.springframework.batch.core.repository.dao.Jackson2ExecutionContextStringSerializer;
    import org.springframework.batch.core.repository.dao.XStreamExecutionContextStringSerializer;
    
    
    /**
     * Enables Spring Batch 4 to read both ExecutionContext entries written by ealier versions and the Spring 5 format. Entries are
     * written in Spring 5 format.
     */
    @SuppressWarnings("deprecation")
    class XStreamOrJackson2ExecutionContextSerializer implements ExecutionContextSerializer {
        private final XStreamExecutionContextStringSerializer xStream = new XStreamExecutionContextStringSerializer();
        private final Jackson2ExecutionContextStringSerializer jackson = new Jackson2ExecutionContextStringSerializer();
    
        public XStreamOrJackson2ExecutionContextSerializer() throws Exception {
            xStream.afterPropertiesSet();
        }
    
        // The caller closes the stream; and the decoration by ensureMarkSupported does not need any cleanup.
        @SuppressWarnings("resource")
        @Override
        public Map deserialize(InputStream inputStream) throws IOException {
            InputStream repeatableInputStream = ensureMarkSupported(inputStream);
            repeatableInputStream.mark(Integer.MAX_VALUE);
    
            try {
                return jackson.deserialize(repeatableInputStream);
            } catch (JsonProcessingException e) {
                repeatableInputStream.reset();
                return xStream.deserialize(repeatableInputStream);
            }
        }
    
        private static InputStream ensureMarkSupported(InputStream in) {
            return in.markSupported() ? in : new BufferedInputStream(in);
        }
    
        @Override
        public void serialize(Map object, OutputStream outputStream) throws IOException {
            jackson.serialize(object, outputStream);
        }
    }
    

提交回复
热议问题