【问题标题】:Java REST - call method after POST to RESTJava REST - POST 到 REST 后调用方法
【发布时间】:2014-09-11 04:52:12
【问题描述】:

我正在使用 Java REST 服务进行文件上传。 该文件应该登陆我的服务器,然后移动到 Amazon S3 存储桶。

上传到服务器没问题,但是第二次调用另一个方法不起作用。 我假设是因为存在超时问题?

将文件移动到亚马逊的代码在另一个应用程序中工作,但我无法让它在我的 REST 项目中工作。

方法如下:

     @POST
     @Path("/upload")
     @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(@FormDataParam("file") InputStream inputStream,
               @FormDataParam("file") FormDataContentDisposition file,    @FormDataParam("filename") String filename){

    Logger log = Logger.getLogger("Mike");


    String response = "";
    File f = null;
      try {
       final String FILE_DESTINATION = "C://uploads//" + file.getFileName();
       f = new File(FILE_DESTINATION);
       OutputStream outputStream = new FileOutputStream(f);
       int size = 0;
       byte[] bytes = new byte[1024];
       while ((size = inputStream.read(bytes)) != -1) {
        outputStream.write(bytes, 0, size);
       }
       outputStream.flush();
       outputStream.close();

       log.info("upload complete for initial file!");
       //move file to Amazon S3 Bucket.
       AmazonS3 s3 = new AmazonS3Client(
                new ClasspathPropertiesFileCredentialsProvider());

       log.info("trying put request");
       PutObjectRequest request = new PutObjectRequest("site.address.org","/pdf/PDF_Web_Service/work/"+f.getName(),f);
        log.info(f.getName());
        log.info(f.getAbsolutePath());

        s3.putObject(request);
        log.info("put request complete");

       response = "File uploaded " + FILE_DESTINATION;
      } catch (Exception e) {
       e.printStackTrace();
      }




      return Response.status(200).entity(response).build();
     }

具体来说,这是不工作的部分。我也没有收到任何日志信息:

//move file to Amazon S3 Bucket.
     AmazonS3 s3 = new AmazonS3Client(
              new ClasspathPropertiesFileCredentialsProvider());

     log.info("trying put request");
     PutObjectRequest request = new PutObjectRequest("site.address.org","/pdf/PDF_Web_Service/work/"+f.getName(),f);
      log.info(f.getName());          log.info(f.getAbsolutePath());
                  s3.putObject(request);          log.info("put request complete");

【问题讨论】:

  • “我认为是因为存在超时问题?”您为什么不捕获 http 响应代码,以便您知道这是否是问题
  • @Humdinger 我对 REST 有点陌生。在我的代码中,我明确将响应代码设置为 200。如何获得“自然”响应代码?
  • 当你超时时,你永远不会进入return语句。 Java 自动设置超时代码 (504) 并返回它。如果你得到一个 200 的回报,这意味着你得到了回报声明,超时不是你的问题。

标签: java web-services rest amazon-web-services


【解决方案1】:

迈克尔,

如果是超时问题,通常的做法是使用 guava 的 Listenable Future 将您的任务链接在一起。你的网络序列会是什么样子:

a) 客户端发送文件

b) 一旦文件上传完成,服务器就会响应 200。

c) 服务器加载完文件后,chain 以后再上传到 S3。

链接可侦听的futures是一种常见的做法,用于分离功能并通过分解代码并基本上对其进行管道化来确保不会发生超时。

如果您有任何问题,请告诉我!

【讨论】:

    【解决方案2】:

    我将亚马逊代码移到了 try 块中,现在它可以工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多