番石榴的EventBus –简单的发布者/订阅者

在查看Google的Guava Libraries 版本10的最新版本时,我注意到EventBus的添加。 这是发布-订阅样式消息传递系统的轻量级实现。 这类似于JMS提供的发布-订阅模型,但是消息保留在应用程序内,而不是在外部广播。

EventBus允许您在程序中创建对象可以订阅的流; 然后,他们将接收发布到这些流的消息。 尽管使用诸如单例之类的模式来重新创建对象间通信并不是特别困难,但EventBus确实提供了一种特别简单且轻巧的机制。 单例还使具有单一类型的多个事件总线更加困难,并且
很难测试。

例如,我将使用几个人将通过telnet连接到的套接字创建一个简单的多用户聊天程序。 我们将简单地创建一个EventBus作为通道。 用户发送给系统的任何消息都将发布给所有其他用户。

所以这是我们的UserThread对象:

class UserThread extends Thread {private Socket connection;private EventBus channel;private BufferedReader in;private PrintWriter out;public UserThread(Socket connection, EventBus channel) {this.connection = connection;this.channel = channel;try {in = new BufferedReader(new InputStreamReader(connection.getInputStream()));out = new PrintWriter(connection.getOutputStream(), true);} catch (IOException e) {e.printStackTrace();System.exit(1);}}@Subscribepublic void recieveMessage(String message) {if (out != null) {out.println(message);}}@Overridepublic void run() {try {String input;while ((input = in.readLine()) != null) {channel.post(input);}} catch (IOException e) {e.printStackTrace();}//reached eofchannel.unregister(this)try {connection.close();} catch (IOException e) {e.printStackTrace();}in = null;out = null;}
}

可以看出,这只是一个简单的线程对象,其中包含充当通道的EventBus和用户的Socket。 然后,run方法通过调用EventBus上的post方法简单地读取套接字并将消息发送到通道。

然后,通过添加带有@Subscribe批注的公共方法来实现接收消息(请参见上文)。 这表示EventBus在收到方法参数中给定类型的消息后调用此方法。 我在这里发送字符串,但是可以使用其他对象。

GOTCHA :用@Subscribe注释的方法必须是公共的。

接收功能接收消息并将其写出到用户的连接中。 当然,这还将回送已发送给原始用户的消息,因为UserThread对象本身将接收其发布的消息。

剩下的就是创建一个简单的服务器对象,该对象侦听连接并根据需要创建UserThread对象。

public class EventBusChat {public static void main(String[] args) {EventBus channel = new EventBus();ServerSocket socket;try {socket = new ServerSocket(4444);while (true) {Socket connection = socket.accept();UserThread newUser = new UserThread(connection, channel);channel.register(newUser);newUser.start();}} catch (IOException e) {e.printStackTrace();}}
}

如图所示,这将创建通道,接受用户连接并将其注册到EventBus。 这里要注意的重要代码是使用UserThread对象作为参数调用register方法。 该调用在EventBus上预订对象,并指示它可以处理消息。

服务器启动后,用户即可使用telnet命令连接到聊天服务器:

telnet 127.0.0.1 4444

而且,如果您连接多个实例,您将看到发送的任何消息都被中继到其他实例。

看完此示例后,您可能想知道EventBus有什么用。 一个很好的例子是在用户界面和后端代码之间保持非常松散的耦合。 用户输入将生成一条消息,例如调整大小,失去焦点或关闭。 然后,后端组件可以简单地订阅这些事件并适当地处理它们。 官方文档还列出了许多其他用途。

注意: EventBus并非用于通用的发布者-订阅者通信,这只是API交互方式的一个示例。

原文: http : //insightfullogic.com/blog/2011/oct/10/eventbus/

参考: Guava的EventBus –来自我们LCG博客Java用户组的 JCG合作伙伴 Andriy Andrunevchyn的简单发布者/订阅者 。

翻译自: https://www.javacodegeeks.com/2013/06/guavas-eventbus-simple-publishersubscriber.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

apscheduler -定时任务

https://apscheduler.readthedocs.io/en/latest/userguide.html 简单的使用方式为: from apscheduler.schedulers.blocking import BlockingScheduler sched BlockingScheduler()sched.add_job(ff_task,cron,hour0-1,8-23,minute28)sched.add_job(avor_task, cron,…

java迭代器 异常_java迭代器失效 | 学步园

今天在测试代码的时候出现一个异常ConcurrentModificationException,该异常网上很多解决方案以及解释,但我还是再记录一遍吧。代码抽象出来是这样的:import java.util.ArrayList;import java.util.List;public class Test {public static voi…

CSS3中的圆角边框属性详解(border-radius属性)

实例向 div 元素添加圆角边框:div{border:2px solid;border-radius:25px;}页面底部有更多实例。浏览器支持IEFirefoxChromeSafariOperaIE9 、Firefox 4 、Chrome、Safari 5 以及 Opera 支持 border-radius 属性。定义和用法border-radius 属性是一个简写属性&#x…

83.const与类

const常量对象,无法改变数据,只能引用尾部带const方法类的成员如果是const,可以默认初始化,也可以构造的初始化,不可在构造函数内部初始化类中的const成员,无法直接修改,可以间接修改类的成员函数const三种情形:1.返回值const,2.返回常量,3.参数const,可读不可写,尾部const,常量…

使用Apache CXF开发RESTful服务

介绍 如您所知,有两种开发Web服务的方法 简单对象访问协议(SOAP) 代表性状态转移(REST) 在继续学习如何使用Apache CXF创建基于REST的Web服务之前,我们将了解什么是REST。 REST不是一项技术,…

CTU 2017 J - Punching Power (二分图匹配)

题意: 公园管理层最终决定在公园的各个战略位置安装一些流行的拳击机。实际上,为了弥补以前缺少的机器,他们决定安装尽可能多的机器。令人惊讶的是,公园不会被新机器堵塞,因为对于机器的位置存在一些非常严重的法律限制…

UI设计师必知:link和@import引用css文件方法的区别

<link>元素所参考的样式用户可以自由的选择加以改变&#xff0c;而导入的样式表单就自动的与剩下的样式表融合在一起了CSS与HTML文档结合的4中方法&#xff1a;1 使用<link>元素链接到外部的样式文件2 在<head>元素中使用"style"元素来指定3 使用C…

javascript mqtt 发布订阅消息

js client使用paho-mqtt&#xff0c;官网地址&#xff1a;http://www.eclipse.org/paho/&#xff0c;参考http://www.eclipse.org/paho/clients/js/官网给出例子Getting Started&#xff0c;写出下面简单的测试代码。 <!DOCTYPE html> <html> <head> <met…

linux java jar war_简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包WAR(Web Archive file)网络应用程序文件&#xff0c;是与平台无关的文件格式&#xff0c;它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程&#xff0c;都是打成WAR包进行发布的。War是一个web模块&#xff0c;其中需要包括WEB-INF&#xff0…

Spring Web应用程序的最大缺陷

在其应用程序中使用Spring Framework的开发人员很好地谈论了依赖注入的好处。 不幸的是&#xff0c;他们并不是很好地利用它的好处&#xff0c;例如单一负责的原则和在应用程序中关注点的分离 。 如果我们看一下任何基于Spring的Web应用程序&#xff0c;很可能会通过使用以下常…

用C++调用tensorflow在python下训练好的模型(centos7)

本文主要参考博客https://blog.csdn.net/luoyexuge/article/details/80399265 [1] bazel安装参考:https://blog.csdn.net/luoyi131420/article/details/78585989 [2] 首先介绍下自己的环境是centos7&#xff0c;tensorflow版本是1.7&#xff0c;python是3.6&#xff08;anacond…

纯CSS实现圆角边框

HTML部分&#xff1a;<body><div> <b class”t1″></b> <b class”t2″></b> <b class”t3″></b> <b class”t4″></b> <div class”cont”>这边输入实际内容</div> <b clas…

ActiveMQ producer同步/异步发送消息

http://activemq.apache.org/async-sends.html producer发送消息有同步和异步两种模式&#xff0c;可以通过代码配置&#xff1a; ((ActiveMQConnection)connection).setUseAsyncSend(true); producer默认是异步发送消息。在没有开启事务的情况下&#xff0c;producer发送持久化…

Java Priority Queue(PriorityQueue)示例

我们知道&#xff0c; 队列如下&#xff1a;F irst- 我正˚First-UT模型&#xff0c;但有时我们需要处理的基础上&#xff0c;优先级队列中的对象。 例如&#xff0c;假设我们有一个应用程序可以为日常交易生成股票报告&#xff0c;并处理大量数据并花费时间来处理它。 因此&am…

css未知尺寸的图片的水平和垂直居中

纯CSS实现未知尺寸的图片水平和垂直居中.box { /*非IE的主流浏览器识别的垂直居中的方法*/ display: table-cell; vertical-align:middle; /*设置水平居中*/ text-align:center; /* 针对IE的Hack */ *display: block; *font-size:26…

heap 的一些用法

noip 合并果子 #include<bits/stdc.h> using namespace std; int heap[maxn]; int size0; void input(int d) {heap[size]d;push_heap(heap,heapsize,greater<int>()); } int get() {pop_heap(heap,heapsize,greater<int>());//pop_heap(heap,heapsize);ret…

java 反射 new class_Java高级特性-反射:不写死在代码,还怎么 new 对象?

反射是 Java 的一个高级特性&#xff0c;大量用在各种开源框架上。在开源框架中&#xff0c;往往以同一套算法&#xff0c;来应对不同的数据结构。比如&#xff0c;Spring 的依赖注入&#xff0c;我们不用自己 new 对象了&#xff0c;这工作交给 Spring 去做。然而&#xff0c;…

EF Core利用Scaffold从根据数据库生成代码

在EF6 之前的时代&#xff0c;如果需要从数据库中生成代码&#xff0c;是可以直接在界面上操作的&#xff0c;而到了EF Core的时代&#xff0c;操作方式又有更简便的方式了&#xff0c;我们只需要记住以下这条指令。 Scaffold-DbContext "Server服务器地址;Database数据库…

如何通过CSS开启硬件加速来提高网站性能

你知道我们可以在浏览器中用css开启硬件加速&#xff0c;使GPU (Graphics Processing Unit) 发挥功能&#xff0c;从而提升性能吗&#xff1f; 现在大多数电脑的显卡都支持硬件加速。鉴于此&#xff0c;我们可以发挥GPU的力量&#xff0c;从而使我们的网站或应用表现的更为流畅…

Spring Security应用程序中的su和sudo

很久以前&#xff0c;我从事的项目具有很强大的功能。 有两个角色&#xff1a;用户和主管。 主管可以以任何方式更改系统中的任何文档&#xff0c;而用户则更受工作流约束的限制。 当普通用户对当前正在编辑和存储在HTTP会话中的文档有疑问时&#xff0c;主管可以介入&#xff…