同一包中的@Around @Aspect仅适用于@DependsOn


我有一个Spring Boot应用程序,我可以在其中接受TCP / IP连接:

   public MyClass implements InitializingBean {

@Override

public void afterPropertiesSet() throws Exception {

try (ServerSocket serverSocket = new ServerSocket(port)) {

while (true) {

Socket socket = serverSocket.accept();

new ServerThread(socket).start();

}

}

}

...

private class ServerThread extends Thread {

@Override

public void run() {

try (InputStream input = socket.getInputStream();

OutputStream output = socket.getOutputStream()) {

// Read line from input and call a method from service:

service.myMethod(lineConvertedToMyObject);

} catch {

...

}

}

}

}

现在,它可以正常工作。但是当我将AspectJ引入到myMethod

@Aspect

@Component

public class MyServiceAspect {

private static final Logger logger = LoggerFactory.getLogger(MyServiceAspect.class);

@Around(value = "execution(* com.package.to.MyService.myMethod(..))")

public MyObject rules(ProceedingJoinPoint joinPoint) throws Throwable {

long startTime = System.currentTimeMillis();

MyObject obj = (MyObject) joinPoint.proceed();

logger.debug("Took {} milliseconds", System.currentTimeMillis() - startTime);

return obj;

}

}

service.myMethod不被调用,线程被阻塞。我想念什么?

所以这里的交易:MyServiceMyServiceImpl并且MyServiceAspect都是在同一个包。移入MyServiceAspect另一个程序包使其工作。

这会给任何人敲响钟声吗?很高兴将赏金奖励给任何解释此行为的人。谢谢!

然而,另一种解决方案:添加@DependsOn(value =

{"myServiceAspect"})之上MyServiceImpl再解决问题,仍然不知道为什么,虽然。

回答:

回答:

正如亚历山大·帕德林AlexanderPaderin在其对相关问题的回答中所描述的>>中的无限循环afterPropertiesSet()是线程阻止程序,因为在这种情况下,控制权并未返回到 Spring

回答:

您提供的代码示例不直接包含问题, AspectJ 声明很好。

首先,请让我分享一个工作示例:spring-aspectj-sockets。它基于 Spring 5.1.0AspectJ 1.9.1

(当前最新版本),并且使用您的示例,而与的位置/包无关MyServiceAspect


回答:

2.1。介绍

您的示例中最可能的线程阻止程序是对的调用ServerSocket.accept(),该方法的javadocs说:

监听与此套接字建立的连接并接受它。

有2种正确的处理方式accept()

  1. 首先初始化连接,例如:

    serverSocket = new ServerSocket(18080);

    clientSocket = new Socket(“127.0.0.1”, 18080); // initializing connection

    Socket socket = serverSocket.accept(); // then calling accept()

  2. 设置超时以等待接受:

    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位于其他地方


回答:

我不确定是否需要这样做,由于悬赏的描述有疑问,让我快速介绍一下,以防万一。

您可以使用“ 远程调试” 来调试应用程序-它涵盖了方面,子线程,服务等。-您只需要:

  1. 使用特定参数运行 Java ,如本问题中所述>>
  2. 并使用IDE连接到指定的调试端口(在同一问题中描述了 Eclipse的 步骤)

以上是 同一包中的@Around @Aspect仅适用于@DependsOn 的全部内容, 来源链接: utcz.com/qa/403251.html

回到顶部