背景
同様に、開発者によってArthasはアリババオープンソースのJava診断ツール、。
Arthasはを共有する前に、401分の404問題のトラブルシューティング方法:hengyunabc.github.io/arthas-spriを...
私たちはすぐにある要求がされるように見つけることができますFilter
傍受、または要求が最終的にどの作られてServlet
処理されます。
しかし、時には、私たちはSpring MVCのコントローラプロセスを要求されているかを知りたいです。あなたがコードを有効にした場合、それを見つけるのはより困難、必ずしも正確ではないだろう。
正確Arthasはによって位置決めすることができるController
要求を処理します。
デモ
それとも一例として、このデモでは:github.com/hengyunabc / ...
:一度訪問し、始めにhttp:// localhost:8080 /ユーザー/ 1、ユーザーオブジェクトを返します。そして、ある要求Controller
、それに対処しますか?
トレース位置決めのDispatcherServlet
さんが追跡してみましょうServlet
:
trace javax.servlet.Servlet *
复制代码
これは、最終的にするトレース要求の結果から分かるようDispatcherServlet#doDispatch()
に対処しますが、これを知る方法はありませんController
治療が。
`---[27.453122ms] org.springframework.web.servlet.DispatcherServlet:doDispatch()
+---[0.005822ms] org.springframework.web.context.request.async.WebAsyncUtils:getAsyncManager() #929
+---[0.107365ms] org.springframework.web.servlet.DispatcherServlet:checkMultipart() #936
| `---[0.062451ms] org.springframework.web.servlet.DispatcherServlet:checkMultipart()
| `---[0.016924ms] org.springframework.web.multipart.MultipartResolver:isMultipart() #1093
+---[2.103935ms] org.springframework.web.servlet.DispatcherServlet:getHandler() #940
| `---[2.036042ms] org.springframework.web.servlet.DispatcherServlet:getHandler()
复制代码
位置決めハンドラを見ます
プリントアウト発信回線数のトレース結果、私たちは(あなたは、コマンドデコンパイルのJADを使用することができます)IDEに直接コードを見ることができます:
// org.springframework.web.servlet.DispatcherServlet
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
复制代码
- コードをよく見てみると、見つけることができ
mappedHandler = getHandler(processedRequest);
、処理要求ハンドラを与えます
以下ではwatch
取得するためのコマンドgetHandler
関数の戻り値の結果を。
watch
その後、再び訪問にhttp:// localhostを:8080 /ユーザー / 1
$ watch org.springframework.web.servlet.DispatcherServlet getHandler returnObj
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 332 ms.
ts=2019-06-04 11:38:06; [cost=2.75218ms] result=@HandlerExecutionChain[
logger=@SLF4JLocationAwareLog[org.apache.commons.logging.impl.SLF4JLocationAwareLog@665c08a],
handler=@HandlerMethod[public com.example.demo.arthas.user.User com.example.demo.arthas.user.UserController.findUserById(java.lang.Integer)],
interceptors=null,
interceptorList=@ArrayList[isEmpty=false;size=2],
interceptorIndex=@Integer[-1],
]
复制代码
私たちは、要求があるハンドラプロセスを見ることができますom.example.demo.arthas.user.UserController.findUserById
。
概要
- 春MVC要求
DispatcherServlet
分布、対応見つけるmappedHandler
処理するために - Arthasは、コードの柔軟な組み合わせを使用するときは、問題を迅速に特定することができます
リンク
オリジナル住所
mp.weixin.qq.com/s/oWUzgF4lR ...二つの新しい本を描く「マイクロサービスのアーキテクチャのデザインパターン」
いいえ公共ありません
Javaの、春ブーツ、Arthasは、ダボに焦点を当て、コラム水平雲がリッジを破る見るへようこそ。