Web 解析ページの EJB ステートレス メソッドを呼び出すステートフル EJB があります。
これが私のステートフルコードです:
@Override
public void parse() {
while(true) {
if(false == _activeMode) {
break;
}
for(String url : _urls){
if(false == _activeMode) {
break;
}
for(String prioritaryUrl : _prioritaryUrls) {
if(false == _activeMode)
break;
boursoramaStateless.parseUrl(prioritaryUrl);
}
boursoramaStateless.parseUrl(url);
}
}
}
ここでは問題ありません。
_urls 変数 (リスト) に何らかの値を追加する非同期呼び出し (JMS を使用) があります。目標は、無限ループ内で新しい URL を解析することです。
JMS onMessage メソッドを介してリストに新しい URL を追加しようとすると ConcurrentModificationException を受け取りますが、この新しい URL が解析されるため、機能しているようです。
同期ブロックをラップしようとすると:
while(true){
synchronized(_url){
// code...
}
}
私の新しい URL は決して解析されません。for() ループが終了した後に解析されることを期待していました...
だから私の質問は: ConcurrentModificationException を使わずに、ループ内でアクセスされたときに List を変更するにはどうすればよいですか?
同期ブロックなしで、2 つのスレッドで共有リソースを同時に変更したいだけです...