Struts2 动作设置器方法不是线程安全的?



我遇到了一个非常奇怪的问题。 我有一个使用 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 的根本原因,默认情况下作用域是单例。 将范围更改为原型。

相关内容

  • 没有找到相关文章

最新更新