/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.redis;
import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriParams;
import org.apache.camel.spi.UriPath;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
@UriParams
public class RedisConfiguration {
private boolean managedListenerContainer;
private boolean managedConnectionFactory;
@UriPath @Metadata(required = "true")
private String host;
@UriPath @Metadata(required = "true")
private Integer port;
@UriParam(defaultValue = "SET")
private Command command = Command.SET;
@UriParam
private String channels;
@UriParam
private RedisTemplate redisTemplate;
@UriParam(label = "consumer,advanced")
private RedisMessageListenerContainer listenerContainer;
@UriParam
private RedisConnectionFactory connectionFactory;
@UriParam
private RedisSerializer serializer;
public Command getCommand() {
return command;
}
/**
* Default command, which can be overridden by message header.
* <p/>
* Notice the consumer only supports the following commands: PSUBSCRIBE and SUBSCRIBE
*/
public void setCommand(Command command) {
this.command = command;
}
public Integer getPort() {
return port;
}
/**
* Redis server port number
*/
public void setPort(Integer port) {
this.port = port;
}
public String getHost() {
return host;
}
/**
* The host where Redis server is running.
*/
public void setHost(String host) {
this.host = host;
}
public RedisTemplate getRedisTemplate() {
return redisTemplate != null ? redisTemplate : createDefaultTemplate();
}
/**
* Reference to a pre-configured RedisTemplate instance to use.
*/
public void setRedisTemplate(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
public RedisMessageListenerContainer getListenerContainer() {
return listenerContainer != null ? listenerContainer : createDefaultListenerContainer();
}
/**
* Reference to a pre-configured RedisMessageListenerContainer instance to use.
*/
public void setListenerContainer(RedisMessageListenerContainer listenerContainer) {
this.listenerContainer = listenerContainer;
}
public String getChannels() {
return channels;
}
/**
* List of topic names or name patterns to subscribe to. Multiple names can be separated by comma.
*/
public void setChannels(String channels) {
this.channels = channels;
}
/**
* Reference to a pre-configured RedisConnectionFactory instance to use.
*/
public void setConnectionFactory(RedisConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
public RedisConnectionFactory getConnectionFactory() {
return connectionFactory != null ? connectionFactory : createDefaultConnectionFactory();
}
public RedisSerializer getSerializer() {
return serializer != null ? serializer : createDefaultSerializer();
}
/**
* Reference to a pre-configured RedisSerializer instance to use.
*/
public void setSerializer(RedisSerializer serializer) {
this.serializer = serializer;
}
private RedisConnectionFactory createDefaultConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
managedConnectionFactory = true;
if (host != null) {
jedisConnectionFactory.setHostName(host);
}
if (port != null) {
jedisConnectionFactory.setPort(port);
}
jedisConnectionFactory.afterPropertiesSet();
connectionFactory = jedisConnectionFactory;
return jedisConnectionFactory;
}
private RedisTemplate createDefaultTemplate() {
redisTemplate = new RedisTemplate();
redisTemplate.setDefaultSerializer(getSerializer());
redisTemplate.setConnectionFactory(getConnectionFactory());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
private RedisMessageListenerContainer createDefaultListenerContainer() {
listenerContainer = new RedisMessageListenerContainer();
managedListenerContainer = true;
listenerContainer.setConnectionFactory(getConnectionFactory());
listenerContainer.afterPropertiesSet();
listenerContainer.start();
return listenerContainer;
}
private RedisSerializer createDefaultSerializer() {
serializer = new JdkSerializationRedisSerializer();
return serializer;
}
public void stop() throws Exception {
if (managedConnectionFactory) {
((JedisConnectionFactory)connectionFactory).destroy();
}
if (managedListenerContainer) {
listenerContainer.destroy();
}
}
}