0

I tried to create Pointcut & advice for annotation Scheduled and public methods in com.example package, but it doesnt work. When I tryed to call services in com.example, advice doesnt work. Also for annotation @Scheduled it doesnt work. I try to read documentation, it seems that it should work, but in reality it doesnt work. Can please someone give me a point, how to solve this issue.

package com.dhl.common.logging;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.MDC;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

import java.net.InetAddress;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

@Aspect
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class LoggingAspect {
    private static final String DATE_FORMATTER= "MMM dd, yyyy'T'HH:mm:ss.SSS";
    public static final String LOG_LEVEL_KEY = "LOG_LEVEL";
    public static final String APP_NAME_KEY = "APP_NAME";
    public static final String LOGGER_CLASS_NAME_KEY = "LOGGER_CLASS_NAME";
    public static final String SERVER_NAME_KEY = "SERVER_NAME";
    public static final String FORMATED_TIME_KEY = "FORMATED_TIME";
    public static final String ENVIROMENT_KEY = "ENVIROMENT";
    public static final String DISTRIBUTE_TRACE_ID_KEY = "DISTRIBUTE_TRACE_ID";

    @Pointcut("@annotation(org.springframework.scheduling.annotation.Scheduled)")
    private void scheduled() {}

    @Pointcut("within(com.example..*)")
    private void service() {}


    @Around("scheduled() && service()")
    public Object connectionAdvice(ProceedingJoinPoint joinPoint) throws Throwable {

        MDC.put(LOG_LEVEL_KEY, "INFO");
        MDC.put(APP_NAME_KEY, "CRDB");
        MDC.put(LOGGER_CLASS_NAME_KEY, joinPoint.getSourceLocation().getWithinType().toString());
        String serverName = InetAddress.getLocalHost().getHostName();
        MDC.put(SERVER_NAME_KEY, serverName);
        MDC.put(FORMATED_TIME_KEY, getFormatedTime());

        if(serverName != null) {
            if(serverName.toUpperCase().contains("LOCALHOST")) {
               MDC.put(ENVIROMENT_KEY,"LOCALHOST");
            } else if(serverName.toUpperCase().contains("TEST")) {
               MDC.put(ENVIROMENT_KEY,"TEST");
            } else if(serverName.toUpperCase().contains("UAT")) {
               MDC.put(ENVIROMENT_KEY,"UAT");
            } else {
                MDC.put(ENVIROMENT_KEY,"PRODUCTION");
            }
        }
        MDC.put(DISTRIBUTE_TRACE_ID_KEY, UUID.randomUUID().toString());

        try {
            return joinPoint.proceed();
        }
        finally {
            // Might as well clear all the MDC, not just the "myId"
            MDC.clear();
        }
    }

    private String getFormatedTime() {
        LocalDateTime localDateTime = LocalDateTime.now(); //get current date time

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMATTER);
        String formatDateTime = localDateTime.format(formatter);

        return formatDateTime;
    }

}
Jens
  • 67,715
  • 15
  • 98
  • 113
Petr Kostroun
  • 456
  • 9
  • 27

1 Answers1

0

There are a list of things that you may forgot:

  1. You may forgot to add the aspect class to your context, as I see that @Component is not on the code. There are a few ways to do it, i.e. i.e. through xml, programmatically or through spring's @ComponentScan.
  2. While assigning point cut through annotation should work, we should take precaution to where the annotated method is called. Spring AOP will not trigger the Advice when the method is called from within the class itself. You can see why here.
Achmad Afriza
  • 115
  • 10