如何解决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 举报,一经查实,本站将立刻删除。