Class S3MessageHandler

java.lang.Object
org.springframework.integration.context.IntegrationObjectSupport
org.springframework.integration.handler.MessageHandlerSupport
org.springframework.integration.handler.AbstractMessageHandler
org.springframework.integration.handler.AbstractMessageProducingHandler
org.springframework.integration.handler.AbstractReplyProducingMessageHandler
org.springframework.integration.aws.outbound.S3MessageHandler
All Implemented Interfaces:
org.reactivestreams.Subscriber<org.springframework.messaging.Message<?>>, org.springframework.beans.factory.Aware, org.springframework.beans.factory.BeanClassLoaderAware, org.springframework.beans.factory.BeanFactoryAware, org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.DisposableBean, org.springframework.beans.factory.InitializingBean, org.springframework.context.ApplicationContextAware, org.springframework.core.Ordered, org.springframework.integration.context.ExpressionCapable, org.springframework.integration.context.Orderable, org.springframework.integration.core.MessageProducer, org.springframework.integration.handler.HeaderPropagationAware, org.springframework.integration.IntegrationPattern, org.springframework.integration.support.context.NamedComponent, org.springframework.integration.support.management.IntegrationManagement, org.springframework.integration.support.management.TrackableComponent, org.springframework.messaging.MessageHandler, reactor.core.CoreSubscriber<org.springframework.messaging.Message<?>>

public class S3MessageHandler extends org.springframework.integration.handler.AbstractReplyProducingMessageHandler
The AbstractReplyProducingMessageHandler implementation for the Amazon S3 services.

The implementation is fully based on the TransferManager and support its upload, download and copy operations which can be determined by the provided or evaluated via SpEL expression at runtime S3MessageHandler.Command.

This AbstractReplyProducingMessageHandler can behave as a "one-way" (by default) or "request-reply" component according to the produceReply constructor argument.

The "one-way" behavior is also blocking, which is achieved with the Transfer.waitForException() invocation. Consider to use an async upstream hand off if this blocking behavior isn't appropriate.

The "request-reply" behavior is async and the Transfer result from the TransferManager operation is sent to the AbstractMessageProducingHandler.getOutputChannel(), assuming the transfer progress observation in the downstream flow.

The S3ProgressListener can be supplied to track the transfer progress. Also the listener can be populated into the returned Transfer afterwards in the downstream flow. If the context of the requestMessage is important in the progressChanged event, it is recommended to use a S3MessageHandler.MessageS3ProgressListener implementation instead. *

For the upload operation the S3MessageHandler.UploadMetadataProvider callback can be supplied to populate required ObjectMetadata options, as for a single entry, as well as for each file in directory to upload.

For the upload operation the objectAclExpression can be provided to AmazonS3.setObjectAcl(java.lang.String, java.lang.String, com.amazonaws.services.s3.model.AccessControlList) after the successful transfer. The supported SpEL result types are: AccessControlList or CannedAccessControlList.

For download operation the payload must be a File instance, representing a single file for downloaded content or directory to download all files from the S3 virtual directory.

An S3 Object key for upload and download can be determined by the provided keyExpression or the File.getName() is used directly. The former has precedence.

For copy operation all keyExpression, destinationBucketExpression and destinationKeyExpression are required and must not evaluate to null.

Author:
Artem Bilan, John Logan
See Also:
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static enum 
    static interface 
    An S3ProgressListener extension to provide a requestMessage context for the progressChanged event.
    static interface 
    The callback to populate an ObjectMetadata for upload operation.

    Nested classes/interfaces inherited from class org.springframework.integration.handler.AbstractReplyProducingMessageHandler

    org.springframework.integration.handler.AbstractReplyProducingMessageHandler.RequestHandler

    Nested classes/interfaces inherited from interface org.springframework.integration.support.management.IntegrationManagement

    org.springframework.integration.support.management.IntegrationManagement.ManagementOverrides
  • Field Summary

    Fields inherited from class org.springframework.integration.handler.AbstractMessageProducingHandler

    messagingTemplate

    Fields inherited from class org.springframework.integration.context.IntegrationObjectSupport

    EXPRESSION_PARSER, logger

    Fields inherited from interface org.springframework.integration.support.management.IntegrationManagement

    METER_PREFIX, RECEIVE_COUNTER_NAME, SEND_TIMER_NAME

    Fields inherited from interface org.springframework.core.Ordered

    HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
  • Constructor Summary

    Constructors
    Constructor
    Description
    S3MessageHandler(AmazonS3 amazonS3, String bucket)
     
    S3MessageHandler(AmazonS3 amazonS3, String bucket, boolean produceReply)
     
    S3MessageHandler(AmazonS3 amazonS3, org.springframework.expression.Expression bucketExpression)
     
    S3MessageHandler(AmazonS3 amazonS3, org.springframework.expression.Expression bucketExpression, boolean produceReply)
     
    S3MessageHandler(TransferManager transferManager, String bucket)
     
    S3MessageHandler(TransferManager transferManager, String bucket, boolean produceReply)
     
    S3MessageHandler(TransferManager transferManager, org.springframework.expression.Expression bucketExpression)
     
    S3MessageHandler(TransferManager transferManager, org.springframework.expression.Expression bucketExpression, boolean produceReply)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    protected void
     
    protected Object
    handleRequestMessage(org.springframework.messaging.Message<?> requestMessage)
     
    void
    Specify a S3MessageHandler.Command to perform against TransferManager.
    void
    setCommandExpression(org.springframework.expression.Expression commandExpression)
    The SpEL expression to evaluate the command to perform on TransferManager: upload, download or copy.
    void
    setDestinationBucketExpression(org.springframework.expression.Expression destinationBucketExpression)
    The SpEL expression to evaluate the target S3 bucket for copy operation.
    void
    setDestinationKeyExpression(org.springframework.expression.Expression destinationKeyExpression)
    The SpEL expression to evaluate the target S3 key for copy operation.
    void
    setKeyExpression(org.springframework.expression.Expression keyExpression)
    The SpEL expression to evaluate S3 object key at runtime against requestMessage.
    void
    setObjectAclExpression(org.springframework.expression.Expression objectAclExpression)
    The SpEL expression to evaluate S3 object ACL at runtime against requestMessage for the upload operation.
    void
    Specify a S3ProgressListener for upload and download operations.
    void
    setResourceIdResolver(io.awspring.cloud.core.env.ResourceIdResolver resourceIdResolver)
    Specify a ResourceIdResolver to resolve logical bucket names to physical resource ids.
    void
    Specify an ObjectMetadata callback to populate the metadata for upload operation, e.g.

    Methods inherited from class org.springframework.integration.handler.AbstractReplyProducingMessageHandler

    doInvokeAdvisedRequestHandler, getBeanClassLoader, getIntegrationPatternType, getRequiresReply, handleMessageInternal, hasAdviceChain, onInit, setAdviceChain, setBeanClassLoader, setRequiresReply

    Methods inherited from class org.springframework.integration.handler.AbstractMessageProducingHandler

    addNotPropagatedHeaders, createOutputMessage, getNotPropagatedHeaders, getOutputChannel, isAsync, messageBuilderForReply, produceOutput, resolveErrorChannel, sendErrorMessage, sendOutput, sendOutputs, setAsync, setNotPropagatedHeaders, setOutputChannel, setOutputChannelName, setSendTimeout, shouldCopyRequestHeaders, shouldSplitOutput, updateNotPropagatedHeaders

    Methods inherited from class org.springframework.integration.handler.AbstractMessageHandler

    handleMessage, onComplete, onError, onNext, onSubscribe

    Methods inherited from class org.springframework.integration.handler.MessageHandlerSupport

    buildSendTimer, destroy, getComponentType, getManagedName, getManagedType, getMetricsCaptor, getOrder, getOverrides, isLoggingEnabled, registerMetricsCaptor, sendTimer, setLoggingEnabled, setManagedName, setManagedType, setOrder, setShouldTrack, shouldTrack

    Methods inherited from class org.springframework.integration.context.IntegrationObjectSupport

    afterPropertiesSet, extractTypeIfPossible, generateId, getApplicationContext, getApplicationContextId, getBeanDescription, getBeanFactory, getBeanName, getChannelResolver, getComponentName, getConversionService, getExpression, getIntegrationProperties, getIntegrationProperty, getMessageBuilderFactory, getTaskScheduler, isInitialized, setApplicationContext, setBeanFactory, setBeanName, setChannelResolver, setComponentName, setConversionService, setMessageBuilderFactory, setPrimaryExpression, setTaskScheduler, toString

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

    Methods inherited from interface reactor.core.CoreSubscriber

    currentContext

    Methods inherited from interface org.springframework.integration.support.management.IntegrationManagement

    getThisAs

    Methods inherited from interface org.springframework.integration.support.context.NamedComponent

    getBeanName, getComponentName
  • Constructor Details

    • S3MessageHandler

      public S3MessageHandler(AmazonS3 amazonS3, String bucket)
    • S3MessageHandler

      public S3MessageHandler(AmazonS3 amazonS3, org.springframework.expression.Expression bucketExpression)
    • S3MessageHandler

      public S3MessageHandler(AmazonS3 amazonS3, String bucket, boolean produceReply)
    • S3MessageHandler

      public S3MessageHandler(AmazonS3 amazonS3, org.springframework.expression.Expression bucketExpression, boolean produceReply)
    • S3MessageHandler

      public S3MessageHandler(TransferManager transferManager, String bucket)
    • S3MessageHandler

      public S3MessageHandler(TransferManager transferManager, org.springframework.expression.Expression bucketExpression)
    • S3MessageHandler

      public S3MessageHandler(TransferManager transferManager, String bucket, boolean produceReply)
    • S3MessageHandler

      public S3MessageHandler(TransferManager transferManager, org.springframework.expression.Expression bucketExpression, boolean produceReply)
  • Method Details

    • setKeyExpression

      public void setKeyExpression(org.springframework.expression.Expression keyExpression)
      The SpEL expression to evaluate S3 object key at runtime against requestMessage.
      Parameters:
      keyExpression - the SpEL expression for S3 key.
    • setObjectAclExpression

      public void setObjectAclExpression(org.springframework.expression.Expression objectAclExpression)
      The SpEL expression to evaluate S3 object ACL at runtime against requestMessage for the upload operation.
      Parameters:
      objectAclExpression - the SpEL expression for S3 object ACL.
    • setCommand

      public void setCommand(S3MessageHandler.Command command)
      Specify a S3MessageHandler.Command to perform against TransferManager.
      Parameters:
      command - The S3MessageHandler.Command to use.
      See Also:
    • setCommandExpression

      public void setCommandExpression(org.springframework.expression.Expression commandExpression)
      The SpEL expression to evaluate the command to perform on TransferManager: upload, download or copy.
      Parameters:
      commandExpression - the SpEL expression to evaluate the TransferManager operation.
      See Also:
    • setDestinationBucketExpression

      public void setDestinationBucketExpression(org.springframework.expression.Expression destinationBucketExpression)
      The SpEL expression to evaluate the target S3 bucket for copy operation.
      Parameters:
      destinationBucketExpression - the SpEL expression for destination bucket.
      See Also:
    • setDestinationKeyExpression

      public void setDestinationKeyExpression(org.springframework.expression.Expression destinationKeyExpression)
      The SpEL expression to evaluate the target S3 key for copy operation.
      Parameters:
      destinationKeyExpression - the SpEL expression for destination key.
      See Also:
    • setProgressListener

      public void setProgressListener(S3ProgressListener s3ProgressListener)
      Specify a S3ProgressListener for upload and download operations.
      Parameters:
      s3ProgressListener - the S3ProgressListener to use.
      See Also:
    • setUploadMetadataProvider

      public void setUploadMetadataProvider(S3MessageHandler.UploadMetadataProvider uploadMetadataProvider)
      Specify an ObjectMetadata callback to populate the metadata for upload operation, e.g. Content-MD5, Content-Type or any other required options.
      Parameters:
      uploadMetadataProvider - the S3MessageHandler.UploadMetadataProvider to use for upload.
    • setResourceIdResolver

      public void setResourceIdResolver(io.awspring.cloud.core.env.ResourceIdResolver resourceIdResolver)
      Specify a ResourceIdResolver to resolve logical bucket names to physical resource ids.
      Parameters:
      resourceIdResolver - the ResourceIdResolver to use.
    • doInit

      protected void doInit()
      Overrides:
      doInit in class org.springframework.integration.handler.AbstractReplyProducingMessageHandler
    • handleRequestMessage

      protected Object handleRequestMessage(org.springframework.messaging.Message<?> requestMessage)
      Specified by:
      handleRequestMessage in class org.springframework.integration.handler.AbstractReplyProducingMessageHandler