0

センシングデバイスの分散ネットワークを設計しています。これらのデバイスはログを生成し、中央データベースに送信します。ログメッセージの転送にJMSを使用しています。メインデータベースサーバーは、着信メッセージを処理するためにMDB(Message Driven Bean)を実行します。クライアントはGPRSでデータを送信しています。問題は、クライアントにネットワークの問題を処理させたくないということです。クライアントマシン上でローカルに実行され、クライアントからメッセージをブロックせずにすぐに取得して、代わりに試行するリレーサービスが必要です(ネットワークがダウンしている場合は、しばらくしてからもう一度送信してみてください)。

メッセージは単純なJavaオブジェクトです。

public class Message {
    public int x;
    public int y;
    public int z;
}

クライアント:

Message msg = new Message();
while (True) {
    /* sense data */
    msg = get_data_from_environment();

    /* send data to local relay service
     * This is non blocking call */
    relay_service.send(msg);
}

ローカルリレーサービス:

while (True) {
    /* get message from local client */
    msg = get_message_from_local_client();

    result = send_msg_to_JMS_server(msg);

    /* if not successful, persist it on a local queue and try some other time */
    if (result.is_sent() != True)
        store_msg_on_disk(msg);
}

このようなメッセージサービスはありますか、それとも自分でリレーサービスを書くべきですか?

この場合、JMSを使用するのは良いですか?メッセージを送信するために独自のソケットレベルプロトコルを設計する必要がありますか?

4

1 に答える 1

1

編集

このようなメッセージサービスはありますか、それとも自分でリレーサービスを書くべきですか?

通常、これらのタイプのリレーサービスは、自分がやりたいことを正確に実行するソフトウェアを見つけることができない限り、自分でコーディングする必要があります。このような場合、これは珍しいことではありません。

この場合、JMSを使用するのは良いですか?

はい、JMSはミドルウェアとして使用するのに非常に優れたソリューションです。多くのクライアントにJMSに接続して、メッセージを送信させることができます。サーバープログラムを実行しているときに、JMSからメッセージを読み取り、それを処理して、ネットワークの問題がある場合はそれを処理します。また、ボーナスとして、サーバープログラムは、完全に失敗した場合にクライアントにメッセージを送り返します。

メッセージを送信するために独自のソケットレベルプロトコルを設計する必要がありますか?

どんなメッセージを送りたいのか、まだわかりません。SMTP、SMS、HTTPなどの標準的なトランスポートを使用している場合は、配信の送信と確認に役立つライブラリがあります。カスタムプロトコルを使用して送信する必要がある場合は、独自のソケットレベルコードを作成する必要があります。

コード例を見ると、クライアントがメッセージをJMSに送信することに成功したかどうかを知りたいことがわかります。送信されなかった場合は、ディスクに保存して、後で再試行してください。

メッセージが受信されたかどうかをJMSサーバーが自動確認します。これはJMSメッセージから確認できます。失敗した場合は、JMSExceptionが発生します。メッセージをディスクに保存する場合は、いつ再送信するかを知る必要があります。送信するには、タイマーが必要になるか、次のメッセージで再送信する必要があります。

于 2012-05-23T14:46:22.703 に答える