2015-01-26 83 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模式,它提供了快速的線程間消息傳遞,如果使用正確,開銷很小。