btrace の使い方を学んでいます。そのために、次のコードを含む spring-boot プロジェクトを作成しました。
@Controller
public class MainController {
private static Logger logger = LoggerFactory.getLogger(MainController.class);
@ResponseBody
@GetMapping("/testFile")
public Map<String, Object> testFile() throws IOException {
File file = new File("/tmp/a");
if (file.exists()) {
file.delete();
}
file.createNewFile();
return ImmutableMap.of("success", true);
}
}
次に、 を使用してプロジェクトを開始し、mvn spring-boot:run
その後、次のように btrace スクリプトを作成しました。
import com.sun.btrace.annotations.*;
import com.sun.btrace.BTraceUtils;
@BTrace
public class HelloWorld {
@OnMethod(clazz = "java.io.File", method = "createNewFile")
public static void onNewFileCreated(String fileName) {
BTraceUtils.println("New file is being created");
BTraceUtils.println(fileName);
}
}
ご覧のとおり、このスクリプトはjava.io.File#createNewFile
が呼び出されたときに何かを出力する必要があります。これはまさに上記のコントローラーが行うことです。次に、次のコードを使用して、実行中の spring-boot プロジェクトに btrace をアタッチしました。
btrace 30716 HelloWorld.java
30716 は、実行中の spring-boot プロジェクトの PID です。次に、にアクセスしてみhttp://localhost:8080/testFile
ました。実行中の spring-boot プロジェクトから、次のような追加の出力が得られました。
objc[30857]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/java (0x10e2744c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x1145e24e0). One of the two will be used. Which one is undefined.
2019-01-04 11:24:49.003 INFO 30857 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-01-04 11:24:49.003 INFO 30857 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-01-04 11:24:49.019 INFO 30857 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 16 ms
が出力されることを期待していましたNew file is being created
が、そうではありませんでした。なんで?私は何か間違ったことをしましたか?