【发布时间】:2016-10-27 15:20:15
【问题描述】:
我在网页上执行我的 API 时收到了混乱的响应。
回溯了一下,发现 Angular 以正确的方式触发它,但 API 对并发请求的响应不一。
在网上搜索发现Java servlet中的全局变量可能会触发异常行为,因为一个线程可能会访问另一个变量当前正在处理的变量。
说到这里,我意识到PrintWriter 在这里制造了一个问题。但我遇到的困难是如何摆脱问题。
也可能是当前的问题与我的结论完全无关。 请在我错误地导出任何错误的地方纠正我。
@WebServlet(name = "WorkSpaceDetails", urlPatterns = {"/WorkSpaceDetails"})
public class WorkSpaceDetails extends HttpServlet {
PrintWriter out;
private static final long serialVersionUID = 1L;
private void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, Exception {
String wid = request.getParameter("id");
try {
id = Integer.parseInt(wid);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
out = response.getWriter();
Connection conn = null;
PreparedStatement prx = null;
PreparedStatement pry = null;
ResultSet set = null;
ResultSetMetaData metaData;
String query;
JSONObject obj = new JSONObject();
String WorkSpaceType;
List<HashMap> completeData = new ArrayList<HashMap>();
List<String> ColoumnNames = new ArrayList<String>();
List<String> Data = new ArrayList<String>();
try {
query = "-";
conn = boneCPConnectionPool.getConnection();
prx = conn.prepareStatement(query);
prx.setInt(1, id);
set = prx.executeQuery();
while (set.next()) {
WorkSpaceType = set.getString("WorkSpaceType");
System.out.println("WorkSpaceType:" + WorkSpaceType);
if (WorkSpaceType.equalsIgnoreCase("1")) {
System.out.println("" + 1);
query = "-";
} else {
System.out.println("" + 0);
query = "-";
}
conn = boneCPConnectionPool.getConnection();
pry = conn.prepareStatement(query);
pry.setInt(1, id);
set = pry.executeQuery();
metaData = set.getMetaData();
int count = metaData.getColumnCount();
for (int i = 1; i <= count; i++) {
System.out.println("" + metaData.getColumnName(i));
ColoumnNames.add(metaData.getColumnName(i));
}
while (set.next()) {
HashMap tmp = new HashMap();
for (int i = 0; i < ColoumnNames.size(); i++) {
String cname = ColoumnNames.get(i);
tmp.put(cname, set.getString(cname));
tmp.put("WorkSpaceType", WorkSpaceType);
}
System.out.println("" + tmp);
completeData.add(tmp);
generateJson(completeData);
}
}
} catch (Exception e) {
e.printStackTrace();
out.println(e);
} finally {
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
}
}
if (set != null) {
try {
set.close();
} catch (SQLException ignore) {
}
}
if (prx != null) {
try {
prx.close();
} catch (SQLException ignore) {
}
}
if (pry != null) {
try {
pry.close();
} catch (SQLException ignore) {
}
}
}
} catch (Exception e) {
JSONObject obj = new JSONObject();
obj.put("Error", "BLANK ID");
System.out.println(obj.toString());
e.printStackTrace();
}
}
private void generateJson(List<HashMap> data) {
JSONObject obj = new JSONObject();
try {
for (HashMap map : data) {
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
String key = (String) pair.getKey();
String value = (String) pair.getValue();
if (value == null) {
value = "blank";
}
obj.put(key, value);
}
}
out.println(obj.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
out = response.getWriter();
JSONObject obj = new JSONObject();
try {
obj.put("Error", "API Protected Get Request");
} catch (JSONException ex) {
Logger.getLogger(WorkSpaceDetails.class.getName()).log(Level.SEVERE, null, ex);
}
out.println(obj.toString());
out.close();
System.out.println("API Protected:Get Request");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
out = response.getWriter();
JSONObject obj = new JSONObject();
try {
processRequest(request, response);
} catch (NumberFormatException ex) {
try {
obj.put("Error", "ID NULL");
} catch (JSONException ex1) {
Logger.getLogger(WorkSpaceDetails.class.getName()).log(Level.SEVERE, null, ex1);
}
out.println(obj.toString());
} catch (Exception ex) {
try {
obj.put("Error", "TOKEN NULL");
} catch (JSONException ex1) {
Logger.getLogger(WorkSpaceDetails.class.getName()).log(Level.SEVERE, null, ex1);
}
out.println(obj.toString());
out.close();
}
}
@Override
public String getServletInfo() {
return "Servlet to get info of a Workspace";
}
}
【问题讨论】:
标签: java multithreading servlets