添加上如下这个类,会使监听器中onApplicationEvent()方法,以异步的方法执行
package xxx.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ApplicationEventMulticaster;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
@Configuration
public class AsyncEventConfig {
@Bean(name = "applicationEventMulticaster")
public ApplicationEventMulticaster simpleApplicationEventMulticaster() {
SimpleApplicationEventMulticaster eventMulticaster
= new SimpleApplicationEventMulticaster();
eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
return eventMulticaster;
}
}
//自定义事件类
package xxx.init;
import org.springframework.context.ApplicationEvent;
public class MyApplicationEvent extends ApplicationEvent {
private String message;
public MyApplicationEvent(Object source,String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
//自定义监听器
package xxx.init;
import xxx.constant.Tag;
import xxx.impl.MQFactory;
import xxx.interfaces.IMQComsumer;
import xxx.interfaces.IMQProducer;
import xxx.interfaces.Ibusiness;
import org.apache.rocketmq.client.exception.MQClientException;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.ContextStartedEvent;
import org.springframework.stereotype.Component;
@Component
public class MyListener implements ApplicationListener<MyApplicationEvent> {
@Override
public void onApplicationEvent(MyApplicationEvent event) {
System.out.println(event.getMessage());
System.out.println("bbbbbbbbbbbbb");
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package xxx.init;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
//该监听器支持异步处理即doMethod方法是异步执行,不影响service中的方法,是在不同的线程中执行的。
//需要在springboot的启动类上开启@EnableAsync注解
@Component
public class PtListener {
@Async
@EventListener
public void doMethod(MyApplicationEvent event){
event.getMessage();
while (true){
System.out.println("in listener method");
}
}
}
package xxx.web;
import xxx.init.MyApplicationEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private ApplicationEventPublisher context;
@GetMapping("/getTest")
public String testMethod(){
MyApplicationEvent demoEvent = new MyApplicationEvent(this,"测试消息");
context.publishEvent(demoEvent);//发送一个消息(即触发一个MyApplicationEvent事件,会触发监听器PtListener 的doMethod方法执行或者触发MyListener类的onApplicationEvent方法执行)
System.out.println("main()");
return "abc";
}
}
/////////////////////////////////////////////////////////////////////////////////
package xxx.init;
import xxx.constant.Tag;
import xxx.impl.MQFactory;
import xxx.interfaces.IMQComsumer;
import xxx.interfaces.IMQProducer;
import xxx.interfaces.Ibusiness;
import org.apache.rocketmq.client.exception.MQClientException;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ApplicationContextEvent;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.ContextStartedEvent;
//监听ContextRefreshedEvent事件时,有可能会被触发多次。比如说,在我们的service中@AutoWired第三方的jar包中的feignClient
时。可以通过if(contextRefreshedEvent.getApplicationContext().getParent().getId().equals("bootstrap"))这个条件判断来过滤掉这些多余的触发调用。只调用一次onApplicationEvent方法。
public class ProduceAndConsumerInit implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
if(contextRefreshedEvent.getApplicationContext().getParent().getId().equals("bootstrap"))
{
String type = contextRefreshedEvent.getApplicationContext().getEnvironment().getProperty("mq.Type");
String address = contextRefreshedEvent.getApplicationContext().getEnvironment().getProperty("rocketmq.nameServeraddr");
String topic = contextRefreshedEvent.getApplicationContext().getEnvironment().getProperty("rocketmq.topic");
IMQProducer producer = MQFactory.getMQProducer(type,address,topic+"_"+ Tag.getName(5));
try {
producer.start();
} catch (MQClientException e) {
e.printStackTrace();
}
Ibusiness businessImpl = (Ibusiness)contextRefreshedEvent.getApplicationContext().getBean("serviceBusinessImpl");
IMQComsumer comsumer = MQFactory.getMQComsumer(type,address, businessImpl,topic+"_"+Tag.getName(4),topic, Tag.getName(4), Tag.getName(5),true, producer);
}
}
}