微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring 事件侦听器不起作用,有什么问题?

如何解决Spring 事件侦听器不起作用,有什么问题?

我在 youtube 上关注了一个小型演示应用https://www.youtube.com/watch?v=DrMmHTHTcCo

我已按照说明设置了所有内容,但它不起作用。

这里是课程

注解配置.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
{
}

注解Main.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);
            }
        });
    }
}

我调试了代码,从发布事件开始,一切都在工作,但侦听器没有接收到事件。我到处都引入了日志消息,但没有运气。我错过了什么?

解决方法

它开始工作了。我所做的唯一更改是从 AnnotationMain.main 方法中删除了 ctx.close()。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。