EventBus 发布/订阅 机制的 java 实现

maven导入依赖:

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>

 

应用场景: 一个消息的发布 可以有根据消息内容选择不同的处理机制。

register(); 将服务注册到EventBus中

post();讲消息发送到EventBus中

unregister();移除注册的服务

一个消息的发布,会被EventBus注册过的服务同时订阅,通过消息的判断可以断定该消息由哪个或哪几个服务去处理。

 

实现:

定义一个监听的内容接口为MessageConfig。

 

public interface MessageConfig {

    String getCode();
    
    String getTradeCode();
    
    JmsMsgVO getJmsMsg();
    
}
View Code

 

创建一个BaseMessage监听的参数类 去实现MessageConfig接口。

 

public class BaseMessage implements MessageConfig{
    
    private String code;
    
    private String tradeCode;
    
    private JmsMsgVO jmsMsg;
    
    public BaseMessage (String code, JmsMsgVO jmsMsg, String tradeCode) {
        this.code = code;
        this.jmsMsg = jmsMsg;
        this.tradeCode = tradeCode;
    }
    
    @Override
    public String getTradeCode() {
        return tradeCode;
    }


    public void setTradeCode(String tradeCode) {
        this.tradeCode = tradeCode;
    }


    public void setCode(String code) {
        this.code = code;
    }

    public void setJmsMsg(JmsMsgVO jmsMsg) {
        this.jmsMsg = jmsMsg;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public JmsMsgVO getJmsMsg() {
        return jmsMsg;
    }

}
View Code

 

创建一个接口Listerner 并编辑一个抽象方法,监听MessageConfig(变相的监听所有实现MessageConfig接口的消息类)

public interface Listerner {
	void listen(MessageConfig messageCode);
}

  

最后实现一个订阅服务,用以接收消息后的处理业务。该类必须由ioc容器管理(必须加上注解@Component),且重写接口Listerner的方法并用注解@Subscribe(该注解表示订阅后具体是哪个方法来处理业务的)

 

@Component
public class JdEvent implements Listerner{
    
    @Subscribe
    @Transactional(rollbackFor=Exception.class)
    public void listen(MessageConfig messageCode) {
                System.out.println(messageCode);
        }
    }
View Code

 

完成上诉后,这套体系的订阅 消息体 发布 3个角色都已经完成了。最后编写个Demo 把服务类先注册到EventBus后,利用EventBus.post的方法发送任何实现MessageConfig这个消息接口的类的内容即可。

可以尝试开发多个订阅者同时订阅,每一次的消息发布都会被注册到EventBus中的订阅者接收到,具体要用哪个订阅者处理业务就要靠代码去判断实现了。

posted @ 2018-02-26 16:49  粗鲁师太  阅读(510)  评论(0编辑  收藏  举报