スレッドセーフな Spring Web アプリケーションを作成するには?
一度に 250 件のリクエストを送信すると、デッドロックが発生します。この問題を解決するには?
1.Controller - このコントローラーは、呼び出し元からの要求を受け取ります。250 スレッドすべてが同時にヒットした場合。
public class TestController extends MultiActionController {
private SyncService synchronizationService;
public void setSynchronizationService(SyncService synchronizationService) {
this.synchronizationService = synchronizationService;
}
public void StoreData(HttpServletRequest request, HttpServletResponse response) {
byte[] syncData = null;
byte[] returnValue = null;
try {
syncData = readData(request);
returnValue = synchronizationService.receiveData(syncData);
} catch (Exception e) {
}
}
2.Helper - 入力を解析し、テーブルに入力します。
public class TestImpl implements SyncService {
private DataParser dataParser = null;
private QueueHelper queueHelper = null;
public void setDataParser(DataParser dataParser) {
this.dataParser = dataParser;
}
public void setQueueHelper(QueueHelper queueHelper) {
this.queueHelper = queueHelper;
}
public byte[] receiveData(byte[] data) throws HibernateException, NumberFormatException {
boolean addTransInQueue = false;
String dataString = null;
HashMap syncHashMap = null;
try {
InSyncModel syncModel = dataParser.parseData(dataString);
addTransInQueue = queueHelper.addTransInQueue(syncModel, data);
return "Succ".getBytes();
} catch (JsonSyntaxException jse) {
throw jse;
}
}
}
3.構成 - 上記のコードに使用される Bean インジェクション。
<bean name="synchronizationController" scope="request" class="TestController">
<property name="synchronizationService" ref="synchronizationService"/>
</bean>
<bean name="synchronizationService" scope="request" class="TestImpl">
<property name="dataParser" ref="dataParserObj"></property>
<property name="queueHelper" ref="queueHelperObj"></property>
</bean>
<bean name="dataParserObj" scope="request" class="DataParser"/>
<bean name="queueHelperObj" scope="request" class="QueueHelper">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>