Spring Integration

org.springframework.integration.redis.outbound
Class RedisStoreWritingMessageHandler

java.lang.Object
  extended by org.springframework.integration.context.IntegrationObjectSupport
      extended by org.springframework.integration.handler.AbstractMessageHandler
          extended by org.springframework.integration.redis.outbound.RedisStoreWritingMessageHandler
All Implemented Interfaces:
org.springframework.beans.factory.Aware, org.springframework.beans.factory.BeanFactoryAware, org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.InitializingBean, org.springframework.core.Ordered, NamedComponent, Orderable, MessageHandler, TrackableComponent

public class RedisStoreWritingMessageHandler
extends AbstractMessageHandler

Implementation of MessageHandler which writes Message data into a Redis store identified by a key String. It supports the collection types identified by RedisCollectionFactoryBean.CollectionType. It supports batch updates or single item entry. "Batch updates" means that the payload of the Message may be a Map or Collection. With such a payload, individual items from it are added to the corresponding Redis store. See handleMessageInternal(Message) for more details. You can instead choose to persist such a payload as a single item if the extractPayloadElements property is set to false (default is true).

Since:
2.2
Author:
Oleg Zhurakousky, Gary Russell, Mark Fisher

Field Summary
 
Fields inherited from interface org.springframework.core.Ordered
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
 
Constructor Summary
RedisStoreWritingMessageHandler(org.springframework.data.redis.connection.RedisConnectionFactory connectionFactory)
          Constructs an instance using the provided RedisConnectionFactory.
RedisStoreWritingMessageHandler(org.springframework.data.redis.core.RedisTemplate<java.lang.String,?> redisTemplate)
          Constructs an instance using the provided RedisTemplate.
 
Method Summary
 java.lang.String getComponentType()
          Subclasses may implement this method to provide component type information.
protected  void handleMessageInternal(Message<?> message)
          Will extract the payload from the Message and store it in the collection identified by the key (which may be determined by an expression).
protected  void onInit()
          Subclasses may implement this for initialization logic.
 void setCollectionType(org.springframework.data.redis.support.collections.RedisCollectionFactoryBean.CollectionType collectionType)
          Sets the collection type for this handler as per RedisCollectionFactoryBean.CollectionType.
 void setExtractPayloadElements(boolean extractPayloadElements)
          Sets the flag signifying that if the payload is a "multivalue" (i.e., Collection or Map), it should be saved using addAll/putAll semantics.
 void setKey(java.lang.String key)
          Specifies the key for the Redis store.
 void setKeyExpression(org.springframework.expression.Expression keyExpression)
          Specifies a SpEL Expression to be used to determine the key for the Redis store.
 void setMapKeyExpression(org.springframework.expression.Expression mapKeyExpression)
          Sets the expression used as the key for Map and Properties entries.
 
Methods inherited from class org.springframework.integration.handler.AbstractMessageHandler
getOrder, handleMessage, setOrder, setShouldTrack
 
Methods inherited from class org.springframework.integration.context.IntegrationObjectSupport
afterPropertiesSet, getBeanFactory, getComponentName, getConversionService, getTaskScheduler, setBeanFactory, setBeanName, setComponentName, setConversionService, setTaskScheduler, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.springframework.integration.context.NamedComponent
getComponentName
 

Constructor Detail

RedisStoreWritingMessageHandler

public RedisStoreWritingMessageHandler(org.springframework.data.redis.core.RedisTemplate<java.lang.String,?> redisTemplate)
Constructs an instance using the provided RedisTemplate. The RedisTemplate must be fully initialized.

Parameters:
redisTemplate -

RedisStoreWritingMessageHandler

public RedisStoreWritingMessageHandler(org.springframework.data.redis.connection.RedisConnectionFactory connectionFactory)
Constructs an instance using the provided RedisConnectionFactory. It will use either a StringRedisTemplate if extractPayloadElements is true (default) or a RedisTemplate with StringRedisSerializers for keys and hash keys and JdkSerializationRedisSerializers for values and hash values, when it is false.

Parameters:
connectionFactory -
See Also:
setExtractPayloadElements(boolean)
Method Detail

setKey

public void setKey(java.lang.String key)
Specifies the key for the Redis store. If an expression is needed, then call setKeyExpression(Expression) instead of this method (they are mutually exclusive). If neither setter is called, the default expression will be 'headers.RedisHeaders.KEY'.

Parameters:
key -
See Also:
setKeyExpression(Expression)

setKeyExpression

public void setKeyExpression(org.springframework.expression.Expression keyExpression)
Specifies a SpEL Expression to be used to determine the key for the Redis store. If an expression is not needed, then a literal value may be passed to the setKey(String) method instead of this one (they are mutually exclusive). If neither setter is called, the default expression will be 'headers.RedisHeaders.KEY'.

Parameters:
keyExpression -
See Also:
setKey(String)

setCollectionType

public void setCollectionType(org.springframework.data.redis.support.collections.RedisCollectionFactoryBean.CollectionType collectionType)
Sets the collection type for this handler as per RedisCollectionFactoryBean.CollectionType.

Parameters:
collectionType -

setExtractPayloadElements

public void setExtractPayloadElements(boolean extractPayloadElements)
Sets the flag signifying that if the payload is a "multivalue" (i.e., Collection or Map), it should be saved using addAll/putAll semantics. Default is 'true'. If set to 'false' the payload will be saved as a single entry regardless of its type. If the payload is not an instance of "multivalue" (i.e., Collection or Map), the value of this attribute is meaningless as the payload will always be stored as a single entry.

Parameters:
extractPayloadElements -

setMapKeyExpression

public void setMapKeyExpression(org.springframework.expression.Expression mapKeyExpression)
Sets the expression used as the key for Map and Properties entries. Default is 'headers.RedisHeaders.MAP_KEY'

Parameters:
mapKeyExpression -

getComponentType

public java.lang.String getComponentType()
Description copied from class: IntegrationObjectSupport
Subclasses may implement this method to provide component type information.

Specified by:
getComponentType in interface NamedComponent
Overrides:
getComponentType in class AbstractMessageHandler

onInit

protected void onInit()
               throws java.lang.Exception
Description copied from class: IntegrationObjectSupport
Subclasses may implement this for initialization logic.

Overrides:
onInit in class IntegrationObjectSupport
Throws:
java.lang.Exception

handleMessageInternal

protected void handleMessageInternal(Message<?> message)
                              throws java.lang.Exception
Will extract the payload from the Message and store it in the collection identified by the key (which may be determined by an expression). The type of collection is specified by the collectionType property. The default CollectionType is LIST.

The rules for storing the payload are:

LIST/SET If the payload is of type Collection and extractPayloadElements is 'true' (default), the payload will be added using the addAll() method. If extractPayloadElements is set to 'false', then regardless of the payload type, the payload will be added using add().

ZSET In addition to the rules described for LIST/SET, ZSET allows 'score' information to be provided. The score can be provided using the RedisHeaders.ZSET_SCORE message header when the payload is not a Map, or by sending a Map as the payload where each Map 'key' is a value to be saved and each corresponding Map 'value' is the score assigned to it. If extractPayloadElements is set to 'false' the map will be stored as a single entry. If the 'score' can not be determined, the default value (1) will be used.

MAP/PROPERTIES You can also add items to a Map or Properties based store. If the payload itself is of type Map or Properties, it can be stored either as a batch or single item following the same rules as described above for other collection types. If the payload itself needs to be stored as a value of the map/property then the map key must be specified via the mapKeyExpression (default RedisHeaders.MAP_KEY Message header).

Specified by:
handleMessageInternal in class AbstractMessageHandler
Throws:
java.lang.Exception

Spring Integration