解决:
不用 MQ 在 JVM spring 内进行event 发布订阅
App.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
package demo.spevent; import java.util.logging.Level; import java.util.logging.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; @SpringBootApplication public class App { private static final Logger LOG = Logger.getLogger(App.class.getName()); public static void main(String[] argv) { SpringApplication.run(App.class, argv); } @Bean public CommandLineRunner cmdRunner(ItemService s) { return (argv) -> { s.updateItem(new Item(2)); }; } @Component public static class L { @EventListener public void onChange(ItemStatusChangeEvent e) { LOG.log(Level.INFO, "onChange e:{0}", e); } } @Component public static class L2 { @EventListener public void onChange2(ItemStatusChangeEvent e) { LOG.log(Level.INFO, "onChange2 e:{0}", e); } } @Service public static class ItemService { private static final Logger LOG = Logger.getLogger(ItemService.class.getName()); private final ApplicationEventPublisher eventPub; @Autowired public ItemService( ApplicationEventPublisher eventPub) { this.eventPub = eventPub; } public void updateItem(Item i) { LOG.info("updateItem ...."); eventPub.publishEvent(new ItemStatusChangeEvent(i)); } } public static class Item { public Item(int status) { this.status = status; } int status; public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } @Override public String toString() { return "Item{" + "status=" + status + '}'; } } public static class ItemStatusChangeEvent { private final Item item; public ItemStatusChangeEvent(Item i) { this.item = i; } @Override public String toString() { return "ItemStatusChangeEvent{" + "item=" + item + '}'; } } } |
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>demo</groupId> <artifactId>spevent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> </project> |
参考:
http://www.sohu.com/a/195441807_355142