• ベストアンサー

メッセージキューイングとは?

すみません。 メッセージキューイングとは、どのように使用するものでしょうか? まだ、開発経験が浅い為、このような質問方法でいいかもよく分かっていないのですが、どなたか分かりやすく回答頂けないでしょうか? 例えば、同サーバー(Win2003サーバー)内で、AとBのプロセスがあった場合にAからメッセージを発行し、Bはそのメッセージを受け取って処理を開始するみたいに使用出来るのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

とりあえず検索及び考えたところで... 1)ミドルウエアソフト(MSMQ)を使用する。 http://www.microsoft.com/japan/msdn/msmq/ 2).NET Fameworkの System.Messaging クラスを使用する。 http://www.microsoft.com/japan/msdn/net/bda/bdadotnetasync1.aspx 3)データベースでメッセージテーブルを作成・使用する。  メッセージ識別ID  呼出プログラム(プロセス)ID  実行プログラム(プロセス)ID  起動時パラメータ  作成日時  実行日時  処理フラグ 等をフィールド定義 使用者による実行制限制御を行う場合は、ユーザーID 等を 追加する。  4)共有メモリを使用する。 データベースを使用した場合と同様 データベースを使用する場合より高速での処理が可能。 但し、メッセージの発生数が多い場合にはメモリ容量を圧迫 する事になるので不向き。 5)決められたディレクトリに作成されるメッセージファイル の発生を監視する。 上記をシステム規模等、要件によって使い分ける事になります。 注) メッセージを発行する側は、メッセージ発行後すぐに次の処理 に移れる点がメリットになりますが、そのメッセージの処理に エラーが発生した場合、メッセージの発行側にはそれを知る事 ができないというデメリットも持っています。 その為、通常はメッセージ処理の実行内容及び成否をログ出力 等して監視する処理も必要になります。

NewSQL
質問者

お礼

色々と、本当にありがとうございます。 教えて頂いた、1)~5)を少し勉強して考えてみます。 もしかしたら、又、お聞きすることが出るかもしれませんが、その時はよろしくお願いします。 本当に、ありがとうございます。 m(__)m

その他の回答 (2)

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

補足 >Bは自分の仕事が無い場合に受付箱を覗き メッセージ処理用の別プロセスCがBの作業状況を 監視して、Bの作業が空くのを待ってメッセージ をBに送るという方法も有ります。

NewSQL
質問者

お礼

回答ありがとうございます。 <Bの作業が空くのを待ってメッセージをBに送るという方法> などもあるんですね

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.1

>AとBのプロセスがあった場合にAからメッセージを発行し、 >Bはそのメッセージを受け取って処理を開始するみたいに >使用出来るのでしょうか? AからBに直接メッセージを渡すのではなく、Aはメッセージ を受付箱に入れるだけ、Bは自分の仕事が無い場合に受付箱 を覗き、中にメッセージが入っていたらそれを順番に実行 していきます。 A1,A2,A3と複数のプロセスから同時にBに対するメッセージ を出す場合でも、Bの作業の有無によらずメッセージを送る 事ができ次の処理を継続できます。

NewSQL
質問者

お礼

回答ありがとうございます。 もう少しお聞きしてよろしいですか? このAがメッセージを受付箱に入れて、Bがメッセージ箱を見に行ってメッセージがあったらBが処理を行うって方法ってどのように行うんですか? 何かサンプルみたいな感じで教えていただけないでしょう? 例えば、2つdllファイルを用意して、行うことが出来るなど・・・ もしくは、どこか良いサイトがありましたら教えてください。 (色々、調べたのですがうまくhitしないので・・・) よろしくお願いします。m(__)m

関連するQ&A

  • メッセージキューのFIFOの保証

    Solaris10を使用しています。 プロセスAがメッセージキューXに対してメッセージを投げます。 プロセスBがキューXからメッセージを受け取り、処理をします。 プロセスBは複数プロセス(B-1,B-2・・・)あり、すべてがキューXでメッセージを受け取り処理をします。(A:B=1:多になる) この場合 (1)メッセージキューXのFIFO(先入先出)は普通保証されるでしょうか。 (2)プロセスBはメッセージ取得順にメッセージの割り当てが行われるでしょうか。(つまりB-1が先でB-2が後から取りに行ったらB-1に先にメッセージを渡すのが保証されるかどうか。) (3)上記を行うためには、キューの作成もしくはOSのパラメータの設定が必要か、必要ならどれを設定すればいいか。 よろしくお願いします。

  • メッセージキューへ書き込める量を増やしたい

    System V系のメッセージキューを使用して、各プロセスへデータを渡しています。1つのメッセージキューを共用していますが、各プロセス毎に、受信する番号を変えていますので、各プロセスは自分宛のメッセージを問題なく受信できます。 ここからが問題なのですが、各プロセスへ一気にメッセージを配信するために、メッセージに多量にデータを書くと、msgsndでEAGAINとなってしまいます。 これを回避する為には、/proc/sys/kernel内の下記ファイルの内容を更新すればよいということまではわかりました。 msgmax msgmnb msgmni ところが、これらのファイルを直接更新しようとするとエラーとなってしまいます。 rootユーザーでviでmsgmnbを更新すると、「"msgmnb" E667: fsync に失敗しました」となり、更新できませんでした。 上記ファイルの更新方法についてご存じのかたおりましたら、教えて下さい。また、最終的におこないたいのは、メッセージキューにもっと沢山のメッセージを書き込みたいことですので、その方法についての回答でもかまいません。 最大100プロセスに送信。 1プロセスあたり256バイトのメッセージを5件送信。 したいと考えています。 OSはred hat enterprise(Versionは最新版を使用予定)ですが、他のOSの情報でもかまいません。

  • プロセス間でのメッセージキュー送信

    Linux初心者です。 あるプロセスが生成したメッセージキューへ、別のプロセスからメッセージキュー送信する場合、キューIDを指定する必要があります。 しかし、Linuxでは仮想メモリを使用しているため、共有メモリにアクセスできないはずで、異なるプロセス間でキューIDを共有する方法がわかりません。。 メッセージキューについて以下のサイトでサンプルプログラムが紹介されていますが、2つのプロセスが親子関係であるため、キューIDを共有できています。 http://linuxmag.sourceforge.jp/Japanese/March2003/article287.shtml そもそも、親子関係がないとプロセス間通信ができないのでしょうか? ご存知の方、よろしくお願いします。

  • POSIX メッセージキュー作成時の払い出しディスクリプタ

    現在、Linux(Fedora 7)の環境でPOSIXのメッセージキューを用いたプロセス間通信のプログラムを作成しています。 mq_openでメッセージキューをオープンしているのですが、 異なるプロセスですでに開かれているキューをオープンした時に、 最初にオープンしたキューと異なる値のディスクリプタが払い出されてしまいます。(その際のディスクリプタの値は他のキューの値になっていたりもします。) 例) <プロセスA(プロセスBより先に実行)> mqd = mq_open(   "/sample001", O_RDWR|O_CREAT, S_IRWXU, &mqattr); printf("Process A mqd = %d", mqd); <プロセスB> mqd = mq_open("/sample001", O_RDWR); printf("Process B mqd = %d", mqd); <実行結果> Process A mqd = 10 Process B mqd = 14 何か心当たりはありませんでしょうか?

  • キューについて

    インターネットの記事でjava.util.Queueの使い方に関する記事を読んでいてふと思ったのですが このQueueというものを使用する場面が想像できなかったので質問させてください。 キューを使用することで先入れ先出しで処理されると思うのですがそもそもプログラムってそういう ものなんじゃないの?(早い者勝ちで処理される)と思ってしまいました。 例えばAさんとBさんが同じ処理を行うボタンを押したとして、Aさんのリクエストが早ければAさんの 処理、Bさんのリクエストが早ければBさんの処理が先に行われる。 そう考えるとキューというクラス(インターフェース)自体必要なの? って思って使い道が想像がつかなかったのですがどうなのでしょうか。 ※例のような動きを実現させるために必要なのであろうとは思うのですが業務アプリを作る上では 必要性について想像がつかなかったのですが使用する場面はあるのでしょうか。

    • ベストアンサー
    • Java
  • 異なるプロセスですでに開かれているキューのオープンができません

    現在、Linux(Suse10.3)の環境でPOSIXのメッセージキューを用いたプロセス間通信のプログラムを作成しています。 mq_openでメッセージキューをオープンしているのですが、 異なるプロセスですでに開かれているキューのオープンができません。 最初にオープンしたキューは受信専用、異なるプロセスでオープンするキューは送信専用です。 errnoを調べましたが、 EACCES("\nキューは存在するが、呼び出し元が指定されたモードでそのキ>ューをオープンする許可を持たない。")となっています。 プロセスAの第3引数についてはmode_t S_IRWXU=0x777;としていますが、この辺りの設定方法がよくわかりません。 例) <プロセスA(プロセスBより先に実行)> msqid = mq_open(   "/sample001", O_RDONLY | O_CREAT, S_IRWXU, &mqattr); cout << "msqid:" << msqid << enld; msqid:3 <プロセスB> mqd = mq_open("/sample001", O_WRONLY); cout << "msqid:" << msqid << enld; msqid:-1 ///////////////////////////////////////////////////////////// //errnoは下記の通りです。 ///////////////////////////////////////////////////////////// EACCES(キューは存在するが、呼び出し元が指定されたモードでそのキ>ューをオープ>ンする許可を持たない。) 何か心当たりはありませんでしょうか?

  • メッセージキュー一括削除の方法

    LINUXプログラムの開発で、バグがありプログラムが暴走してしまい、CTRL+Cで強制的に止めた際、使用していたメッセージキューがそのまま残ってしまうことがままあります。 現在はipcsコマンドで残っているキューのIDを確認してから、ipcrmコマンドでいちいちIDを入力して消しております。 一括して簡単にキューを削除できる良い方法が他にあるのでしょうか。 ご存知の方教えて頂けないでしょうか。 よろしくお願いします。

  • ATコマンドがSYSTEM権限で実行される為、メールスロットへ書き込めない

    現在、windows-2003サーバーでVC.NETで開発しています。プロセスAはメールスロットを読み込み用にオープンし、これに、プロセスBがデータ(コマンド)を書き込みます。 両プロセスともに、Administratorで実行時は、問題ないのですが、プロセスAをatコマンドを使用して、起動すると、このプロセスはSYSTEM権限で実行されてしまいます。その為、このプロセスにコマンドを発行しようとして、プロセスBが(administrator権限)メールスロットを書き込み用にオープンすると、access deniedでエラーとなってしまいます。プロセスAは、毎日定時に起動する為、atコマンドを使用する必要があります。 プロセスBは、コマンドとして使用する為、atコマンドによる起動はできません。この前提で、メールスロットへエラーにならずに書き込むことができるでしょうか。

  • スレッドとメッセージキューに関して

    現在、下記のようなプログラムを作成しています。 内容は、メッセージキューを受信するスレッドを生成するというイメージです。 処理内容は下記のようになります。  (1)メッセージキューの生成  (2)スレッド生成(メッセージキュー受信側)  (3)スレッド停止  (4)メッセージキューの削除 しかし、(3)のスレッド停止を実施しても、(4)のメッセージキューの削除以降にて、msgrcvのエラーが出力されてしまいます。 スレッド停止を行ったことから、TestThreadは動作しなくなり、(4)のメッセージキューの削除にて、エラーともならずに終了することを望んでりますが、上手くいきません。 下記に作成しているプログラムを記載いたします。 正常終了をするには何がいけないのでしょうか? ご教授宜しくお願い致します。 [test.cc] ---------------------------------------------------------------- #include <time.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <ctype.h> #include <stdlib.h> #include <pthread.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/msg.h> // メソッドポインタ定義 typedef void (*testT); // スレッドID pthread_t threadId; // メッセージキュー識別子 int msqId; // 送受信するメッセージ struct msgbuf{ long int type; char data[BUFSIZ]; }; // テストスレッド void TestThread() { // メッセージ struct msgbuf message; while( 1 ) { printf("### TEST ###\n"); printf("msq start\n"); // 受信 if( msgrcv( msqId, &message, BUFSIZ, 0, 0 ) == -1) { printf("ERR! msgrcv errno[%d]\n", errno); continue; } printf("msq ed\n"); sleep(1); } return; } // メイン int main(int argc, char *argv[]) { // メッセージキュー識別子退避変数 int testMsqid; // スレッド操作リターン値 int status; // スレッドa用のパラメータ pthread_t thread_test; printf("### TEST START ###\n"); // メッセージキューの作成 if( (testMsqid = msgget((key_t)1111, 0666 | IPC_CREAT)) == -1 ) { printf("ERR! CREATE bkMsqId[%d]\n", testMsqid); return 1; } // メッセージキュー識別子を共通変数に設定 msqId = testMsqid; printf("msgget OK\n"); sleep(5); // スレッドを生成 status = pthread_create(&thread_test, NULL, (void*(*)(void*))TestThread, (void*)NULL); if(status!=0) { printf("pthread_create ng\n"); return 1; } printf("pthread_create OK\n"); sleep(5); // スレッド停止 status = pthread_cancel(thread_test); // スレッド停止結果 if ( status != 0 ) { printf("pthread_cancel ng\n"); return 1; } printf("pthread_cancel OK\n"); sleep(5); // メッセージキューの削除 if ( msgctl( msqId, IPC_RMID, NULL) == -1 ) { printf("msqId[%d] errno[%d]\n", msqId, errno); return 1; } printf("msgctl OK\n"); sleep(5); printf("### TEST E N D ###\n"); return 0; } ----------------------------------------------------------------

  • sendmailのキュー

    古いメールサーバを廃棄します。 その前にキューにたまったメールの処理をしたいと思います。 キューの消し方は、mailqコマンドでメッセージIDを調べ、 【手順1】 $ rm /var/spool/mqueue/dfJAA00**** $ rm /var/spool/mqueue/qfJAA00**** などとすればよいと聞きました。→d***とq***を消す。 しかし、/var/spool/mqueueをみると、頭文字がdやqのメッセージ ばかりではなく、頭文字が大文字のQや大文字のT、小文字のt、 小文字のxなどのファイルがあります。 これらのファイルは、どのような性質のファイルなのでしょうか? 【手順1】を実行すれば、自動的に消えてくれるようなファイル なのでしょうか? mailqコマンドで、メールキューがなくなった後も、これらのファイルが残っていた場合の対処方法などもご教授いただければ幸いです。 よろしくお願いいたします。