首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在VaultPropertySource的Spring Vault配置中使用Spring Retry?

如何在VaultPropertySource的Spring Vault配置中使用Spring Retry?
EN

Stack Overflow用户
提问于 2017-12-30 22:55:30
回答 1查看 1.8K关注 0票数 2

我希望标记为VaultPropertySource的spring-vault配置能够在请求失败时重试对vault的请求。我应该将什么标记为可重试?我正在使用Spring-Retry,并且我正在查看http://www.baeldung.com/spring-retry

没有可标记为可重试的可见方法。我是否应该更改vaultTemplate的实现并将vaultOperations标记为可重试?

ProvisioningSecrets.java

代码语言:javascript
复制
    @Configuration
    @VaultPropertySource(
            value="secret/provisioning",
            propertyNamePrefix = "provisioning.",
            renewal = Renewal.RENEW
            )
    @EnableRetry
    @Lazy
    @Profile("!test")
    public class ProvisioningSecrets {
        private static final Logger logger = LoggerFactory.getLogger(ProvisioningSecrets.class);

        @Autowired
        public void setPassword(@Value("${provisioning.password}") final String password) throws Exception {
            logger.info("We successfully set the provisioning db password.");
            EnvVars.changeSetting(Setting.PROVISIONING_PASS, password);
        }

        @Autowired
        public void setHost(@Value("${provisioning.host}") final String host) throws Exception {
            logger.info("We successfully set the provisioning db host.");
            EnvVars.changeSetting(Setting.PROVISIONING_HOST, host);
        }

        @Autowired
        public void setPort(@Value("${provisioning.port}") final int port) throws Exception {
            logger.info("We successfully set the provisioning db port.");
            EnvVars.changeSetting(Setting.PROVISIONING_PORT, Integer.toString(port));
        }

        @Autowired
        public void setUsername(@Value("${provisioning.username}") final String username) throws Exception {
            logger.info("We successfully set the provisioning db username.");
            EnvVars.changeSetting(Setting.PROVISIONING_USER, username);
        }

        @Autowired
        public void setDbName(@Value("${provisioning.name}") final String name) throws Exception {
            logger.info("We successfully set the provisioning db name.");
            EnvVars.changeSetting(Setting.PROVISIONING_DB_NAME, name);
        }
    }

VaultConfiguration.java

代码语言:javascript
复制
@Configuration
@Profile("!test")
public class VaultConfiguration extends AbstractVaultConfiguration {

    private static final Logger logger = LoggerFactory.getLogger(VaultConfiguration.class);

    private URI vaultHost;

    private String vaultToken;

    /**
     * Configure the Client Authentication.
     *
     * @return A configured ClientAuthentication Object.
     * @see ClientAuthentication
     */
    @Override
    public ClientAuthentication clientAuthentication() {
        // testing out environment variable value injection
        logger.debug("Vault Token configuration done.");
        return new TokenAuthentication(vaultToken);
    }

    @Override
    @Bean
    @DependsOn("vaultToken")
    public SessionManager sessionManager() {
        return super.sessionManager();
    }

    @Override
    public SslConfiguration sslConfiguration() {
        logger.info("Configuring Vault SSL with NONE.");
        return SslConfiguration.NONE;
    }

    /**
     * Specify an endpoint for connecting to Vault.
     *
     * @return A configured VaultEndpoint.
     * @see VaultEndpoint
     */
    @Override
    public VaultEndpoint vaultEndpoint() {
        logger.debug("Vault Host:" + vaultHost.toString());

        if (vaultHost.toString().isEmpty()) {
            logger.info("Creating default Vault Endpoint.");
            return new VaultEndpoint();
        }

        logger.info("Creating Vault Endpoint based on address: " + vaultHost.toString());
        final VaultEndpoint endpoint = VaultEndpoint.from(vaultHost);
        logger.info("Created Vault Endpoint: " + endpoint.toString());

        return endpoint;
    }

    @Bean("vaultHost")
    public URI vaultHost(@Value("${spring.vault.host}") final URI vaultHost) {
        this.vaultHost = vaultHost;
        return vaultHost;
    }

    @Override
    @Bean
    @DependsOn("vaultHost")
    public VaultTemplate vaultTemplate() {
        return super.vaultTemplate();
    }

    @Bean("vaultToken")
    public String vaultToken(@Value("${spring.vault.token}") final String vaultToken) {
        this.vaultToken = vaultToken;
        return vaultToken;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-01 19:48:52

如何使用RetryTemplate创建自定义VaultTemplate bean类

代码语言:javascript
复制
public class RetryableVaultTemplate extends VaultTemplate {

    private final RetryTemplate retryTemplate;

    public RetryableVaultTemplate(VaultEndpointProvider endpointProvider,
            ClientHttpRequestFactory clientHttpRequestFactory,
            SessionManager sessionManager, RetryTemplate retryTemplate) {
        super(endpointProvider, clientHttpRequestFactory, sessionManager);
        this.retryTemplate = retryTemplate;
    }

    @Override
    public VaultResponse read(final String path) {

        return retryTemplate
                .execute(new RetryCallback<VaultResponse, RuntimeException>() {
                    @Override
                    public VaultResponse doWithRetry(RetryContext context) {
                        System.out.println("doWithRetry");
                        return RetryableVaultTemplate.super.read(path);
                    }
                });
    }

    @Override
    public <T> VaultResponseSupport<T> read(final String path, final Class<T> responseType) {

        return retryTemplate
                .execute(new RetryCallback<VaultResponseSupport<T>, RuntimeException>() {
                    @Override
                    public VaultResponseSupport<T> doWithRetry(RetryContext context) {
                        return RetryableVaultTemplate.super.read(path, responseType);
                    }
                });
    }
}

确保将这个bean类注册为vaultTemplate bean而不是VaultTemplate

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48035036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档