Как я могу зарегистрировать идентификатор потока родителя и ребенка, используя AspectJ в Java - PullRequest
0 голосов
/ 28 октября 2018

Я новичок в AspectJ.Был в состоянии создать простые классы JUnit и Aspect для регистрации ThreadId, который регистрирует Parent Thread Id.Но я не могу понять, как войти в систему Child ThreadId.

Учитывая следующий фрагмент кода, я хотел бы зарегистрировать идентификатор потока как родительского, так и дочернего, используя AspectJ.

JUnit:

@Test
public void testExecutorService() {
    ExecutorService service = Executors.newSingleThreadExecutor();
    Runnable task = new Runnable() {
        @Override
        public void run() {
            System.out.println("working on the task");
        }
    };
    service.submit(task);
}

Аспект: следующий аспект регистрирует Parent ThreadId.

before() :
    call(* ExecutorService+.submit(..))
 {
    System.out.println("Parent Thread Id: "+Thread.currentThread().getId());
    //System.out.println("Child Thread Id: "+??); //?? - how to capture child thread id?
 }

Я понимаю, что здесь используется совет «до», а также метод перехвата отправки, что также может быть проблемой.Как я могу записать идентификатор дочернего потока вместе с идентификатором родительского потока, используя правильное выражение Pointcut?Спасибо.

1 Ответ

0 голосов
/ 01 ноября 2018

Что вы можете сделать, это перехватить параметр задачи отправки и улучшить эту задачу, чтобы напечатать то, что вы хотите:

Object around(Runnable task) : call(* ExecutorService+.submit(Runnable, ..)) && args( task)
{
    final long parentID = Thread.currentThread().getId();
    Runnable newTask =  new Runnable() {
        Runnable newTask =  () -> {
            System.out.println("Parent Thread Id: "+ parentID);
            System.out.println("Child Thread Id: "+Thread.currentThread().getId()); //?? - how to capture child thread id?
            task.run();
        };
    return proceed(newTask);
}

Как только асинхронная задача будет выполнена, идентификатор потока, выполняющего еебудет печать.

...