Arthasは練習:コントローラが要求を処理しましたか?

背景

同様に、開発者によって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は、ダボに焦点を当て、コラム水平雲がリッジを破る見るへようこそ。

ボックス雲はリッジを消し

おすすめ

転載: juejin.im/post/5cf72e79e51d45508c2fb804