Пожалуйста, смотрите обновления ниже.
У меня есть приложение 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
не вызывается и поток блокируется. Что мне не хватает?
Обновление:
Итак, вот в чем дело: MyService
, MyServiceImpl
и MyServiceAspect
все в одном пакете. Перемещение MyServiceAspect
в другой пакет заставило его работать.
Кому-нибудь это звонит в колокол? Рад присудить награду любому, кто объяснит такое поведение. Спасибо!
Обновление 2:
Еще одно решение: добавление @DependsOn(value = {"myServiceAspect"})
поверх MyServiceImpl
снова решает проблему, хотя все еще интересно, почему.