ошибка при перезагрузке свойств пружины с помощью @RefreshScope в облаке весны - PullRequest
0 голосов
/ 15 января 2019

Я тестирую один прототип для Spring-Cloud, используя аннотацию @RefreshScope. Я использую один внешний файл свойств для этого. Что я предоставил и настроил в аргументе времени выполнения.

pom.xml зависимость

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0      http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.proto.reload</groupId>
<artifactId>CachingService</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>CachingService</name>
<description>Demo project for cache</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-context</artifactId>
        <version>1.1.8.RELEASE</version>
    </dependency>

    <!-- <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> 
        <version>1.1.3.RELEASE</version> </dependency> -->
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Это основной класс

package com.proto.reload;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.ApplicationPidFileWriter;

@SpringBootApplication
public class CachingServiceApplication {

public static void main(String[] args) {
    if (args.length == 0) {
        System.out.println("Invalid Commandline argument. Please provide Consumer Properties file.");
        System.exit(0);
    }
    new SpringApplicationBuilder(CachingServiceApplication.class)
            .listeners(new ApplicationPidFileWriter())
            .properties("spring.config.name:" + args[0].replaceAll(".properties", ""))
            .build()
            .run(args);

    while (true) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(ConfigClass.getName());
    }
}

}

Класс конфигурации с аннотацией @RefreshScope

package com.proto.reload;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;

@Configuration
@RefreshScope
public class ConfigClass {

    private static String name;

    public static String getName() {
        return name;
    }

    @Value("${app.prop.name}")
    public void setName(String name) {
        this.name = name;
    }

}

И это файл свойств, который я передаю через аргумент

app.prop.name=FirstOldValue

spring.pid.file=TestOne.pid

Когда я запускаю этот код, я получаю следующую ошибку.

   12:38:41.051 [main] DEBUG org.springframework.boot.context.logging.ClasspathLoggingApplicationListener - Application failed to start with classpath: [file:/C:/Program%20Files/Java/jre1.8.0_191/lib/resources.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/rt.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/jsse.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/jce.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/charsets.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/jfr.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/ext/access-bridge-64.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/ext/cldrdata.jar, ...]
12:38:41.105 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Object;)V
    at org.springframework.cloud.bootstrap.BootstrapApplicationListener.bootstrapServiceContext(BootstrapApplicationListener.java:120)
    at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:84)
    at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:62)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
    at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:75)
    at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
    at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:347)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:306)
    at com.proto.reload.CachingServiceApplication.main(CachingServiceApplication.java:19)

Я неправильно использую @RefreshScope? Этот код работает нормально, когда я удаляю зависимости и @RefreshScope, но не обновляет значение свойства во время выполнения. Моя цель - загрузить измененное значение свойства во время выполнения.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

1.1.8.RELEASE для Spring Cloud - часть поезда Camden Release, предназначенного для релизов Spring Boot 1.4.x.

Пожалуйста, ознакомьтесь с разделом Release Trains, чтобы узнать, какую версию релиза использовать для вашей версии Spring Boot

https://spring.io/projects/spring-cloud

В настоящее время они есть,

Версия загрузочной версии поезда

Гринвич 2.1.х

Finchley 2.0.x

Edgware 1.5.x

Dalston 1.5.x

Поскольку вы используете весеннюю загрузку 2.1.1, ваше управление зависимостями должно выглядеть следующим образом, обратите внимание, что у Гринвича нет RELEASE, но вам необходимо добавить репозиторий milestone.

 <repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.RC2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-context</artifactId>
    </dependency>

</dependencies>
0 голосов
/ 15 января 2019

Добавьте зависимость от контекста облака и попробуйте снова

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-context</artifactId>
        <version>1.1.8.RELEASE</version>
    </dependency>

Обновление: это просто недопустимый вариант использования @Configuration и @RefreshScope для одного элемента. Согласно этой теме URL: https://github.com/spring-cloud/spring-cloud-config/issues/43

...