#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.