我有一个很奇怪的问题。 我有一个使用Struts2,两个动作文件和一个jsp文件构建的Web应用程序。 功能是提交表单并从UI获取csId。 但是,我发现如果打开两个窗口以单击表单以提交不同的csId,我可以看到该csId在操作循环中被更改了。
我认为操作是线程安全的,但是其他用户的操作如何在我的操作中更改csId? 请帮忙。
有两个动作文件:
public abstract class CustomerSegmentCrudBaseAction extends BaseAction {
protected String csId;
public String execute() throws PromotionException{
return ActionSupport.SUCCESS;
}
public String getCsId() {
return csId;
}
public void setCsId(String csId) {
this.csId = csId;
}
}
public class CustomerSegmentAddCustomerIdAction extends CustomerSegmentCrudBaseAction {
public String execute(){
for(int i = 0;i<10000;i++){
log.info(java.lang.Thread.currentThread().getId() + " csId: " + csId);
}
}
}
jsp文件:
<s:form action="add-ids-customer-segment" method="post" enctype="multipart/form-data" onsubmit="var customerCount = getCustomerIdCount(); return confirm('Are you sure to upload ' + customerCount +' customers?');">
<table><tbody><tr>
<td class="cell">
<s:textarea label="Customer ID" labelposition="false" id="csCustomerIds" name="csCustomerIds" value="" rows="2" cssClass="wide" theme="css_xhtml"/>
</td>
<td class="cell">
<s:submit value="Add" theme="css_xhtml"/>
</td>
</tbody></table>
<s:hidden name="csId" value="%{getCsId()}" />
</s:form>
我还打印了线程ID,我可以看到有两个不同的线程。一个线程中的csId更改为另一个线程中的另一个csId。
2018年8月29日星期三10:55:40 GMT(http-bio-8663-exec-8)customeregment.ui.html.actions.edit.CustomerSegmentAddCustomerIdAction:线程ID为:44 csId:8787
2018年8月29日星期三10:55:40 GMT(http-bio-8663-exec-8)customeregment.ui.html.actions.edit.CustomerSegmentAddCustomerIdAction:线程ID为:44 csId:8787
2018年8月29日星期三10:55:40 GMT(http-bio-8663-exec-8)customeregment.ui.html.actions.edit.CustomerSegmentAddCustomerIdAction:线程ID为:44 csId:28475
答案 0 :(得分:0)
我认为您确实将这个日志命令弄糊涂了。
Struts 2在单个线程中执行每个请求。 您的Logger是否打印当前线程ID以查看差异?
尝试也使用log.info(java.lang.Thread.currentThread().getId() + " csId: " + csId)
记录当前线程ID。
答案 1 :(得分:0)
我发现根本原因是我使用Spring创建动作bean,默认情况下范围是单例。 将范围更改为原型。