实际问题
正如亚历山大·帕德林AlexanderPaderin在其对相关问题的回答中所描述的>>中的无限循环
afterPropertiesSet()是线程阻止程序,因为在这种情况下,控制权并未返回到 Spring 。
1.使用示例的示例(问题编辑后不实际)
您提供的代码示例不直接包含问题, AspectJ 声明很好。
首先,请让我分享一个工作示例:spring-aspectj-sockets。它基于 Spring 5.1.0 和 AspectJ 1.9.1
(当前最新版本),并且使用您的示例,而与的位置/包无关
MyServiceAspect。
2.问题说明
2.1。介绍
您的示例中最可能的线程阻止程序是对的调用
ServerSocket.accept(),该方法的javadocs说:
监听与此套接字建立的连接并接受它。 该方法将阻塞,直到建立连接为止。
有2种正确的处理方式
accept():
首先初始化连接,例如:
serverSocket = new ServerSocket(18080);
clientSocket = new Socket(“127.0.0.1”, 18080); // initializing connection
Socket socket = serverSocket.accept(); // then calling accept()设置超时以等待接受:
serverSocket = new ServerSocket(18080);
serverSocket.setSoTimeout(5000); // 5 seconds timeout
Socket socket = serverSocket.accept(); // then calling accept()
注意 :如果5秒钟之内没有连接,
accept()将抛出异常,但不会阻塞线程
2.2。假设条件
我假设您使用的是1-st方法,并且在某处有一条线初始化连接,即
clientSocket = new Socket("127.0.0.1",18080);。但是它被调用(例如,如果使用静态声明):
- 之后
serverSocket.accept()
以防万一MyServiceAspect
位于同一包装中并且 - 之前-如果
MyServiceAspect
位于其他地方
3.调试
我不确定是否需要这样做,由于悬赏的描述有疑问,让我快速介绍一下,以防万一。
您可以使用“ 远程调试” 来调试应用程序-它涵盖了方面,子线程,服务等。-您只需要:
- 使用特定参数运行 Java ,如本问题中所述>>
- 并使用IDE连接到指定的调试端口(在同一问题中描述了 Eclipse的 步骤)



