スレッド間の影響について
- このフォーラムに新しいトピックを立てることはできません
- このフォーラムではゲスト投稿が禁止されています
takahashi
投稿数: 38
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
お世話になっております。
環境
V3.0SP1d Expedition
WinXP pro SP3(テスト環境)
<<概要>>
メールに添付された注文書より受注ヘッダ、明細を作成し、結果を受信者へメールする。
注文書(エクセルシート)
ヘッダ部に親得意先コード、注文年月。
明細部に子得意先コード、商品コード、単価、注文数。
明細の最大行数は30行。
注文数は横に1〜31日までのマトリクス表。
<<jBOLTの簡単な内容>>
一つのビジネスプロセスに複数のフローが登録されている形です。
極力SQLを作成しているマッパーは単独フローで登録しています。
エクセルシートをFileManagementコンポーネントでディスクに保存(この時、時刻+RAND()関数を使用し
2スレッドで実行したとき重複名称にならないようにしてます。
最後に、エクセルシートを削除します。
3本の照会ファイル、4本の更新ファイルが存在します。
<<困っていること>>
1スレッドで実行(フローの特性→最大インスタンスを1)
または、メールを1件送信して、処理が終わるまで待つと
問題なく受注ヘッダ、受注明細が作成されますが、
最大インスタンスを0(無制限)にして2件送信すると、お互いのエクセルシートが干渉しあうかのようにmixされたコード体系で更新されてしまいます。具体的には、親得意先1の明細には全て子得意先1のデータだとします。親得意先2の明細には全て子得意先2のデータだとします。
SaveMessageコンポーネントを各所に設置してログをみると
親得意先1の中に子得意先2の情報が入り混じり、受注データが意図するものと違う形で更新されてしまいます。
なお、変数はフロー変数、コンテキスト変数、BP変数を使用しております。
同一名のエクセルシートで保存されているかと思いましたが、エクスプローラー上で
目視で確認していたところ、正常に違う名称のエクセルシートで保存されています。
<<質問内容>>
1.変数はスレッド間で干渉してしまうのか?
2.スレッド単位でアクティビティログは見れないのか?
3.サンプルプログラムではなく、もっと実用的な参考プログラムは存在しないのか?
番外:そもそも最大(30明細×31列)930回のデータアクセスを行うような処理をjBOLTで作るのは間違いでしょうか?
受付時間の設定もあり、あまり1つの注文に時間をかけられない状況です。
見辛くてすみません...ご教授の程よろしくお願い申し上げます。
環境
V3.0SP1d Expedition
WinXP pro SP3(テスト環境)
<<概要>>
メールに添付された注文書より受注ヘッダ、明細を作成し、結果を受信者へメールする。
注文書(エクセルシート)
ヘッダ部に親得意先コード、注文年月。
明細部に子得意先コード、商品コード、単価、注文数。
明細の最大行数は30行。
注文数は横に1〜31日までのマトリクス表。
<<jBOLTの簡単な内容>>
一つのビジネスプロセスに複数のフローが登録されている形です。
極力SQLを作成しているマッパーは単独フローで登録しています。
エクセルシートをFileManagementコンポーネントでディスクに保存(この時、時刻+RAND()関数を使用し
2スレッドで実行したとき重複名称にならないようにしてます。
最後に、エクセルシートを削除します。
3本の照会ファイル、4本の更新ファイルが存在します。
<<困っていること>>
1スレッドで実行(フローの特性→最大インスタンスを1)
または、メールを1件送信して、処理が終わるまで待つと
問題なく受注ヘッダ、受注明細が作成されますが、
最大インスタンスを0(無制限)にして2件送信すると、お互いのエクセルシートが干渉しあうかのようにmixされたコード体系で更新されてしまいます。具体的には、親得意先1の明細には全て子得意先1のデータだとします。親得意先2の明細には全て子得意先2のデータだとします。
SaveMessageコンポーネントを各所に設置してログをみると
親得意先1の中に子得意先2の情報が入り混じり、受注データが意図するものと違う形で更新されてしまいます。
なお、変数はフロー変数、コンテキスト変数、BP変数を使用しております。
同一名のエクセルシートで保存されているかと思いましたが、エクスプローラー上で
目視で確認していたところ、正常に違う名称のエクセルシートで保存されています。
<<質問内容>>
1.変数はスレッド間で干渉してしまうのか?
2.スレッド単位でアクティビティログは見れないのか?
3.サンプルプログラムではなく、もっと実用的な参考プログラムは存在しないのか?
番外:そもそも最大(30明細×31列)930回のデータアクセスを行うような処理をjBOLTで作るのは間違いでしょうか?
受付時間の設定もあり、あまり1つの注文に時間をかけられない状況です。
見辛くてすみません...ご教授の程よろしくお願い申し上げます。
投票数:0
平均点:0.00
Jiro123
投稿数: 271
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
変数の有効範囲(スコープ)が関係していそうな気がします。
jBOLTがサポートする変数にも、有効範囲(スコープ)があります。
ヘルプには次のように書かれています。
○フロー変数
フロー変数の値はそれが定義されたフローのコンテキストにより決まります。
※注意(抜粋)
jBOLTでは、複数のフローが同じコンテキストを共有している場合(親子関係の場合など)、同じ名前を持つフロー変数は、別のフローで定義されていても区別されません。
○コンテキスト変数
コンテキスト変数は新しいコンテキスト(スレッド)が起動した時に作成されます。この変数はコンテキストが生きている間は、終了までに複数のフローをまたがった場合でも有効です。コンテキスト変数の定義はプロジェクト内の全てのフローに相続されています。この変数はプロジェクト内の全てのフローのために一度に定義されます。コンテキスト変数はフローロジックを管理するため、そしてプロジェクト内の全てのフローのコンポーネント間でデータをやり取りするために使用されます。
○BP変数(ビジネスプロセス変数)
ビジネスプロセスはビジネスプロセスのスコープで定義されています。ビジネスプロセス変数の定義はビジネスプロセス内の全てのフローで利用できます。ビジネスプロセス変数は一度定義すればビジネスプロセス内の全てのフローで使えます。フローで変更されたビジネスプロセス変数は同じビジネスプロセス内の全てのフローに影響を与えます。
BP変数のスコープはBP全体になっているので、スレッド間での影響を受けることになります。
最もクローズな変数は、フロー変数です。
ただし、同一コンテキストでは、同じ名前のフロー変数は同一とみなされるので(※注意を参照のこと)、フローの構成には注意が必要です。
jBOLTがサポートする変数にも、有効範囲(スコープ)があります。
ヘルプには次のように書かれています。
○フロー変数
フロー変数の値はそれが定義されたフローのコンテキストにより決まります。
※注意(抜粋)
jBOLTでは、複数のフローが同じコンテキストを共有している場合(親子関係の場合など)、同じ名前を持つフロー変数は、別のフローで定義されていても区別されません。
○コンテキスト変数
コンテキスト変数は新しいコンテキスト(スレッド)が起動した時に作成されます。この変数はコンテキストが生きている間は、終了までに複数のフローをまたがった場合でも有効です。コンテキスト変数の定義はプロジェクト内の全てのフローに相続されています。この変数はプロジェクト内の全てのフローのために一度に定義されます。コンテキスト変数はフローロジックを管理するため、そしてプロジェクト内の全てのフローのコンポーネント間でデータをやり取りするために使用されます。
○BP変数(ビジネスプロセス変数)
ビジネスプロセスはビジネスプロセスのスコープで定義されています。ビジネスプロセス変数の定義はビジネスプロセス内の全てのフローで利用できます。ビジネスプロセス変数は一度定義すればビジネスプロセス内の全てのフローで使えます。フローで変更されたビジネスプロセス変数は同じビジネスプロセス内の全てのフローに影響を与えます。
BP変数のスコープはBP全体になっているので、スレッド間での影響を受けることになります。
最もクローズな変数は、フロー変数です。
ただし、同一コンテキストでは、同じ名前のフロー変数は同一とみなされるので(※注意を参照のこと)、フローの構成には注意が必要です。
投票数:0
平均点:0.00
takahashi
投稿数: 38
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
jiro123様
ご回答ありがとうございます。
私もヘルプを見て作ったのですが、理解不足だったのでしょうか。
ヘルプを見る限りスレッド間では変数同士、干渉しないと思ったのですが...
逆に干渉するとなると、どのように変数を作成してよいのやら...
コンテキスト(スレッド)間で干渉するとしたらコンテキスト変数が干渉するのでしょうか。
でもそうなると、最初から定義されているjBOLT固有の『C.sys.LastErrorCode』などは
2スレッド起動時、どちらかでエラーとなったら両方の変数に数値が更新されるということでしょうか。
現在は、エクセルシートのセル値をMicrosoftExcelコンポーネントのGetValueアクションで取得しますが、この結果値はコンテキスト変数でしか受け取れません。(変数一覧にはコンテキスト変数情報しか表示されない)もし、コンテキスト変数がスレッド間で干渉しているとしたら今回の現象も納得いくのですが、そうなるとjBOLTでエクセルを使用する場合は、1スレッド限定となってしまいそうな気がします。
ご回答ありがとうございます。
私もヘルプを見て作ったのですが、理解不足だったのでしょうか。
ヘルプを見る限りスレッド間では変数同士、干渉しないと思ったのですが...
逆に干渉するとなると、どのように変数を作成してよいのやら...
コンテキスト(スレッド)間で干渉するとしたらコンテキスト変数が干渉するのでしょうか。
でもそうなると、最初から定義されているjBOLT固有の『C.sys.LastErrorCode』などは
2スレッド起動時、どちらかでエラーとなったら両方の変数に数値が更新されるということでしょうか。
現在は、エクセルシートのセル値をMicrosoftExcelコンポーネントのGetValueアクションで取得しますが、この結果値はコンテキスト変数でしか受け取れません。(変数一覧にはコンテキスト変数情報しか表示されない)もし、コンテキスト変数がスレッド間で干渉しているとしたら今回の現象も納得いくのですが、そうなるとjBOLTでエクセルを使用する場合は、1スレッド限定となってしまいそうな気がします。
投票数:0
平均点:0.00
Jiro123
投稿数: 271
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
異なるスレッドでも有効範囲となりえる変数は、BP変数とグローバル変数です。
>現在は、エクセルシートのセル値をMicrosoftExcelコンポーネントのGetValueアク
>ションで取得しますが、この結果値はコンテキスト変数でしか受け
>取れません。(変数一覧にはコンテキスト変数情報しか表示されな
>い)
それは、単にそのフローにフロー変数(文字型)を定義していないだけではないでしょうか。
定義されていれば、変数一覧でフロー変数が表示されるので、選択できます。
別にコンテキスト変数以外の変数でも取得可能ですよ。
>現在は、エクセルシートのセル値をMicrosoftExcelコンポーネントのGetValueアク
>ションで取得しますが、この結果値はコンテキスト変数でしか受け
>取れません。(変数一覧にはコンテキスト変数情報しか表示されな
>い)
それは、単にそのフローにフロー変数(文字型)を定義していないだけではないでしょうか。
定義されていれば、変数一覧でフロー変数が表示されるので、選択できます。
別にコンテキスト変数以外の変数でも取得可能ですよ。
投票数:0
平均点:0.00
takahashi
投稿数: 38
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
jiro123様
ありがとうございます。
フロー変数に定義したら一覧に表示されました。
BP変数は表示されないんですね...
>異なるスレッドでも有効範囲となりえる変数は、BP変数とグローバル変数です。
今回作成したプロジェクトはBP変数に全てのエクセル情報を更新して処理しておりました。
(コンテキスト変数(文字型)からBP変数(数値型)に更新してました)
干渉していたのはBP変数ということですね。
コンテキスト変数にBP変数の定義をお引っ越ししてみます。
改造範囲は大きいですが、試してみます。
ありがとうございます。
フロー変数に定義したら一覧に表示されました。
BP変数は表示されないんですね...
>異なるスレッドでも有効範囲となりえる変数は、BP変数とグローバル変数です。
今回作成したプロジェクトはBP変数に全てのエクセル情報を更新して処理しておりました。
(コンテキスト変数(文字型)からBP変数(数値型)に更新してました)
干渉していたのはBP変数ということですね。
コンテキスト変数にBP変数の定義をお引っ越ししてみます。
改造範囲は大きいですが、試してみます。
投票数:0
平均点:0.00
Jiro123
投稿数: 271
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
ささいなトラブルの原因が誤解から生じることは良くあります。
ヘルプをちゃんと読みましょうよ。
何度も繰り返し読んで理解を深めるしかありません。
○BP変数(ビジネスプロセス変数)
ビジネスプロセスはビジネスプロセスのスコープで定義されています。ビジネスプロセス変数の定義はビジネスプロセス内の全てのフローで利用できます。ビジネスプロセス変数は一度定義すればビジネスプロセス内の全てのフローで使えます。フローで変更されたビジネスプロセス変数は同じビジネスプロセス内の全てのフローに影響を与えます。
ヘルプをちゃんと読みましょうよ。
何度も繰り返し読んで理解を深めるしかありません。
○BP変数(ビジネスプロセス変数)
ビジネスプロセスはビジネスプロセスのスコープで定義されています。ビジネスプロセス変数の定義はビジネスプロセス内の全てのフローで利用できます。ビジネスプロセス変数は一度定義すればビジネスプロセス内の全てのフローで使えます。フローで変更されたビジネスプロセス変数は同じビジネスプロセス内の全てのフローに影響を与えます。
投票数:0
平均点:0.00
takahashi
投稿数: 38
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
ご指摘、全くその通りでございます。
例えが変ですが、BP変数はコンテキスト変数の子分のイメージでいました。
例えが変ですが、BP変数はコンテキスト変数の子分のイメージでいました。
投票数:0
平均点:0.00
Jiro123
投稿数: 271
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
>例えが変ですが、BP変数はコンテキスト変数の子分のイメージで
>いました。
その例えで言い換えれば、BP変数は、ブローバル変数の子分のイメージが近いでしょうね。
プロジェクト全体がスコープとなるのではなく、同一BP内がスコープ(同一BP内の異なるフロー間でもコンテキスト間でも共有可能)となるからです。
スコープの小さい順に並べると、
フロー変数、コンテキスト変数、BP変数、グローバル変数
となりますね。
>いました。
その例えで言い換えれば、BP変数は、ブローバル変数の子分のイメージが近いでしょうね。
プロジェクト全体がスコープとなるのではなく、同一BP内がスコープ(同一BP内の異なるフロー間でもコンテキスト間でも共有可能)となるからです。
スコープの小さい順に並べると、
フロー変数、コンテキスト変数、BP変数、グローバル変数
となりますね。
投票数:0
平均点:0.00
takahashi
投稿数: 38
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
なるほど、勉強になります。
結果はまた近いうちにご報告いたします。
ありがとうございました。
結果はまた近いうちにご報告いたします。
ありがとうございました。
投票数:0
平均点:0.00
takahashi
投稿数: 38
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
jiro123様
報告です。
BP変数で定義していた箇所を全てコンテキスト変数で定義しなおしたら
思い通りのデータになってくれました。
まだまだ勉強不足ですが、これからも変わらずのご指導ご鞭撻のほどよろしくお願いいたします。
報告です。
BP変数で定義していた箇所を全てコンテキスト変数で定義しなおしたら
思い通りのデータになってくれました。
まだまだ勉強不足ですが、これからも変わらずのご指導ご鞭撻のほどよろしくお願いいたします。
投票数:0
平均点:0.00