Guava学习笔记:EventBus

EventBus基本用法:

使用Guava之后, 如果要订阅消息, 就不用再继承指定的接口, 只需要在指定的方法上加上@Subscribe注解即可。代码如下:

消息封装类:

1public class TestEvent {     2        private final int message;     3        public TestEvent(int message) {         4        this.message = message; 5        System.out.println("event message:"+message); 6    }     7    public int getMessage() {  8        return message; 9    } 10}

消息接受类:

1public class EventListener { 2    public int lastMessage = 0; 3 4    @Subscribe     5    public void listen(TestEvent event) { 6        lastMessage = event.getMessage(); 7        System.out.println("Message:"+lastMessage); 8    }     9    public int getLastMessage() {       10        return lastMessage; 11    } 12}

测试类及输出结果:

1public class TestEventBus { 2    @Test     3    public void testReceiveEvent() throws Exception { 4 5        EventBus eventBus = new EventBus("test"); 6        EventListener listener = new EventListener(); 7 8        eventBus.register(listener); 9 10        eventBus.post(new TestEvent(200)); 11        eventBus.post(new TestEvent(300)); 12        eventBus.post(new TestEvent(400)); 13 14        System.out.println("LastMessage:"+listener.getLastMessage()); 15 16    } 17} 18//输出信息 19event message:200 20Message:200 21event message:300 22Message:300 23event message:400 24Message:400 25LastMessage:400

MultiListener的使用:

只需要在要订阅消息的方法上加上@Subscribe注解即可实现对多个消息的订阅,代码如下:

1public class MultipleListener { 2    public Integer lastInteger;   3    public Long lastLong;   4    5    @Subscribe   6    public void listenInteger(Integer event) {   7        lastInteger = event;  8        System.out.println("event Integer:"+lastInteger); 9    }   10    11    @Subscribe   12    public void listenLong(Long event) {   13        lastLong = event;  14        System.out.println("event Long:"+lastLong); 15    }   16    17    public Integer getLastInteger() {   18        return lastInteger;   19    }   20    21    public Long getLastLong() {   22        return lastLong;   23    }   24}

测试类:

1public class TestMultipleEvents { 2    @Test   3    public void testMultipleEvents() throws Exception {   4        5        EventBus eventBus = new EventBus("test");   6        MultipleListener multiListener = new MultipleListener();   7        8        eventBus.register(multiListener);   9        10        eventBus.post(new Integer(100)); 11        eventBus.post(new Integer(200));   12        eventBus.post(new Integer(300));   13        eventBus.post(new Long(800));  14        eventBus.post(new Long(800990));   15        eventBus.post(new Long(800882934));   16        17        System.out.println("LastInteger:"+multiListener.getLastInteger()); 18        System.out.println("LastLong:"+multiListener.getLastLong()); 19    }    20} 21 22//输出信息 23event Integer:100 24event Integer:200 25event Integer:300 26event Long:800 27event Long:800990 28event Long:800882934 29LastInteger:300 30LastLong:800882934

Dead Event:

如果EventBus发送的消息都不是订阅者关心的称之为Dead Event。实例如下:

1public class DeadEventListener { 2    boolean notDelivered = false;   3        4    @Subscribe   5    public void listen(DeadEvent event) {   6         7        notDelivered = true;   8    }   9    10    public boolean isNotDelivered() {   11        return notDelivered;   12    }   13}

测试类:

1public class TestDeadEventListeners { 2    @Test   3    public void testDeadEventListeners() throws Exception {   4        5        EventBus eventBus = new EventBus("test");                6        DeadEventListener deadEventListener = new DeadEventListener();   7        eventBus.register(deadEventListener);   8 9        eventBus.post(new TestEvent(200));          10        eventBus.post(new TestEvent(300));         11        12        System.out.println("deadEvent:"+deadEventListener.isNotDelivered()); 13 14    }   15} 16 17//输出信息 18event message:200 19event message:300 20deadEvent:true

说明:如果没有消息订阅者监听消息, EventBus将发送DeadEvent消息,这时我们可以通过log的方式来记录这种状态。

Event的继承:

如果Listener A监听Event A, 而Event A有一个子类Event B, 此时Listener A将同时接收Event A和B消息,实例如下:

Listener 类:

1public class NumberListener {   2        3    private Number lastMessage;   4    5    @Subscribe   6    public void listen(Number integer) {   7        lastMessage = integer;  8        System.out.println("Message:"+lastMessage); 9    }   10    11    public Number getLastMessage() {   12        return lastMessage;   13    }   14}   15 16public class IntegerListener {   17        18    private Integer lastMessage;   19    20    @Subscribe   21    public void listen(Integer integer) {   22        lastMessage = integer;  23        System.out.println("Message:"+lastMessage); 24    }   25    26    public Integer getLastMessage() {   27        return lastMessage;   28    }   29}

测试类:

1public class TestEventsFromSubclass { 2    @Test   3    public void testEventsFromSubclass() throws Exception {   4        5        EventBus eventBus = new EventBus("test");   6        IntegerListener integerListener = new IntegerListener();   7        NumberListener numberListener = new NumberListener();   8        eventBus.register(integerListener);   9        eventBus.register(numberListener);   10        11        eventBus.post(new Integer(100));   12        13        System.out.println("integerListener message:"+integerListener.getLastMessage()); 14        System.out.println("numberListener message:"+numberListener.getLastMessage()); 15               16        eventBus.post(new Long(200L));   17        18        System.out.println("integerListener message:"+integerListener.getLastMessage()); 19        System.out.println("numberListener message:"+numberListener.getLastMessage());         20    }   21} 22 23//输出类 24Message:100 25Message:100 26integerListener message:100 27numberListener message:100 28Message:200 29integerListener message:100 30numberListener message:200

说明:在这个方法中,我们看到第一个事件(新的整数(100))是收到两个听众,但第二个(新长(200 l))只能到达NumberListener作为整数一不是创建这种类型的事件。可以使用此功能来创建更通用的监听器监听一个广泛的事件和更详细的具体的特殊的事件。

 一个综合实例:

1public class UserThread extends Thread { 2    private Socket connection; 3    private EventBus channel; 4    private BufferedReader in; 5    private PrintWriter out; 6 7    public UserThread(Socket connection, EventBus channel) { 8        this.connection = connection; 9        this.channel = channel; 10        try { 11            in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 12            out = new PrintWriter(connection.getOutputStream(), true); 13        } catch (IOException e) { 14            e.printStackTrace(); 15            System.exit(1); 16        } 17    } 18 19    @Subscribe 20    public void recieveMessage(String message) { 21        if (out != null) { 22            out.println(message); 23            System.out.println("recieveMessage:"+message); 24        } 25    } 26 27    @Override 28    public void run() { 29        try { 30            String input; 31            while ((input = in.readLine()) != null) { 32                channel.post(input); 33            } 34        } catch (IOException e) { 35            e.printStackTrace(); 36        } 37         38        //reached eof 39        channel.unregister(this); 40        try { 41            connection.close(); 42        } catch (IOException e) { 43            e.printStackTrace(); 44        } 45        in = null; 46        out = null; 47    } 48} 49 50mport java.io.IOException; 51import java.net.ServerSocket; 52import java.net.Socket; 53 54import com.google.common.eventbus.EventBus; 55 56public class EventBusChat { 57    public static void main(String[] args) { 58        EventBus channel = new EventBus(); 59        ServerSocket socket; 60        try { 61            socket = new ServerSocket(4444); 62            while (true) { 63                Socket connection = socket.accept(); 64                UserThread newUser = new UserThread(connection, channel); 65                channel.register(newUser); 66                newUser.start(); 67            } 68        } catch (IOException e) { 69            e.printStackTrace(); 70        } 71    } 72}

说明:用telnet命令登录:telnet 127.0.0.1 4444 ,如果你连接多个实例你会看到任何消息发送被传送到其他实例。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )