Spring RestController 接收一个巨大的字节数组作为请求正文导致内存不足错误



我有接受byte[]作为RequestBody的RestApi端点。但是,它使用太多内存。如何读取这个大字节[]数组?

有没有更好的方法可以做到这一点?

我目前不起作用的解决方案如下:

控制器:

@RequestMapping(value = "person", method = RequestMethod.POST)public 
void postPerson(@RequestBody() byte[] data) {
  PersonService.postPerson(data);
}

服务:

public void postPerson(byte[] data) {
Splitter sp = new Splitter();
    sp.splitFile(data, (bytes) -> {
    });
}

接口:

public interface Splitter {
    void splitFile(byte[] data, Consumer<byte[]> segmentConsumer);
}

分配器:

public void splitFile(byte[] data, Consumer<byte[]> segmentConsumer){
    try {
        XMLInputFactory xmlif = XMLInputFactory.newInstance();
        final XMLEventReader reader = xmlif.createXMLEventReader(new 
        ByteArrayInputStream(data), StandardCharsets.ISO_8859_1.name());
        String fileHeader = "";
        StringBuilder aggregatedSegments = new StringBuilder();
        int segmentCount = 0;
        while (reader.hasNext()) {
            final XMLEvent event = reader.nextEvent();
            if (isStartElement(event, "status")) {
                fileHeader = buildHeader(event, reader);
            }
            if (isStartElement(event, "person")) {
                segmentCount++;
                aggregatedSegments.append(buildSegment(event, reader));
                if (maxNrOfElementsInSegment == segmentCount) {
                    segmentConsumer.accept(buildFile(fileHeader, aggregatedSegments));
                    aggregatedSegments = new StringBuilder();
                    segmentCount = 0;
                }
            }
        }
        if (segmentCount != 0) {
            segmentConsumer.accept(buildFile(fileHeader, aggregatedSegments));
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }    
}
@RequestMapping(value = "", method = RequestMethod.POST)
public void postTransportEvent(HttpServletRequest request) {
File streamedFile = new File("test.xml");
    try {
        InputStream inputStream = request.getInputStream();
        if (inputStream != null) {
            FileOutputStream outputStream = new FileOutputStream(streamedFile);
            byte[] buffer = new byte[10240];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) > 0) {
                outputStream.write(buffer, 0, bytesRead);
            }
            outputStream.flush();
            outputStream.close();
        }
        inputFileStream.close();
    } catch (IOException e) {
        log.error(e.toString(), e);
    } finally {
        streamedFile.delete();
    }

最新更新