2016-04-06 2 views
2

Я написал AWS Lambda Handler, как показано ниже:Как читать файл в AWS Lambda Функция, написанная на Java?

package com.lambda; 
import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.LambdaLogger; 
import com.amazonaws.services.lambda.runtime.RequestStreamHandler; 
import java.io.*; 

public class TestDetailsHandler implements RequestStreamHandler { 


    public void handleRequest(InputStream input,OutputStream output,Context context){ 

     // Get Lambda Logger 
     LambdaLogger logger = context.getLogger(); 

     // Receive the input from Inputstream throw exception if any 

     File starting = new File(System.getProperty("user.dir")); 
      System.out.println("Source Location" + starting); 

      File cityFile = new File(starting + "City.db"); 
     FileInputStream fis = null; 

     try { 
      fis = new FileInputStream(cityFile); 

      System.out.println("Total file size to read (in bytes) : " 
        + fis.available()); 

      int content; 
      while ((content = fis.read()) != -1) { 
       // convert to char and display it 
       System.out.print((char) content); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (fis != null) 
        fis.close(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 

} 

Его прочитать файл: City.db, доступный в папке ресурсов, даже я продолжал везде видеть ниже:

enter image description here

Но он показывает следующее сообщение об исполнении этого лямбда-функции:

START RequestId: 5216ea47-fc43-11e5-96d5-83c1dcdad75d Version: $LATEST 
Source Location/ 
java.io.FileNotFoundException: /city.db (No such file or directory) 
    at java.io.FileInputStream.open0(Native Method) 
    at java.io.FileInputStream.open(FileInputStream.java:195) 
    at java.io.FileInputStream.<init>(FileInputStream.java:138) 
    at com.lambda.TestDetailsHandler.handleRequest(TestDetailsHandler.java:26) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at lambdainternal.EventHandlerLoader$StreamMethodRequestHandler.handleRequest(EventHandlerLoader.java:511) 
    at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:972) 
    at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:231) 
    at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:59) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:348) 
    at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:93) 
END RequestId: 5216ea47-fc43-11e5-96d5-83c1dcdad75d 
REPORT RequestId: 5216ea47-fc43-11e5-96d5-83c1dcdad75d Duration: 58.02 ms Billed Duration: 100 ms  Memory Size: 1024 MB Max Memory Used: 50 MB 

enter image description here

Содержимое файла pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.lambda</groupId> 
    <artifactId>testdetails</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <name>test-handler</name> 

    <dependencies> 
     <dependency> 
      <groupId>com.amazonaws</groupId> 
      <artifactId>aws-lambda-java-core</artifactId> 
      <version>1.1.0</version> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.11</version> 
      <scope>test</scope> 
     </dependency> 



     </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <createDependencyReducedPom>false</createDependencyReducedPom> 
       </configuration> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Я использовал различные способы, чтобы сохранить файл здесь и там, но в конце ее не работает. Пожалуйста, дайте мне знать, что здесь не так?

Однако в моем другом проекте, где я сохранил файл xyz.properties в папке ресурсов и читал из файла PropertyManager, он работает нормально. Когда я тестировал его в своей системе, он отлично работает, но в функции AWS Lambda это не работает.

+0

Это дубликат вопроса, который вы задали всего несколько минут назад: http://stackoverflow.com/questions/36462933/how-to-read-s3-file-from-aws-lambda-function-written- in-java. Вы получили ответ в этом вопросе, но теперь вы отправили кучу кода, который не использует решение, которое вам было предоставлено. –

+0

@Mark. Это другой вопрос, предыдущий был связан с чтением файла с S3, этот вопрос связан с чтением файла в пакете JAR. –

+0

Извините, вы пытаетесь прочитать одно и то же имя файла, поэтому я подумал, что вы задаете тот же вопрос. –

ответ

4

я сделал следующие изменения в моем коде и теперь его работает отлично:

главно изменен две строки.

ClassLoader ClassLoader = GetClass() getClassLoader();

Файл cityFile = new Файл (classLoader.getResource ("City.db"). GetFile());

package com.lambda; 


import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.LambdaLogger; 
import com.amazonaws.services.lambda.runtime.RequestStreamHandler; 
import java.io.*; 

public class TestDetailsHandler implements RequestStreamHandler { 


    public void handleRequest(InputStream input,OutputStream output,Context context){ 

     // Get Lambda Logger 
     LambdaLogger logger = context.getLogger(); 

     // Receive the input from Inputstream throw exception if any 

     ClassLoader classLoader = getClass().getClassLoader(); 

     File cityFile = new File(classLoader.getResource("City.db").getFile()); 
     FileInputStream fis = null; 

     try { 
      fis = new FileInputStream(cityFile); 

      System.out.println("Total file size to read (in bytes) : " 
        + fis.available()); 

      int content; 
      while ((content = fis.read()) != -1) { 
       // convert to char and display it 
       System.out.print((char) content); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (fis != null) 
        fis.close(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 

enter image description here

+0

Вместо этого используйте getaresourceAsStream(). Вам не нужно преобразовывать его в файл, который может не работать во всех случаях. – eckes

1

Это, как я это сделал, скажем, это то, как ваша структура проекта выглядит -

enter image description here

И вы хотите, чтобы прочитать файл конфигурации .properties, который находится в каталоге project-dir/resources.

код для чтения содержимого файла будет -

InputStream input = null; 
try { 
    Path path = Paths.get(PropertyUtility.class.getResource("/").toURI()); 

    // The path for config file in Lambda Instance - 
    String resourceLoc = path + "/resources/config.properties"; 

    input = new FileInputStream(resourceLoc); 
} catch(Exception e) { 
    // Do whatever 
} 

Если вы следуете этой структуры проекта и с помощью этого кода, то он будет работать в AWS Lambda.

PropertyUtility - это только класс полезности, который я создал для чтения содержимого конфигурационного файла. Класс PropertyUtility выглядит так -

enter image description here

Как вы можете видеть в коде выше, путь к файлу конфигурации отличается в локальной системе и в лямбда-Instance.

В вашей локальной машине, PropertyUtility.class.getResource («/») указывает на бин, поэтому вы должны сделать path.getParent(), чтобы указать его на проект-каталог который является HelloLambda в этом примере.

Для экземпляра Lambda, PropertyUtility.class.getResource ("/") указывает непосредственно на каталог проекта.

0

Если файл в файл в каталоге ресурсов, то следующее решение должно работать:

String fileName = "resources/config.json"; 

Path path = Paths.get(this.getClass().getResource("/").toURI()); 
Path resourceLocation = path.resolve(fileName); 

try(InputStream configStream = Files.newInputStream(resourceLocation)) { 
      //use your file stream as you need. 
} 

Здесь самая важная часть «ресурсы/config.json», он не должен быть «/ ресурсы/config.json ", потому что расположение файла - /var/task/resources/config.json в lambda, я проверил.

Надеюсь, это поможет тем, кто все еще сталкивается с проблемой при чтении файла в aws лямбда.

Смежные вопросы