2016-09-08 19 views
5

Tôi đang sử dụng khởi động mùa xuân và tôi có hai tệp thuộc tính bên ngoài, để tôi có thể dễ dàng thay đổi giá trị của nó.Tải lại giá trị thuộc tính khi thay đổi tệp thuộc tính bên ngoài, khởi động mùa xuân

Nhưng tôi hy vọng ứng dụng mùa xuân sẽ tải lại giá trị đã thay đổi khi được cập nhật, giống như đọc từ tệp. Vì tệp thuộc tính đủ dễ đáp ứng nhu cầu của tôi, tôi hy vọng tôi không cần db hoặc tệp.

tôi sử dụng hai cách khác nhau để nạp giá trị tài sản, mẫu mã sẽ thích:

@RestController 
public class Prop1Controller{ 

    @Value("${prop1}") 
    private String prop1; 


    @RequestMapping(value="/prop1",method = RequestMethod.GET) 
    public String getProp() { 
     return prop1; 
    } 
} 


@RestController 
public class Prop2Controller{ 

    @Autowired 
    private Environment env; 

    @RequestMapping(value="/prop2/{sysId}",method = RequestMethod.GET) 
    public String prop2(@PathVariable String sysId) { 
     return env.getProperty("prop2."+sysId); 
    } 
} 

tôi sẽ khởi động ứng dụng của tôi với

-Dspring.config.location=conf/my.properties 

Trả lời

0

Tôi sợ bạn sẽ cần phải khởi động lại bối cảnh mùa xuân .

0

(1) mùa xuân của Cloud RestartEndPoint

Bạn có thể sử dụng RestartEndPoint: Programatically restart Spring Boot application/Refresh Spring Context

RestartEndPoint là một Actuator EndPoint, đi kèm với spring-cloud-context.

Tuy nhiên, RestartEndPoint sẽ không giám sát các thay đổi đối với tệp, bạn sẽ phải tự mình xử lý.


(2) DevTools

Tôi không biết nếu điều này là cho một ứng dụng sản xuất hay không. Bạn có thể hack devtools một chút để làm những gì bạn muốn.

Hãy xem câu trả lời này khác tôi đã viết cho một câu hỏi khác: Force enable spring-boot DevTools when running Jar

Devtools monitors for file changes:

ứng dụng sử dụng lò xo khởi động DevTools sẽ tự động khởi động lại bất cứ khi nào file về việc thay đổi classpath.

Về mặt kỹ thuật, devtools được xây dựng để chỉ hoạt động trong một IDE. Với hack, nó cũng hoạt động khi khởi chạy từ một cái lọ. Tuy nhiên, tôi có thể không làm điều đó cho một ứng dụng sản xuất thực sự, bạn quyết định nếu nó phù hợp với nhu cầu của bạn.

0

Tôi nghĩ cách duy nhất để đạt được nhu cầu của bạn là bật spring-cloud. Có một điểm cuối làm mới /refresh làm mới ngữ cảnh và đậu.

Tôi không hoàn toàn chắc chắn nếu bạn cần một spring-cloud-config-server (một dịch vụ siêu nhỏ và rất dễ xây dựng), nơi cấu hình của bạn được lưu trữ (Git hoặc svn). Hoặc nếu nó cũng có thể sử dụng được chỉ bởi tệp application.properties trong ứng dụng.

đây bạn có thể tìm ra doc cho refresh scope and spring cloud.

0

Bạn sẽ có thể sử dụng mùa xuân đám mây cho rằng

Thêm điều này như một sự phụ thuộc

compile group: 'org.springframework.cloud', name: 'spring-cloud-starter', version: '1.1.2.RELEASE' 

Và sau đó sử dụng @RefreshScope chú thích

Spring @Bean được đánh dấu là @RefreshScope sẽ được xử lý đặc biệt khi có thay đổi cấu hình. Điều này giải quyết vấn đề đậu trạng thái chỉ nhận được cấu hình của chúng được tiêm khi chúng được khởi tạo. Ví dụ, nếu một DataSource có các kết nối mở khi URL cơ sở dữ liệu được thay đổi thông qua Môi trường, chúng ta có thể muốn các chủ sở hữu của các kết nối đó có thể hoàn thành những gì chúng đang làm. Sau đó, thời gian tới một người nào đó mượn một kết nối từ các hồ bơi, ông được một với các URL mới.

Cũng liên quan nếu bạn có mùa xuân Actuator

Đối với một ứng dụng Spring Boot Actuator có một số thiết bị đầu cuối quản lý bổ sung:

POST để

/env để cập nhật các Môi trường và rebind @ConfigurationProperties và mức nhật ký

/làm mới để tải lại ngữ cảnh dây đeo khởi động và ref reshing the @RefreshScope beans

Spring Cloud Doc

Các vấn đề liên quan