2015-01-26 79 views
0

我在计划阶段有一个非GUI应用程序,它将充当RS485网络上从属设备的控制器。每个从属设备都是可寻址的,可以做简单的事情,如在简单的LCD屏幕上显示文本,接受来自键盘的文本甚至不同类型的读卡。这些设备具有“不讲话”的通信方式,这意味着控制器正在对“线路”上的每个设备进行轮询。决定使用哪种Java事件模式/模型

所以有一个通信点,一个RS485转以太网转换器设备的TCP插座。

我以前写过类似的东西,但是这是在事件驱动任何事情之前,也没有任何线程。我们在这里谈论System V Unix。 :-)

所以,我在Java中使用线程搞砸了,并且在这里做了一些研究。了解了Observable类和Observer接口。对我来说看起来不错,但为什么我想在可寻址时通知我的所有观察者?如果我使用多线程的方法,我不想用所有不适用于他们的数据唤醒我的所有线程。

所以我的问题是:哪一个更好的方式去这里? Observable/Observer很简单,可以让我马上开始,但对于所有线程/观察者来说,要唤醒那些不适合他们的消息似乎是一种浪费,即使它只是简单地使用'if '声明来测试传入的对象反对'this'。实现AWT ActionListener方法还是以EventObject开始更好?还有什么?

+0

听起来像你想要一个发布/订阅模式 – Ascalonian 2015-01-26 18:31:13

+0

检查出JMS,[RabbitMQ](https://www.rabbitmq.com/tutorials/tutorial-three-java.html),[HornetQ](http:// hornetq.jboss.org/),Google的[EventBus](https://code.google.com/p/guava-libraries/wiki/EventBusExplained),[Apache Camel](http://camel.apache.org/ publish-subscribe-channel.html) – Ascalonian 2015-01-26 18:40:48

+0

签出项目Reactor:https://github.com/reactor/reactor – 2015-01-26 18:57:07

回答

0

我认为您的应用程序接收客户端请求并决定要联系哪个设备的部分不需要多线程。当然,你可以使用awt ActionListener,但它也很容易推出你自己的事件循环。

至于与设备本身的通信,如果速度慢,它可能是可行的,因为它发生在一个单独的线程(工作线程),所以它不会阻止事件循环。您通常会使用由线程池支持的ExecutorService。

发回响应会直接从工作线程发送响应数据,或者它可能会返回到事件循环,从那里将其发送回客户端。

客户端现在可以实现为同步,等待响应的空闲或异步,立即返回,通常是一个Future对象,稍后可以对结果进行轮询。

还检查了Disruptor模式,它提供了快速的线程间消息传递,如果使用正确,开销很小。