0

重複の可能性:
InputStream を Amazon S3 に配置しようとするとプロセスが停止する

  • APIメソッドを持つ がありますOutputStream getOutputStream(String id)
  • これAPIには 2 つの具体的な実装がFileServiceあります。S3Service
  • 次のことを行う documentManager があります
public void putDocument(@Nonnull final Document document) throws IllegalArgumentException, PersistenceException {
        final OutputStream stream = persistenceService.getOutputStream(document.getUniqueId());
        try {
            jaxbContext.createMarshaller().marshal(document, stream);
        } catch (final JAXBException e) {
            LOGGER.error(e.getMessage(), e);
            throw new PersistenceException("Failed to marshall document " + document.getUniqueId() + ": " + e.getMessage(), e);
        } finally {
            try {
                stream.close();
            } catch (IOException e) {
                throw new PersistenceException("Failed to close output stream for " + document.getUniqueId());
            }
        }
    }

persistenceService によって返される書き込みDocumentManageroutputStream

  • この実装は、FileService
  • では、これを準拠するためS3Serviceに変換する必要があります(ここ)OutputStreamInputStreamAmazon S3 API
  • だから私は次のことをしましたS3Service.getOutputStream

    public OutputStream getOutputStream(@Nonnull final String uniqueId) throws PersistenceException {
         final PipedOutputStream outputStream = new PipedOutputStream();
         final PipedInputStream inputStream;
         try {
             inputStream = new PipedInputStream(outputStream);
             new Thread(
                     new Runnable() {
                         @Override
                         public void run() {
                             ObjectMetadata objectMetadata = new ObjectMetadata();
                             objectMetadata.setContentType("application/octet-stream");
                             PutObjectRequest putObjectRequest = new     PutObjectRequest("haritdev.sunrun", "sample.file.key",
                                         inputStream, objectMetadata);
                             PutObjectResult result =      amazonS3Client.putObject(putObjectRequest);
                             LOGGER.info("result - " + result.toString());
                             try {
                                 inputStream.close();
                             } catch (IOException e) {
    
                             }
                         }
                     }
             ).start();
         } catch (AmazonS3Exception e) {
             throw new PersistenceException("could not generate output stream for " + uniqueId, e);
         } catch (IOException e) {
             throw new PersistenceException("could not generate input stream for S3 for " + uniqueId, e);
         }
          try {
             return new GZIPOutputStream(outputStream);
         } catch (IOException e) {
             LOGGER.error(e.getMessage(), e);
             throw new PersistenceException("Failed to get output stream for " + uniqueId + ": " + e.getMessage(), e);
         }
     }
    

これをデバッグすると、しばらくしてプロセスが終了し、ドキュメントが書き込まれないことがわかります。この実装は間違っていますか?

4

0 に答える 0