Spring 之事件發佈與監聽

1.同步處理spring

  a.引入Spring的pom依賴(略)app

  b.建立Event事件類異步

public class TestEvent1 extends ApplicationEvent { private String message; public TestEvent1(Object source, String message) { super(source); this.message = message; } public String getMessage() { return message; } }
public class TestEvent2 extends ApplicationEvent { private String message; public TestEvent2(Object source, String message) { super(source); this.message = message; } public String getMessage() { return message; } }

 

  c.建立Listener監聽類ide

@Component public class TestListener1 implements ApplicationListener<TestEvent1> { @Override public void onApplicationEvent(TestEvent1 event) { System.out.println("[TestListener1] start ......"); try { Thread.sleep(2000); } catch (Exception e) { e.printStackTrace(); } System.out.println("[TestListener1] receive event: " + event.getMessage()); System.out.println("[TestListener1] end ......"); } }
@Component public class TestListener2 implements ApplicationListener<TestEvent2> { @Override public void onApplicationEvent(TestEvent2 event) { System.out.println("[TestListener2] start ......"); try { Thread.sleep(2000); } catch (Exception e) { e.printStackTrace(); } System.out.println("[TestListener2] receive event: " + event.getMessage()); System.out.println("[TestListener2] end ......"); } }

 

  d.使用測試

@Component public class CommonEventHandler { @Autowired private ApplicationEventPublisher applicationEventPublisher; public void sendEvent1(String msg){ ApplicationEvent event = new TestEvent1(this,msg); applicationEventPublisher.publishEvent(event); } public void sendEvent2(String msg){ ApplicationEvent event = new TestEvent2(this,msg); applicationEventPublisher.publishEvent(event); } }

 

  e.測試this

public class App { public static void main( String[] args ) { ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); CommonEventHandler handler = (CommonEventHandler) context.getBean("commonEventHandler"); for (int i = 0; i < 20; i++) { if(i % 3 == 0){ handler.sendEvent1("[Event1]count: " + i); continue; } handler.sendEvent2("[Event2]count: " + i); } } }

 

 

2.異步處理spa

  a.在spring.xml中加入線程池相關配置線程

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd">

    <!-- 自動掃描的包名 -->
    <context:component-scan base-package="com.wode" />

    <!-- 開啓AOP代理 -->
    <aop:aspectj-autoproxy proxy-target-class="true" />

    <!--開啓註解處理器 -->
    <context:annotation-config>
    </context:annotation-config>

    <!-- 線程池異步任務 -->
    <task:annotation-driven executor="executor"/>
    <task:executor id="executor" pool-size="10" queue-capacity="100"/>

</beans>

 

  b.在 Listener 的 onApplicationEvent 方法上加上 @Async 註解代理

@Component public class TestListener1 implements ApplicationListener<TestEvent1> { @Async @Override public void onApplicationEvent(TestEvent1 event) { System.out.println("[TestListener1] start ......"); try { Thread.sleep(2000); } catch (Exception e) { e.printStackTrace(); } System.out.println("[TestListener1] receive event: " + event.getMessage()); System.out.println("[TestListener1] end ......"); } }
@Component public class TestListener2 implements ApplicationListener<TestEvent2> { @Async @Override public void onApplicationEvent(TestEvent2 event) { System.out.println("[TestListener2] start ......"); try { Thread.sleep(2000); } catch (Exception e) { e.printStackTrace(); } System.out.println("[TestListener2] receive event: " + event.getMessage()); System.out.println("[TestListener2] end ......"); } }
相關文章
相關標籤/搜索