0

I have a small demo app I followed on youtube https://www.youtube.com/watch?v=DrMmHTHTcCo

I have setup everything as instructed but it does not work.

here are the classes

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);
            }
        });
    }
}

I debugged the code, everything from the publishing the event works but the listener is not receiving the event. I introduced log messages everywhere but no luck. What am I missing?

Milind
  • 21
  • 4

1 Answers1

0

It started working. Only change I did was removed the ctx.close() from AnnotationMain.main method.

Milind
  • 21
  • 4