# AWS S3 - Consumer Examples

[Back to AWS S3 Component](../aws2-s3-component.md)

## MoveAfterRead consumer option

In addition to deleteAfterRead, it has been added another option, moveAfterRead. With this option enabled, the consumed object will be moved to a target destinationBucket instead of being only deleted. This will require specifying the destinationBucket option. As example:

-   Java
    
-   XML
    
-   YAML
    

```java
  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket")
  .to("mock:result");
```

```xml
<route>
    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;moveAfterRead=true&amp;destinationBucket=myothercamelbucket"/>
    <to uri="mock:result"/>
</route>
```

```yaml
- route:
    from:
      uri: aws2-s3://mycamelbucket
      parameters:
        amazonS3Client: "#amazonS3Client"
        moveAfterRead: true
        destinationBucket: myothercamelbucket
      steps:
        - to:
            uri: mock:result
```

In this case, the objects consumed will be moved to _myothercamelbucket_ bucket and deleted from the original one (because of deleteAfterRead set to true as default).

You have also the possibility of using a key prefix/suffix while moving the file to a different bucket. The options are `destinationBucketPrefix` and `destinationBucketSuffix`.

Both options support the [Simple](../languages/simple-language.md) expression language. Wrap an expression in `RAW()` to prevent the Camel URI parser from interpreting special characters:

-   Java
    
-   XML
    
-   YAML
    

```java
from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket&destinationBucketPrefix=RAW(pre-)&destinationBucketSuffix=RAW(-suff)")
    .to("mock:result");
```

```xml
<route>
  <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;moveAfterRead=true&amp;destinationBucket=myothercamelbucket&amp;destinationBucketPrefix=RAW(pre-)&amp;destinationBucketSuffix=RAW(-suff)"/>
  <to uri="mock:result"/>
</route>
```

```yaml
- route:
    from:
      uri: aws2-s3://mycamelbucket
      parameters:
        amazonS3Client: "#amazonS3Client"
        moveAfterRead: true
        destinationBucket: myothercamelbucket
        destinationBucketPrefix: "RAW(pre-)"
        destinationBucketSuffix: "RAW(-suff)"
      steps:
        - to:
            uri: mock:result
```

In this case, an object named `test` is moved to `myothercamelbucket` with the key `pre-test-suff`.

Using a Simple expression, you can build dynamic paths at runtime. The following example organises moved objects by date:

-   Java
    
-   XML
    
-   YAML
    

```java
from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&moveAfterRead=true&destinationBucket=myothercamelbucket&destinationBucketPrefix=RAW(${date:now:yyyy/MM/dd}/)")
    .to("mock:result");
```

```xml
<route>
  <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;moveAfterRead=true&amp;destinationBucket=myothercamelbucket&amp;destinationBucketPrefix=RAW(${date:now:yyyy/MM/dd}/)"/>
  <to uri="mock:result"/>
</route>
```

```yaml
- route:
    from:
      uri: aws2-s3://mycamelbucket
      parameters:
        amazonS3Client: "#amazonS3Client"
        moveAfterRead: true
        destinationBucket: myothercamelbucket
        destinationBucketPrefix: "RAW(${date:now:yyyy/MM/dd}/)"
      steps:
        - to:
            uri: mock:result
```

An object named `report.csv` consumed on 2026-05-19 is moved with the key `2026/05/19/report.csv`. Expressions are evaluated once per exchange, so each message can produce a different destination key.

## Additional Consumer Examples

## Consumer with prefix filtering

You can configure the consumer to only process objects with a specific prefix:

-   Java
    
-   XML
    
-   YAML
    

```java
  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&prefix=processed/&delay=30000")
  .to("mock:result");
```

```xml
<route>
    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;prefix=processed/&amp;delay=30000"/>
    <to uri="mock:result"/>
</route>
```

```yaml
- route:
    from:
      uri: aws2-s3://mycamelbucket
      parameters:
        amazonS3Client: "#amazonS3Client"
        prefix: processed/
        delay: 30000
      steps:
        - to:
            uri: mock:result
```

This will only consume objects that start with "processed/" prefix from the _mycamelbucket_ bucket, with a 30-second polling delay.

## Consumer with custom polling and batch settings

Configure custom polling intervals and batch sizes:

-   Java
    
-   XML
    
-   YAML
    

```java
  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&delay=60000&maxMessagesPerPoll=5&includeBody=false")
  .to("mock:result");
```

```xml
<route>
    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;delay=60000&amp;maxMessagesPerPoll=5&amp;includeBody=false"/>
    <to uri="mock:result"/>
</route>
```

```yaml
- route:
    from:
      uri: aws2-s3://mycamelbucket
      parameters:
        amazonS3Client: "#amazonS3Client"
        delay: 60000
        maxMessagesPerPoll: 5
        includeBody: false
      steps:
        - to:
            uri: mock:result
```

This consumer polls every 60 seconds, processes up to 5 objects per poll, and puts the stream of the object in the body instead of reading it into a byte array. Use `ignoreBody: true` to get only the metadata.

## Consumer with file filtering and no deletion

Configure the consumer to not delete files after reading and include specific file patterns:

-   Java
    
-   XML
    
-   YAML
    

```java
  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&deleteAfterRead=false&fileName=*.pdf")
  .to("mock:result");
```

```xml
<route>
    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;deleteAfterRead=false&amp;fileName=*.pdf"/>
    <to uri="mock:result"/>
</route>
```

```yaml
- route:
    from:
      uri: aws2-s3://mycamelbucket
      parameters:
        amazonS3Client: "#amazonS3Client"
        deleteAfterRead: false
        fileName: "*.pdf"
      steps:
        - to:
            uri: mock:result
```

This consumer will read PDF files but won’t delete them after processing.

## Consumer with done file pattern

Use a done file pattern to ensure files are completely uploaded before processing:

-   Java
    
-   XML
    
-   YAML
    

```java
  from("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&doneFileName=*.done")
  .to("mock:result");
```

```xml
<route>
    <from uri="aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&amp;doneFileName=*.done"/>
    <to uri="mock:result"/>
</route>
```

```yaml
- route:
    from:
      uri: aws2-s3://mycamelbucket
      parameters:
        amazonS3Client: "#amazonS3Client"
        doneFileName: "*.done"
      steps:
        - to:
            uri: mock:result
```

This consumer will only process files when a corresponding .done file exists in the bucket.