Прослушиватель событий Spring не работает, что не так?

#java #spring #listener #publisher

#java #весна #прослушиватель #издатель

Вопрос:

У меня есть небольшое демонстрационное приложение, за которым я следил на YouTube https://www.youtube.com/watch?v=DrMmHTHTcCo

Я настроил все в соответствии с инструкциями, но это не работает.

вот классы

AnnotationConfiguration.java

 package com.milind.spring.event;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.milind.spring.event")
public class AnnotationConfiguration
{
}
 

AnnotationMain.java

 package com.milind.spring.event;

import java.util.logging.Logger;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AnnotationMain
{
    private static final Logger LOG = Logger
            .getLogger(AnnotationMain.class.getName());

    public static void main(String[] args)
    {
        LOG.info("main app started");
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
                AnnotationConfiguration.class);
        ctx.getBean(MessagePublisher.class).publishMessage();
        LOG.info("End of main");

        ctx.close();
    }
}
 

MessageEvent.java

 package com.milind.spring.event;

import java.util.Calendar;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;

import org.springframework.context.ApplicationEvent;

public class MessageEvent extends ApplicationEvent
{
    private static final Logger LOG = Logger
            .getLogger(MessageEvent.class.getName());
    private static final long serialVersionUID = -248303624330278824L;
    private String message;
    private static AtomicInteger messageCounter = new AtomicInteger();

    public MessageEvent(Object source, String message)
    {
        super(source);
        LOG.info("MessageEvent constructor: "   message);
        this.message = generateMessage(message);
    }

    private String generateMessage(String message)
    {
        LOG.info("MessageEvent generateMessage: "   message);
        StringBuilder sb = new StringBuilder();
        sb.append("| INFO |").append(Calendar.getInstance().getTime())
                .append("|").append("Message sequence: ")
                .append(messageCounter.getAndIncrement()).append("|")
                .append(message);
        String string = sb.toString();
        LOG.info("MessageEvent generateMessage: "   string);
        return string;
    }

    @Override
    public String toString()
    {
        return "MessageEvent [message="   message   ", toString()="
                  super.toString()   "]";
    }

}
 

MessageListener.java

 package com.milind.spring.event;

import java.util.logging.Logger;

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class MessageListener implements ApplicationListener<MessageEvent>
{
    private static final Logger LOG = Logger
            .getLogger(MessageListener.class.getName());

    @Override
    public void onApplicationEvent(MessageEvent event)
    {
        LOG.info("onApplicationEvent: "   event.toString());

        System.out.println(event.getSource());
        System.out.println(event.getTimestamp());
    }

}
 

MessagePublisher.java

 package com.milind.spring.event;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.logging.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.stereotype.Component;

@Component
public class MessagePublisher implements ApplicationEventPublisherAware
{
    private static final Logger LOG = Logger
            .getLogger(MessagePublisher.class.getName());

    private ApplicationEventPublisher applicationEventPublisher;
    private static Map<Integer, String> messages = new HashMap<>();

    static
    {
        LOG.info("static init");
        messages.put(1, "Sample message 1");
        messages.put(2, "Sample message 2");
        messages.put(3, "Sample message 3");
        messages.put(4, "Sample message 4");
        messages.put(5, "Sample message 5");
    }

    @Override
    public void setApplicationEventPublisher(
            ApplicationEventPublisher applicationEventPublisher)
    {
        LOG.info("setApplicationEventPublisher");
        this.applicationEventPublisher = applicationEventPublisher;
    }

    public void publishMessage()
    {
        LOG.info("publishMessage");
        new SimpleAsyncTaskExecutor().execute(() ->
        {
            for (int i = 0; i < 5;   i)
            {
                int id = new Random().nextInt(5);
                String message = messages.get(  id);
                LOG.info("publishMessage.run(): message="   message);

                MessageEvent event = new MessageEvent(this, message);
                applicationEventPublisher.publishEvent(event);
                LOG.info("publishMessage.run(): event="   event);
            }
        });
    }
}
 

Я отладил код, все, начиная с публикации события, работает, но прослушиватель не получает событие. Я везде вводил сообщения журнала, но безуспешно. Чего мне не хватает?

Ответ №1:

Он начал работать. Единственное изменение, которое я сделал, это удалил ctx.close() из метода AnnotationMain.main.