0

この状況を解決するためのアイデアが必要です。シリアルポート経由でデータをキャプチャする Swing アプリケーションを作成しました。このキャプチャはいくつかのアラームを発生させ (JPane でレンダリングされます)、同時にこの情報はデータベースに保存され、統計情報を提供します。 (JFreechart と JasperReports を使用)。現在、同じ情報を Web ベース インターフェイスで表示したいと考えており、JSF + Primefaces over Apache Tomcat 7 アプリケーションを考えています。

統計の問題ではありません。問題は、シリアル ポートでイベントが発生したことを Web アプリケーションに通知して、Swing アプリによって作成されたキャプチャがクライアントのブラウザに表示されるのと同じアラームを表示する方法です。最終的なユーザーは、管理目的でローカル ビュー (Swing) と Web ビューの両方の形式を維持したいと考えています。

私たちの提案は正しいものですか (Swing -> JSF + Primefaces)?, 他の選択肢はありますか?

アイデアをお寄せいただきありがとうございます

4

1 に答える 1

0

問題を解決する方法を見つけました。最初に見つけたソリューションをここに残しました。 1. ソリューションをテストするために、Tomcat 7、Netbeans 7.3、および PrimeFaces 3.5 の代わりに Glassfish 3.1.2.2 を使用しました。 2. このチュートリアルに基づいてサンプル アプリケーションを作成しました。3. PrimeFaces デモページの PimePush Counter サンプルを実装しました。4. シリアル ポート キャプチャのアクションをシミュレートするボタンを備えた Swing アプリケーションを作成しました。このアプリは ws を使用して Web アプリケーションにコンテンツをプッシュします。5. GF では、comet と 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));
    }
}

ここでは、WS と Managedbean との通信に使用される EJB を示します。

@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 デモとまったく同じです。

私が作ったswingアプリケーションのボタンを押すたびに、接続されている各マシンでカウンターが更新されます。これが最終的なアプリケーションのアイデアです. しかし繰り返しになりますが、swing アプリケーションの ws-client が Web アプリケーションを見つけられるようにするために、なぜ Web アプリケーションを再デプロイする必要があるのでしょうか? その動作を回避するために、GF サーバーに欠けている構成はありますか?

于 2013-05-20T01:58:58.797 に答える