我正在使用 Spring Boot 開發應用程式并將多個 WAR 部署到外部 tomcat。我想在 tomcat 啟動時用這些 WAR 注冊一個可共享的 bean。
我使用:Java8、Spring boot(2.5.5) 和 Tomcat9
Bean 我想被 Apps 分享:
public class TestData {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
SampleApp(有多個應用程式以相同的方式自動裝配 TestData 的實體):
@SpringBootApplication
@RestController
public class App extends SpringBootServletInitializer {
@Autowired
TestData testData;
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(App.class);
}
@RequestMapping(value = "SampleApp1", method = RequestMethod.GET)
public String getUsername() {
return testData.getUsername();
}
}
uj5u.com熱心網友回復:
我認為您的問題是關于在部署在同一網路服務器中的不同應用程式容器之間共享一個單例 Bean 的資料。
出于安全原因,這是不可能的。每個部署的應用程式都有自己的類加載器,因此無法輕松訪問駐留在其他容器記憶體中的 bean。
我建議您添加一個由不同部署的應用程式訪問的微服務并使用它。它可以通過例如 OpenFeign 作為客戶端輕松訪問,如果操作正確,它幾乎看起來像一個帶有 getter 和 setter 的 bean。
uj5u.com熱心網友回復:
有幾種方法可以解決您的問題,可以在不同級別上解決它。
創建一個包含所需內容的共享庫并將其安裝到 Tomcat 服務器。“安裝”通常意味著將組裝好的 jars 放入
$CATALINA_HOME/lib目錄或類似目錄。Class Loader HOW-TO可以為您提供更多詳細資訊。不確定它如何與類的共享 實體一起作業,但絕對可以通過共享庫共享類(例如工廠)和配置。使用共享配置和工廠,您至少可以生產相同的 bean(不需要相同,但對您來說似乎足夠了)。定義在所有應用程式之間共享的JNDI 資源。當然,這要求 Tomcat 可以訪問您的類,因此您首先必須通過選項 1。這樣您就可以“發布”在所有應用程式之間共享的類的實體。可以在JNDI 資源 HOW-TO 中找到詳細資訊。通過這種方法,您可以使用
@Resource注釋注入已發布的資源。創建一個可以為您提供資料和功能并從您的應用程式訪問它的微服務(如其他答案之一所示)。這為您提供了最大的靈活性,但也帶來了需要與微服務進行實際通信的復雜性。
顯然,選項 1 和 2 需要直接訪問服務器配置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326744.html
