当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud Config Server如何将纯文本文件推送到Config Client应用程序?

傅阳炎
2023-03-14

到目前为止,我实施的是:

  1. 具有“原生”存储库的Spring Cloud配置服务器。

<代码>Spring。配置文件。活动:本机

<代码>Spring。云配置。服务器出生地的搜索位置:文件:/path/to/config repo

配置服务器正在通过RabbitMQ将通知推送到配置客户端应用程序,如下所示http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_push_notifications_and_spring_cloud_bus

配置客户端应用程序在Service bean上注释了@刷新范围。

因此 /config-repo有3个文件-application.yaml、client.yaml和client.json所有yaml属性更改都将由Config Client App自动重新加载。但是,client.json没有。

基于https://github.com/spring-cloud/spring-cloud-config/issues/147,我可以使用/{appname}/{profile}/{label}/Client通过对配置服务器的REST api调用在配置客户端应用程序上获取文件。json

问题是:

1) 配置服务器是否通过“本机”监视此纯文本文件的更改?

2) 如何配置客户端应用程序自动重新加载此客户端。json一旦更新?(我可以安排任务调用配置服务器,但这并不理想。)

共有2个答案

王才
2023-03-14

配置客户端:restTemplate。getForObject(“”http://localhost:8080/application/default/master/testing-dev.json“,String.class);

可以获取。json后缀文件内容,但我认为它没有获取文件内容,有其他方法获取文件内容

贡英华
2023-03-14

我像这样不修边幅(还没有鳍):我有Spring。云配置。服务器出生地的以逗号分隔的URI列表形式显示的serach位置

file:/c:/repo/a,file:/c:/repo/b

我创建了FileMonitorConfiguration bean(但它有一些问题,因为它被调度了2次,一个bean本身和一个spring增强的实例,我对此并不熟悉)

并实现(只是草稿)NativeProperty tyPathNotificationExtractor

@Configuration
@EnableAutoConfiguration
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }

    @Bean
    NativePropertyPathNotificationExtractor nativePropertyPathNotificationExtractor(@Autowired(required = false) NativeEnvironmentRepository nativeRepo) {
        return new NativePropertyPathNotificationExtractor(nativeRepo);
    }

    @Bean
    FileMonitorConfiguration fileMonitorConfiguration() {
        return new FileMonitorConfiguration();
    }
}

@Order(Ordered.LOWEST_PRECEDENCE - 500)
public class NativePropertyPathNotificationExtractor implements PropertyPathNotificationExtractor {
    private final Set<Path> searchPaths;

    public NativePropertyPathNotificationExtractor(NativeEnvironmentRepository nativeRepo) {
        searchPaths = searchLocations(nativeRepo);
    }

    @Override
    public PropertyPathNotification extract(MultiValueMap<String, String> headers, Map<String, Object> payload) {

        // FileMonitor with empty headers, so if some there, ignore
        if (false == headers.isEmpty()) {
            return null;
        }
        if (null == searchPaths) {
            return null;
        }

        Path path = pathFromPayload(payload);
        if (null == path) {
            return null;
        }

        for (Path searchPath : searchPaths) {
            Path relative = searchPath.relativize(path);
            // just a try ;-)
            if (true == relative.startsWith("..")) {
                continue;
            }

            return new PropertyPathNotification(relative.toString());
        }

        return null;
    }

    private Path pathFromPayload(Map<String, Object> payload) {
        if (null == payload) {
            return null;
        }
        if (true == payload.isEmpty()) {
            return null;
        }
        if (false == payload.containsKey("path")) {
            return null;
        }
        if (null == payload.get("path")) {
            return null;
        }
        if (true == StringUtils.isEmpty(payload.get("path").toString())) {
            return null;
        }
        return Paths.get(payload.get("path").toString()).normalize().toAbsolutePath();
    }

    private Set<Path> searchLocations(NativeEnvironmentRepository nativeRepo) {
        if (null == nativeRepo) {
            return null;
        }
        if (null == nativeRepo.getSearchLocations()) {
            return null;
        }

        final Set<Path> paths = new LinkedHashSet<>();
        for (String location : nativeRepo.getSearchLocations()) {
            try {
                paths.add(Paths.get(new URI(location)).normalize().toAbsolutePath());
            } catch (Exception e) {
                System.err.println("Nevalidne search location uri: " + location);
            }
        }
        return paths;

    }
}
 类似资料:
  • 问题内容: 我有。我希望在运行时在终端中显示ddrescue并将输出写入文件drclog。我尝试使用,但这使我在ddrescue中输入错误。 问题答案: 如果将其stdout / stderr重定向到管道时仍不更改其输出,则可以使用实用程序在终端上显示输出并将其保存到文件中: 如果确实如此,那么您可以尝试使用实用程序提供一个伪tty : 如果它直接写入终端,则可以用来捕获输出: 默认情况下,输出保

  • 6.6.3 FlatFileItemWriter 将数据写入到纯文本文件也必须解决和读取文件时一样的问题。 在事务中,一个 step 必须通过分隔符或采用固定长度的格式将数据写出去. LineAggregator 与 LineTokenizer 接口的处理方式类似, 写入文件时也需要有某种方式将一条记录的多个字段组织拼接成单个 String,然后再将string写入文件. Spring Batch

  • 6.6.2 FlatFileItemReader 译注: 本文中 将 Flat File 翻译为“平面文件”, 这是一种没有特殊格式的非二进制的文件,里面的内容没有相对关系结构的记录。 平面文件(flat file)是最多包含二维(表格)数据的任意类型的文件。在 Spring Batch 框架中 FlatFileItemReader 类负责读取平面文件, 该类提供了用于读取和解析平面文件的基本功能

  • 问题内容: subprocess.call([“/home/myuser/run.sh”, “/tmp/ad_xml”, “/tmp/video_xml”]) 现在,我有了运行的脚本。当我运行它并到达此行时,它开始打印内容,因为run.sh中有打印内容。 如何将其也管道传输到文本文件?(如果可能,还可以打印) 问题答案: 如果要将输出写入文件,可以使用stdout -argument of 。 它

  • 问题内容: 我有一系列使用Beautiful Soup解析为单个文本文件的HTML文件。HTML文件的格式设置为使其输出始终为文本文件中的三行,因此输出将类似于: 但这很容易 换句话说,HTML文件的内容在每个文件中并不是真正的标准,但是它们始终会产生三行。 因此,我想知道如果我想从Beautiful Soup生成的文本文件然后将其解析为带有以下内容的列的CSV文件(使用上面的示例),应该从哪里开

  • 问题内容: 在Linux中将文本附加到文件的最简单方法是什么? 我看了这个问题,但是可接受的答案使用了一个附加程序(),我相信应该有一个更简单的方法或类似方法。 问题答案: cat >> filename This is text, perhaps pasted in from some other source. Or else entered at the keyboard, doesn’t