3

我能够使用关键的REDIS和RABBITMQ服务。绑定服务时,我能够获取凭证并在我的应用程序中使用该凭证.properties为spring启动项目。在Spring引导应用程序中使用关键云代工redis和rabbitmq服务作为vcap服务

但我使用的这种配置在应用程序中是硬编码的。属性 要动态配置此配置,我们才知道我们可以使用由关键提供的vcap服务。

所以想要使用redis和rabbimq的运行时凭证。

我的代码仅供参考。

application.propeties

rabbitmq.host=hostname 
rabbitmq.virtual-host=vhostanme 
rabbitmq.username=username 
rabbitmq.password=password 
rabbit.mainqueue=abhi 
rabbit.errorqueue=abc 
redis.host=redishostname 
redis.port=port 
redis.password=password 

我的配置类:

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Component; 

@Component 
public class Config { 


    static String rabbitMqHost; 
    static String rabbitMqVHost; 
    static String rabbitMqUsername; 
    static String rabbitMqPassword; 
    static String rabbitMqMainQueue; 
    static String rabbitMqErrorQueue; 
    static String redisHost; 
    static int redisPort; 
    static String redisPassword; 


    Config() { 
    } 


    public static String getRedisHost() { 
     return redisHost; 
    } 

    public static void setRedisHost(String redisHost) { 
     Config.redisHost = redisHost; 
    } 

    public static int getRedisPort() { 
     return redisPort; 
    } 

    public static void setRedisPort(int redisPort) { 
     Config.redisPort = redisPort; 
    } 

    public static String getRedisPassword() { 
     return redisPassword; 
    } 

    public static void setRedisPassword(String redisPassword) { 
     Config.redisPassword = redisPassword; 
    } 

    public static String getRabbitMqMainQueue() { 
     return rabbitMqMainQueue; 
    } 

    public static void setRabbitMqMainQueue(String rabbitMqMainQueue) { 
     Config.rabbitMqMainQueue = rabbitMqMainQueue; 
    } 

    public static String getRabbitMqErrorQueue() { 
     return rabbitMqErrorQueue; 
    } 

    public static void setRabbitMqErrorQueue(String rabbitMqErrorQueue) { 
     Config.rabbitMqErrorQueue = rabbitMqErrorQueue; 
    } 

    public static String getRabbitMqHost() { 
     return rabbitMqHost; 
    } 

    public static void setRabbitMqHost(String rabbitMqHost) { 
     Config.rabbitMqHost = rabbitMqHost; 
    } 

    public static String getRabbitMqVHost() { 
     return rabbitMqVHost; 
    } 

    public static void setRabbitMqVHost(String rabbitMqVHost) { 
     Config.rabbitMqVHost = rabbitMqVHost; 
    } 

    public static String getRabbitMqUsername() { 
     return rabbitMqUsername; 
    } 

    public static void setRabbitMqUsername(String rabbitMqUsername) { 
     Config.rabbitMqUsername = rabbitMqUsername; 
    } 

    public static String getRabbitMqPassword() { 
     return rabbitMqPassword; 
    } 

    public static void setRabbitMqPassword(String rabbitMqPassword) { 
     Config.rabbitMqPassword = rabbitMqPassword; 
    } 

    @Value("${rabbitmq.host}") 
    public void setRabbitMqHosts(String url) { 
     setRabbitMqHost(url); 
    } 

    @Value("${rabbitmq.virtual-host}") 
    public void setRabbitMqVHosts(String url) { 
     setRabbitMqVHost(url); 
    } 

    @Value("${rabbitmq.username}") 
    public void setRabbitUsernames(String url) { 
     setRabbitMqUsername(url); 
    } 

    @Value("${rabbitmq.password}") 
    public void setRabbitPasswords(String url) { 
     setRabbitMqPassword(url); 
    } 

    @Value("${rabbit.mainqueue}") 
    public void setRabbitMainQueues(String url) { 
     setRabbitMqMainQueue(url); 
    } 

    @Value("${rabbit.errorqueue}") 
    public void setRabbitErrorQueues(String url) { 
     setRabbitMqErrorQueue(url); 
    } 

    @Value("${redis.host}") 
    public void setRedisHosts(String url) { 
     setRedisHost(url); 
    } 

    @Value("${redis.port}") 
    public void setRedisPorts(int url) { 
     setRedisPort(url); 
    } 
    @Value("${redis.password}") 
    public void setRedisPasswords(String url) { 
     setRedisPassword(url); 
    } 
} 

中,我使用的Conguration从RabbitMQ的JMS队列取消息,并保存我的MessagesConsumer类的Redis:

import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 

import javax.annotation.PostConstruct; 
import javax.jms.ConnectionFactory; 
import javax.jms.Message; 
import javax.jms.MessageConsumer; 
import javax.jms.Session; 

import org.json.JSONObject; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.jms.core.JmsTemplate; 
import org.springframework.scheduling.annotation.Scheduled; 
import org.springframework.stereotype.Component; 

import com.es.consumer.config.Config; 
import com.rabbitmq.jms.admin.RMQConnectionFactory; 

import redis.clients.jedis.Jedis; 
import redis.clients.jedis.JedisShardInfo; 

@Component 
public class MessagesConsumer { 
    @Autowired 
    JmsTemplate jmsTemplate; 
    final Logger logger = LoggerFactory.getLogger(MessagesConsumer.class); 

    Jedis jedis; 

    JedisShardInfo shardInfo; 

    @PostConstruct 
    public void init() { 

     shardInfo = new JedisShardInfo(Config.getRedisHost(), Config.getRedisPort()); 
     shardInfo.setPassword(Config.getRedisPassword()); 
     jedis = new Jedis(shardInfo); 
     jedis.connect(); 
     jedis.select(2); 

    } 

    @Bean 
    ConnectionFactory connectionFactory() { 

     RMQConnectionFactory connectionFactory = new RMQConnectionFactory(); 
     connectionFactory.setUsername(Config.getRabbitMqUsername()); 
     connectionFactory.setPassword(Config.getRabbitMqPassword()); 
     connectionFactory.setVirtualHost(Config.getRabbitMqVHost()); 
     connectionFactory.setHost(Config.getRabbitMqHost()); 
     return connectionFactory; 

    } 

    @SuppressWarnings("rawtypes") 
    @Scheduled(fixedRate = 1) 
    public void readQueueAndSaveData() { 
// take message process it and save to redis as hmset 

}} 

任何帮助将是可观的。

回答

1

有两种方法可以做到这一点。 1)从application.properties中删除所有属性,并编写一个配置bean,为您创建RedisTemplate和RabbitTemplate bean。这些工厂所需的属性将从VCAP_SERVICES获得。在CF上,VCAP_SERVICES env变量将具有绑定到应用程序的服务信息。当你用应用程序,redis,rabbit服务绑定到你的空间时,它们的属性在VCAP_SERVICES中可用。因此,只需在代码中执行System.getEnv("VCAP_SERVICES"),然后解析json以获取服务详细信息以创建模板。

2)从application.properties中删除属性,并使用spring云连接器。 Spring云有一个名为Spring云连接器的子项目,提供连接各种云服务的实用程序。

http://cloud.spring.io/spring-cloud-connectors/spring-cloud-spring-service-connector.html#_rabbitmq 

只要你需要定义延伸AbstractCloudConfig如下

class CloudConfig extends AbstractCloudConfig { 
    @Bean 
    public RabbitConnectionFactory rabbitFactory() { 
     return connectionFactory().rabbitConnectionFactory("rabbit-servicename"); 
    } 

    @Bean 
    public RedisConnectionFactory redisFactory() { 
     return connectionFactory().redisConnectionFactory("redis-servicename"); 
    } 
} 

第二种方法是,如果你使用Spring者优先类,因为这需要非常少的编码,可以切换到不同云提供商没有太多的努力。

+0

我可以得到@Bean的依赖关系 public RabbitConnectionFactory rabbitFactory(){ return connectionFactory()。rabbitConnectionFactory(“rabbit-servicename”); } 我试图这样做的依赖关系是: \t \t \t org.springframework.amqp \t \t \t 弹簧兔 \t \t \t 1.6.8。RELEASE \t \t

+0

但我想使用HMSET将数据保存为redis但我认为redis模板不支持hmset。 –

+0

使用的依赖关系。 org.springframework.cloud 弹簧云cloudfoundry连接器 RedisTemplate可以支持HMSET。我不确定,也没有尝试,但看看这个链接。 http://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/connection/RedisHashCommands.html#hMSet-byte:A-java.util.Map- –

相关问题