我遇到了一个非常奇怪的问题。 我有一个使用 Struts2 构建的 Web 应用程序,两个动作文件和一个 jsp 文件。 该函数是提交表单并从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。
周三 8 月 29 日 10:55:40 2018 GMT (http-bio-8663-exec-8( customersegment.ui.html.actions.edit.CustomerSegmentAddCustomerIdAction: 线程 ID 为: 44 csId: 8787
周三 8 月 29 日 10:55:40 2018 GMT (http-bio-8663-exec-8( customersegment.ui.html.actions.edit.CustomerSegmentAddCustomerIdAction: 线程 ID 为: 44 csId: 8787
周三 8 月 29 日 10:55:40 2018 GMT (http-bio-8663-exec-8( customersegment.ui.html.actions.edit.CustomerSegmentAddCustomerIdAction: 线程 ID 为: 44 csId: 28475
我认为您确实对此日志记录命令感到困惑。
Struts 2 在单个线程中执行每个请求。 您的记录器是否打印当前线程 ID 以查看差异?
尝试使用log.info(java.lang.Thread.currentThread().getId() + " csId: " + csId)
记录当前线程 ID。
我找到了使用 Spring 创建动作 bean 的根本原因,默认情况下作用域是单例。 将范围更改为原型。