2013-05-10 78 views
0

我只是需要和想法來解決這種情況:我們做了一個Swing應用程序來通過串口捕獲數據,這個捕獲引發了一些警報(在JPane中呈現),同時這個信息存儲在數據庫中以提供一些統計信息(使用JFreechart和JasperReports)。現在,我們希望在Web基礎接口中呈現相同的信息,並且我們正在考慮通過Apache Tomcat 7應用程序的JSF + Primefaces。Swing,串行端口和JSF

統計數據不是問題,我們關心的是如何通知Web應用程序事件在串口中觸發,以顯示在客戶端瀏覽器中顯示的Swing應用程序捕獲的相同警報? 。最終用戶想要維護兩種格式:本地視圖(Swing)和用於經理目的的Web視圖。

我們是否提出了正確的(Swing - > JSF + Primefaces)?,還有其他的選擇嗎?

感謝任何想法的進步

+0

看起來合理 - Primefaces擁有[comet support](http://www.primefaces.org/showcase/ui/home.jsf),我猜這將是至關重要的,因爲服務器需要通知clinets關於異步事件。 – dratewka 2013-05-10 14:04:59

+0

好的,但我該如何將異步事件發送到Web應用程序? – 2013-05-10 14:13:38

+0

那麼這取決於這些事件的數量。一種可能性是創建託管在您的服務器上的Web服務,該應用程序可以調用該服務來通知事件。另一種可能性是在Web服務器的單獨線程上運行端口監視邏輯。 – dratewka 2013-05-10 20:04:13

回答

0

我找到了解決問題的方法。我在這裏留下了我找到的解決方案,第一個: 1.爲了測試解決方案,我使用了Glassfish 3.1.2.2而不是Tomcat 7,Netbeans 7.3和PrimeFaces 3.5 2.我根據這個tutorial做了一個示例應用程序。 3.我實現了PrimeFaces演示頁面的PimePush Counter示例。 4.我做了一個Swing應用程序,用一個按鈕來模擬串行端口捕捉的動作,這個應用程序使用ws來推送Web應用程序中的內容。 5. GF支持啓用彗星和Web套接字。

但是,有一個問題,每次我重新啓動Glassfish時,都需要取消部署應用程序,並且他們需要重新部署才能使Web服務可用。爲什麼這個?,我錯過了一些事件?

下面的代碼:

的WS類:

@WebService(serviceName = "BotonService") 
@Stateless 
public class BotonService { 

    private boolean push = false; 

    @EJB 
    private ServiceShare servicio; 

    /** 
    * This is a sample web service operation 
    */ 
    @WebMethod(operationName = "hello") 
    public String hello(@WebParam(name = "name") String txt) { 
     return "Hello " + txt + " !"; 
    } 

    /** 
    * Web service operation 
    */ 
    @WebMethod(operationName = "setPush") 
    public void setPush(@WebParam(name = "push") boolean push) { 
     this.push = push; 
     servicio.setPush(push); 
     servicio.firePush(); 
    } 

    /** 
    * Web service operation 
    */ 
    @WebMethod(operationName = "getPush") 
    public Boolean getPush() { 
     return this.push; 
    } 
} 

這裏ManagedBean類:

@Stateless 
@ManagedBean(name = "globalCounter") 
@ApplicationScoped 
public class GlobalCounterBean implements Serializable { 

    private int count; 
    private String CHANNEL = "/counter"; 

    public int getCount() { 
     return count; 
    } 

    public void setCount(int count) { 
     this.count = count; 
    } 

    public synchronized void increment() { 
     count++; 
     PushContext pushContext = PushContextFactory.getDefault().getPushContext(); 
     pushContext.push(CHANNEL, String.valueOf(count)); 
    } 
} 

而且這裏的EJB使用與Managedbean溝通WS:

@Stateless 
public class ServiceShare { 

    @EJB 
    private GlobalCounterBean counter; 

    private boolean push = false; 

    public boolean getPush() { 
     return push; 
    } 

    public void setPush(boolean push){ 
     this.push = push; 
    } 

    public void firePush(){ 
     if(this.push){ 
      counter.increment(); 
     } 
    } 
} 

JSF頁面與PrimeFaces演示中的頁面完全相同。

每當我按下我製作的搖擺應用程序中的按鈕,計數器就會在每臺連接的機器上更新,這就是最終應用程序的想法。但是,爲什麼我必須重新部署Web應用程序,以便swing應用程序中的ws-client可以找到它?有沒有我在GF服務器中缺少的配置來避免這種行爲?