C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: ジャーナルキューの参照


(過去ログ 23 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■10171 / inTopicNo.1)  ジャーナルキューの参照
  
□投稿者/ カンタービレ (41回)-(2007/11/12(Mon) 19:25:30)

分類:[VB.NET/VB2005] 

[実行環境:Windows2003Server]
[開発言語:VB.NET2005]

以前作ったツールでMSMQの確認をしていました。[VB.NET2002 @ Windows200Server]
その時はリモートサーバのジャーナルキューも見えていましたが、
2005に変換して動かしたところ、ジャーナルキューだけ見れないんデス。。

Dim em As MessageEnumerator
Dim mq As New MessageQueue(path)
mq.MessageReadPropertyFilter.SetAll()
em = mq.GetMessageEnumerator2()  ' ←ジャーナルのときココで落ちマス。
While em.MoveNext()
' ここでメツセジ処理しマス。
End While

エラーは無効なパスと出るのデスが、1.0のモジュールでは動いてマス(見れマス)。
渡しているパスは "マシン名\private$\キュー名\journal$" デス。

変更は、2.0で廃止予定のGetMessageEnumeratorメソッドをGetMessageEnumerator2に
してマス。これってキューの書き方がマズいのかしら・・・。
前と同じようにネットワーク上のサーバのキューを見たいのに・・。
(ローカル上のジャーナルMQはエラーにはなりません。)
ちなみに警告は出マスが、GetMessageEnumeratorに戻してみましたが
無駄に終わりました。何が悪いんでしょうか。。

引用返信 編集キー/
■10188 / inTopicNo.2)  Re[1]: ジャーナルキューの参照
□投稿者/ れい (195回)-(2007/11/13(Tue) 04:45:54)

今環境がなくて試せないので、
アドバイス程度です。

> 渡しているパスは "マシン名\private$\キュー名\journal$" デス。

ずっと忘れてましたが、
MessageQueueのコンストラクタでpathを渡すとそのpathは検証されないようで、
変なパスが指定できちゃいます。たぶんバグなんですが。
オブジェクトを作ってからプロパティでpathを設定したほうがいいです。
#後でフィードバックにあげときます。

アドバイスですが。

MessageQueueのFormatNameプロパティは正常になってますか?
FormatNameが実際に使われるので、これが変だとだめです。
なんか昔はprivate$とかjournal$が小文字だと変になったような気がしますが、よく覚えてません。

コンストラクタで"FormatName: XXX"形式で指定してもだめですか?

それと、エラーの詳細をください。
StackTraceとか。

どっちにしろ、バグくさいなぁ
引用返信 編集キー/
■10196 / inTopicNo.3)  Re[2]: ジャーナルキューの参照
□投稿者/ カンタービレ (42回)-(2007/11/13(Tue) 13:41:55)
2007/11/13(Tue) 13:48:55 編集(投稿者)

No10188 (れい さん) に返信
>
> 今環境がなくて試せないので、
> アドバイス程度です。
>
>>渡しているパスは "マシン名\private$\キュー名\journal$" デス。
>
> ずっと忘れてましたが、
> MessageQueueのコンストラクタでpathを渡すとそのpathは検証されないようで、
> 変なパスが指定できちゃいます。たぶんバグなんですが。
> オブジェクトを作ってからプロパティでpathを設定したほうがいいです。
> #後でフィードバックにあげときます。
>
> アドバイスですが。
>
> MessageQueueのFormatNameプロパティは正常になってますか?
> FormatNameが実際に使われるので、これが変だとだめです。
> なんか昔はprivate$とかjournal$が小文字だと変になったような気がしますが、よく覚えてません。
>
> コンストラクタで"FormatName: XXX"形式で指定してもだめですか?
>
> それと、エラーの詳細をください。
> StackTraceとか。
>
> どっちにしろ、バグくさいなぁ

アドバイスありがとうございマス。
現状の1.0からのアップグレードソースを変更せずに検証してみました。

[1回目]
コンストラクタへの指定   :FormatName:DIRECT=OS:サーバ名\private$\キュー名\journal$

MQインスタンスのFormatName :DIRECT=OS:サーバ名\private$\キュー名\journal$
MQインスタンスのPath    :FormatName:DIRECT=OS:サーバ名\private$\キュー名\journal$
MQインスタンスのQueueName :形式が無効です。
MQインスタンスのMachineName:形式が無効です。

形式名は無効です。
場所 System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
場所 System.Messaging.MessageEnumerator.get_Handle()
場所 System.Messaging.MessageEnumerator.MoveNext(TimeSpan timeout)
場所 System.Messaging.MessageEnumerator.MoveNext()

[2回目]
コンストラクタへの指定   :サーバ名\private$\キュー名\journal$

MQインスタンスのFormatName :無効なキューのパス名です。
MQインスタンスのPath    :サーバ名\private$\キュー名\journal$
MQインスタンスのQueueName :private$\キュー名\journal$
MQインスタンスのMachineName:サーバ名

無効なキューのパス名です。
場所 System.Messaging.MessageQueue.ResolveFormatNameFromQueuePath(String queuePath, Boolean throwException)
場所 System.Messaging.MessageQueue.get_FormatName()
場所 System.Messaging.MessageQueue.GetMessageEnumerator()

旧バージョンでは2回目がうまく動くような感じなのデスが、2005ではエラーとなっているようデス。
ご指摘のあったキュー名やパスをインスタンス生成後に動的に設定してみましたが
空のインスタンスを生成後にPathを指定した時点で例外・・もしくは
MachineName、QueueNameを指定し、Pathプロパティがセットされたのを確認してみてもダメデス。。
FormatNameプロパティはReadOnlyなので直接指定も出来ず・・・書き方が悪いのでしょうか。。

[追記]
ちなみに、同じフォーマットでローカルホストを指定した場合は例外発生しません。
ローカルコンピュータのネットワーク名で、localhostではありません。
前は例外発生しなかったのにぃぃぃ・・ぎゃぼん・・・
引用返信 編集キー/
■10205 / inTopicNo.4)  Re[3]: ジャーナルキューの参照
□投稿者/ カンタービレ (43回)-(2007/11/13(Tue) 18:16:59)
No10196 (カンタービレ さん) に返信
>
> [1回目]
> コンストラクタへの指定   :FormatName:DIRECT=OS:サーバ名\private$\キュー名\journal$

自己レスしマス。
http://msdn2.microsoft.com/ja-jp/library/ktb2ecsw(VS.80).aspx
http://msdn2.microsoft.com/ja-jp/library/system.messaging.messagequeue.path(VS.80).aspx
を読み直し、ジャーナルキュー名の場合、private$がないことに気がつき、直してみました。
でも・・・今度はワークグループではサポートしていない例外に変わっただけでした。。
[1回目]
コンストラクタへの指定   :FormatName:DIRECT=OS:サーバ名\キュー名\journal$ ←これはダメと分かってやってみた。
[2回目]
コンストラクタへの指定   :サーバ名\キュー名\journal$

[形式名によるジャーナルキューの参照]
@FORMATNAME:PUBLIC=QueueGUID;JOURNAL
または
AFORMATNAME:PRIVATE=MachineGUID\QueueNumber;JOURNAL
だそうデス。

ネットワーク上のプライベートのジャーナルキューは@では参照できないようデス。
ワークグループではサポートしてないエラー変わらず。

Aでアクセスしたいと思っても、MachineGUIDって何か説明もなく、今参照しようとしているキューちゃんが
何番かの求め方も分からないといった状況デス。普通のキューはアクセスできてるのになぁ・・。
ちなみにMessageEnumeratorを使わずにGetAllMessageメソッドでも同様デス。

コンストラクタ時とPathを直接指定した場合での変化はありませんでした。

また行き詰ったので、ご報告がてらいいヒントがあればお願いいたしマス。
引用返信 編集キー/
■10264 / inTopicNo.5)  Re[4]: ジャーナルキューの参照
□投稿者/ れい (196回)-(2007/11/14(Wed) 22:09:59)
No10196 (カンタービレ さん) に返信
> ご指摘のあったキュー名やパスをインスタンス生成後に動的に設定してみましたが
> 空のインスタンスを生成後にPathを指定した時点で例外・・もしくは

コンストラクタでのPath指定はエラーチェックがありません。
プロパティからのPath指定は「簡単な」構文チェックが入っています。
「簡単な」構文チェックも通らないようでは、キューも開けるわけ無いので、
問題を分離するためにも、プロパティで指定するのをお勧めします。

また、「private」や「journal」は大文字をお勧めします。
メッセージキューは区別しないはずですが、
MessageQueueおよび関連クラスの内部で区別してはいけないはずのものを区別していた、
というバグが昔あった気がします。

> FormatNameプロパティはReadOnlyなので直接指定も出来ず・・・書き方が悪いのでしょうか。。

FormatName自体は指定できませんが、Pathに"FormatName:XXX"で指定することで指定できます。

No10205 (カンタービレ さん) に返信
> 自己レスしマス。
> http://msdn2.microsoft.com/ja-jp/library/ktb2ecsw(VS.80).aspx
> http://msdn2.microsoft.com/ja-jp/library/system.messaging.messagequeue.path(VS.80).aspx
> を読み直し、ジャーナルキュー名の場合、private$がないことに気がつき、直してみました。

プライベートキューはPRIVATE$/xxxx/JOURNAL$という指定で間違いありません。
リンク先の例もパブリックキューの例です。

PRIVATE$が無いのはパブリックキューですから、
> でも・・・今度はワークグループではサポートしていない例外に変わっただけでした。。
ドメインでしか使えないパブリックキューを見ようとしてるのでエラーがでます。

> [形式名によるジャーナルキューの参照]
> @FORMATNAME:PUBLIC=QueueGUID;JOURNAL
> または
> AFORMATNAME:PRIVATE=MachineGUID\QueueNumber;JOURNAL
> だそうデス。
> ネットワーク上のプライベートのジャーナルキューは@では参照できないようデス。

GUIDを使うときはそうですね。
@はPUBLICとあるように、当然パブリックキュー用です。

> Aでアクセスしたいと思っても、MachineGUIDって何か説明もなく、今参照しようとしているキューちゃんが
http://www.microsoft.com/japan/msdn/msmq/psdkdoc.aspx
こことか、MSDNとかに書いてあります。
MQGetMachinePropertiesで取得できます。

> [1回目]
> コンストラクタへの指定   :FormatName:DIRECT=OS:サーバ名\private$\キュー名\journal$
>
> MQインスタンスのFormatName :DIRECT=OS:サーバ名\private$\キュー名\journal$
> MQインスタンスのPath    :FormatName:DIRECT=OS:サーバ名\private$\キュー名\journal$
> MQインスタンスのQueueName :形式が無効です。
> MQインスタンスのMachineName:形式が無効です。
>
> 形式名は無効です。
> 場所 System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
> 場所 System.Messaging.MessageEnumerator.get_Handle()
> 場所 System.Messaging.MessageEnumerator.MoveNext(TimeSpan timeout)
> 場所 System.Messaging.MessageEnumerator.MoveNext()

まずFormatNameを作成し、その後キューを呼び出すでしょうから、
スタックから見る限り、これが一番成功してますよね。

> コンストラクタへの指定   :FormatName:DIRECT=OS:サーバ名\private$\キュー名\journal$

これが変です。

mq.Path = "FormatName:DIRECT=OS:サーバ名\PRIVATE$\キュー名;JOURNAL"

が正しい指定です。
どうでしょう?
引用返信 編集キー/
■10268 / inTopicNo.6)  Re[5]: ジャーナルキューの参照
□投稿者/ カンタービレ (49回)-(2007/11/14(Wed) 22:56:07)
れいサマ回答ありがとうゴザイマス☆

No10264 (れい さん) に返信
> 問題を分離するためにも、プロパティで指定するのをお勧めします。
>
Path指定に変更しました。

> また、「private」や「journal」は大文字をお勧めします。
> メッセージキューは区別しないはずですが、
> MessageQueueおよび関連クラスの内部で区別してはいけないはずのものを区別していた、
> というバグが昔あった気がします。
>
大文字変更しましたが、ダメデス・・・(涙)

> プライベートキューはPRIVATE$/xxxx/JOURNAL$という指定で間違いありません。
> リンク先の例もパブリックキューの例です。
>
> GUIDを使うときはそうですね。
> @はPUBLICとあるように、当然パブリックキュー用です。
>
>>Aでアクセスしたいと思っても、MachineGUIDって何か説明もなく、今参照しようとしているキューちゃんが
> http://www.microsoft.com/japan/msdn/msmq/psdkdoc.aspx
> こことか、MSDNとかに書いてあります。
> MQGetMachinePropertiesで取得できます。
>
ぎゃぼ・・アドオンパックにWindowsCE用とか書いてマス・・・(涙涙)
>
>>コンストラクタへの指定   :FormatName:DIRECT=OS:サーバ名\private$\キュー名\journal$
>
> これが変です。
>
> mq.Path = "FormatName:DIRECT=OS:サーバ名\PRIVATE$\キュー名;JOURNAL"
>
> が正しい指定です。
> どうでしょう?

ざ残念ながら・・・やっぱり無効なパス指定の例外発生しマス。。(号泣)
私のほうでももう少し頑張って探してみマス。

引用返信 編集キー/
■10270 / inTopicNo.7)  Re[6]: ジャーナルキューの参照
□投稿者/ れい (198回)-(2007/11/14(Wed) 23:10:19)
No10268 (カンタービレ さん) に返信
>>http://www.microsoft.com/japan/msdn/msmq/psdkdoc.aspx
>>こことか、MSDNとかに書いてあります。
>>MQGetMachinePropertiesで取得できます。
>>
> ぎゃぼ・・アドオンパックにWindowsCE用とか書いてマス・・・(涙涙)

ぎゃー
貼り付け間違ってるし。
タブブラウザの弊害が。

> ざ残念ながら・・・やっぱり無効なパス指定の例外発生しマス。。(号泣)
> 私のほうでももう少し頑張って探してみマス。

え〜!?
なかなか手ごわいですね…

引用返信 編集キー/
■10284 / inTopicNo.8)  Re[7]: ジャーナルキューの参照
□投稿者/ カンタービレ (50回)-(2007/11/15(Thu) 02:24:41)
> MQGetMachinePropertiesで取得できます。

調べたトコロ、mqrt.dllの中にあるっぽいデスね。
Private Declare Function MQGetMachineProperties Lib "mqrt" _
(ByVal lpwcsMachineName As String, _
ByRef pguidMachineId As Guid, _
ByRef pQMProps As OUT) As Long

これで試してみマス。
引用返信 編集キー/
■10289 / inTopicNo.9)  Re[6]: ジャーナルキューの参照
□投稿者/ れい (201回)-(2007/11/15(Thu) 05:43:39)
2007/11/15(Thu) 06:23:45 編集(投稿者)
2007/11/15(Thu) 06:23:15 編集(投稿者)

No10268 (カンタービレ さん) に返信
>>mq.Path = "FormatName:DIRECT=OS:サーバ名\PRIVATE$\キュー名;JOURNAL"
>>
>>が正しい指定です。
>>どうでしょう?
>
> ざ残念ながら・・・やっぱり無効なパス指定の例外発生しマス。。(号泣)
> 私のほうでももう少し頑張って探してみマス。

ようやく試せる環境になったので確認しました。

mq.Path = "サーバ名\PRIVATE$\キュー名\JOURNAL$"
で名前の解決に失敗する理由はわかりませんでした(ってゆーか調べてない

>>mq.Path = "FormatName:DIRECT=OS:サーバ名\PRIVATE$\キュー名;JOURNAL"

で動きます。
ジャーナルにも、メッセージにも、問題なくアクセスできます。
VISTA/XP XP/XPで試しました。

MoveNextの所でエラーがでるとありますが、
それはただ単にMSMQにアクセスできてないだけだろうと思います。

ファイアウォールか、MSMQのセキュリティの設定か。
.Net2.0のインストールに伴い
MSMQのバージョンを変えたり、ファイアウォールをかえたりしたのではないですか?

引用返信 編集キー/
■10305 / inTopicNo.10)  Re[7]: ジャーナルキューの参照
□投稿者/ カンタービレ (53回)-(2007/11/15(Thu) 11:23:08)
2007/11/15(Thu) 11:23:29 編集(投稿者)

No10289 (れい さん) に返信
> >>mq.Path = "FormatName:DIRECT=OS:サーバ名\PRIVATE$\キュー名;JOURNAL"
>
> で動きます。
> ジャーナルにも、メッセージにも、問題なくアクセスできます。
> VISTA/XP XP/XPで試しました。

分かりました!!セキュリティの問題で弾かれていたようデス!!
テスト実行していたユーザー権限を変更したところうまくアクセスできました〜☆(感涙)
れいサマには色々検証までしていただいてありがとうゴザイマシタ。

一回ダメだった時の先入観が残ってしまったようデス。。

#関係ないデスが、れいサマって早起き☆(夜更かしすぎ?)
解決済み
引用返信 編集キー/
■10347 / inTopicNo.11)  Re[8]: ジャーナルキューの参照
□投稿者/ れい (202回)-(2007/11/16(Fri) 00:11:13)
No10305 (カンタービレ さん) に返信
> 分かりました!!セキュリティの問題で弾かれていたようデス!!
>...
> 一回ダメだった時の先入観が残ってしまったようデス。。

やはり。ところで

> 渡しているパスは "マシン名\private$\キュー名\journal$" デス。

これで出来ましたか?
私は出来ませんでした。

> #関係ないデスが、れいサマって早起き☆(夜更かしすぎ?)

きっと皆さんわかると思いますが、
物を作る系の人にはいろいろ事情が、ね?
解決済み
引用返信 編集キー/
■10348 / inTopicNo.12)  Re[9]: ジャーナルキューの参照
□投稿者/ カンタービレ (59回)-(2007/11/16(Fri) 00:40:35)
No10347 (れい さん) に返信
>>渡しているパスは "マシン名\private$\キュー名\journal$" デス。
>
> これで出来ましたか?

1.0のモジュールでは取得できました。(2.0環境でそのまま動かした場合でも取得できマス)
2.0ではセキュリティ関係なく出来ませんでした。

当初はただの私専用デバッグツールとして作ったので、ソースも動けばいい☆状態だったんデス。
今や正規運用ツールに昇格してしまってビックリ、それでちょっと綺麗に作り直す必要があり
2005変換してみたら動きが変わって更にビックリでした。

解決済み
引用返信 編集キー/
■10349 / inTopicNo.13)  Re[10]: ジャーナルキューの参照
□投稿者/ れい (203回)-(2007/11/16(Fri) 00:57:46)
No10348 (カンタービレ さん) に返信
> ■No10347 (れい さん) に返信
> >>渡しているパスは "マシン名\private$\キュー名\journal$" デス。
>>
>>これで出来ましたか?
>
> 1.0のモジュールでは取得できました。(2.0環境でそのまま動かした場合でも取得できマス)
> 2.0ではセキュリティ関係なく出来ませんでした。

やはり。
バグでしょうね。

フィードバックよろしくです:D

引用返信 編集キー/
■10353 / inTopicNo.14)  Re[11]: ジャーナルキューの参照
□投稿者/ カンタービレ (61回)-(2007/11/16(Fri) 02:57:39)
No10349 (れい さん) に返信
> フィードバックよろしくです:D
>
してみました☆フィードバック初投稿デスw
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -