2016-11-12 10 views
0

私は、Excelファイルに基づいてSOAPリクエストを生成し、その結果を電子メールで送信するソフトウェアを持っています。Parallelstream.ForEach()double item

リクエストの潜在的なサイズのため、私はsoap-request-handlingを並行して実行します。次のコードは上記のコードを処理します。私は、データの2つの部分でコードを実行すると

public void HandleData() { 
    List<NodeAnalysisReply> replies = Collections.synchronizedList(new ArrayList<>()); 
    new Thread(() -> { 
     List<NodeAnalysisRequest> requests; 
     SOAPMessageFactory factory = new SOAPMessageFactory(); 
     SOAPResponseParser parser = new SOAPResponseParser(); 

     try { 
      requests = new ExcelParser().parseData(file); 
      requests.parallelStream().forEach((request) -> { 
       try { 
        SOAPMessage message = factory.createNodeRequestMessage(
          new RequestObject(requestInfoFactory.makeInfo(trackingID), request)); 
        SOAPMessage response = new SoapConnector(server.getUrl()).executeRequest(message); 
        ByteArrayOutputStream out = new ByteArrayOutputStream(); 
        response.writeTo(out); 
        NodeAnalysisReply curReply = parser.ParseXMLResponse(out.toString(), request); 
        synchronized (replies) { 
         System.out.println("Adding: " + curReply.getRequest().toString()); 
         replies.add(curReply); 
        } 
       } catch (UnsupportedOperationException | SOAPException | IOException e) { 
        handleSoap(e.getMessage()); 
       } 
      }); 
     } catch (IOException e) { 
      handleBadParse(); 
     } 

     try { 
      for(NodeAnalysisReply reply : replies){ 
       System.out.println("Data: " + reply.getRequest().toString()); 
      } 
      mailer.SendEmail("Done", email, replies); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 

    }).start(); 
} 

、次のことが起こる:

Adding: Søndergade 52 6920 // OK 
Adding: Ternevej 1 6920 // OK 

Data: Ternevej 1 6920 // What 
Data: Ternevej 1 6920 // WHAT.. 
are equal? true 

それがリストに両方の項目が追加されますので、にもかかわらず、最後の1は、両方の場所を取るように、それはそうです。どのようにそれが来て、どのように私はそれを解決するのですか? - 私は本当にParrallel.ForEach()フォームC#を欠場しています!

EDIT:要求通り、NodeAnalysisReplyのコード。

public class NodeAnalysisReply { 

public ReplyInfo getReplyInfo() { 
    return replyInfo; 
} 

public void setReplyInfo(ReplyInfo replyInfo) { 
    this.replyInfo = replyInfo; 
} 

public List <nodeAnalysisListDetails> getNodeAnalysisListDetails() { 
    return nodeAnalysisListDetails; 
} 

public void setNodeAnalysisListDetails(List <nodeAnalysisListDetails> nodeAnalysisListDetails) { 
    this.nodeAnalysisListDetails = nodeAnalysisListDetails; 
} 

public void addNodeAnalysisListDetail(nodeAnalysisListDetails nodeAnalysisListDetails) { 
    this.nodeAnalysisListDetails.add(nodeAnalysisListDetails); 
} 
ReplyInfo replyInfo; 
public String getFormattedXML() { 
    return formattedXML; 
} 

public void setFormattedXML(String formattedXML) { 
    this.formattedXML = formattedXML; 
} 
String formattedXML; 
public NodeAnalysisRequest getRequest() { 
    return request; 
} 

public void setRequest(NodeAnalysisRequest request) { 
    this.request = request; 
} 
NodeAnalysisRequest request; 

List <nodeAnalysisListDetails> nodeAnalysisListDetails = new ArrayList < >(); 

} 
+0

私たちにNodeAnalysisReplyのコードを表示 –

+0

@JBNizetがOPに追加されました。 –

+0

リクエストフィールドが静的であると思われました。そうではありません。私の次の疑念は、parser.ParseXMLResponseは常に同じオブジェクトを返すということです。パーサーのコードを表示 –

答えて

0
synchronized (replies) { 
    System.out.println("Adding: " + curReply.getRequest().toString()); 
    replies.add(curReply); 
} 

ストリームのラムダ上記コードは副作用と呼ばれ、全く奨励されていません。

あなたがするべきことは、以下のようなものです。上記のコードで

​​

あなたは唯一の非ヌル値をフィルタリングし、最終的にあなたがリストにそれを収集し、あなたのrepliesリストにすべてのそれらの最初とNodeAnalysisReplyに各requestをマップします。

+0

私はこれにすべて同意しますが、質問には答えません。 –

+0

ありがとうございます。変化しないものの、「応答」の2つのオブジェクトはまだ同じです。 –

+0

@BenjaminLarsen私にとってはレースコンディションのようです。 '返信 'の同期ポリシーを確認してください – shazin