[英]Spring Boot: accessing Autowired component in Runnable static Thread
我需要在單獨的線程中訪問 @Component (TerminalLogHolder),該線程在靜態方法中啟動。 單獨線程中的組件沒有注入,所以我開始尋找解決方案並單獨找到了一種在靜態方法中訪問@Autowired組件的方法和一種使用applicationContext注入bean的方法,但是我無法制作它們一起工作。
這是代碼:
public class CommandExecutor {
private static void printLog(Process process, String processLog) {
ReadStream s1 = new ReadStream("stdin", process.getInputStream ());
s1.start ();
}
public static class ReadStream implements Runnable {
private String name;
private String cmdId;
private InputStream is;
private Thread thread;
@Autowired
private TerminalLogHolder terminalLogHolder;
public ReadStream(String name, InputStream is, String cmdId) {
this.name = name;
this.is = is;
this.cmdId = cmdId;
}
public void start () {
thread = new Thread (this);
thread.start ();
}
public void saveLog(String s) {
terminalLogHolder.addLog(cmdId, "[" + name + "] " + s);
}
public void run () {
try {
InputStreamReader isr = new InputStreamReader (is);
BufferedReader br = new BufferedReader (isr);
while (true) {
String s = br.readLine ();
if (s == null) break;
saveLog(s);
}
is.close ();
} catch (Exception ex) {
System.out.println ("Problem reading stream " + name + "... :" + ex);
ex.printStackTrace ();
}
}
}
}
我感謝您的幫助!
正如 chrylis -onstrike- 所建議的,解決方案是簡單的構造函數注入。
傳遞給其他地方的靜態方法對象 Autowired 就足夠了:
printLog(Process process, String processLog, TerminalLogHolder logHolder){
ReadStream s1 = new ReadStream("stdin", process.getInputStream (), logHolder);
s1.start ();
}
public static class ReadStream implements Runnable {
private String name;
private String cmdId;
private InputStream is;
private Thread thread;
private TerminalLogHolder terminalLogHolder;
public ReadStream(String name, InputStream is, String cmdId, TerminalLogHolder logHolder) {
this.name = name;
this.is = is;
this.cmdId = cmdId;
this.terminalLogHolder = logHolder;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.