2013-09-13 3 views
0

У меня есть этот небольшой фрагмент кода, который регистрируется для нескольких СУБД_ALERT и выполняется асинхронно в сервлете, возвращающем ответы в JSONArray. Проблема в том, что он регистрируется и работает только для предупреждения FIRST, но не для других?Регистрация и получение результатов из нескольких DBMS_ALERTS в Java

При запуске этого сценария SQL все хорошо и денди.

SQL-скрипт я использую:

DECLARE 
alt varchar(100); 
msg varchar(100); 
sts integer; 

BEGIN 

dbms_alert.register('appdelete'); 
dbms_alert.register('devicelock'); 
dbms_alert.register('userlostapp'); 
dbms_alert.register('userlostdevice'); 

dbms_alert.waitany(alt,msg,sts,60); 
dbms_output.put_line('alt= '||alt||' msg= '||msg||' sts= '||sts||chr(10)); 

END; 

Кроме того, он никогда не работает части System.out в моем методе. Почему это? Я сделал некоторые глупые ошибки с AsynkTask (первый раз, когда я использую его, пожалуйста, будьте нежны)?

Что мне здесь не хватает?


Код, который регистрирует DBMS_ALERTs:

protected JSONArray dbmsAlert() { 

    JSONArray DBMSResponse = new JSONArray(); 
    JSONObject responseRow = new JSONObject(); 

    CallableStatement cs1 = null; 
    CallableStatement cs2 = null; 

    String sql, sql1, sql2, sql3, sql4 = null; 

    try { 
     System.out.println("Trying to establish connection..."); 
     conn = ds1.getConnection(); 

     sql1 = "{call dbms_alert.register('appdelete')}"; 
     sql2 = "{call dbms_alert.register('devicelock')}"; 
     sql3 = "{call dbms_alert.register('userlostapp')}"; 
     sql4 = "{call dbms_alert.register('userlostdevice')}"; 

     System.out.println("Connection established!"); 

     for (int i = 1; i < 4; i++) { 
      System.out.println("Entered FOR LOOP!"); 
      cs1 = conn.prepareCall("sql" + i); 
      System.out.println("sql" + i); 
      cs1.execute(); 
     } 

     sql = "{call dbms_alert.waitone(?, ?, ?, 86400)}"; 

     System.out.println("Preparring Call for cs2..."); 
     cs2 = conn.prepareCall(sql); 

     System.out.println("Registering Parametrs for cs2..."); 
     cs2.registerOutParameter(1, Types.VARCHAR); 
     cs2.registerOutParameter(2, Types.VARCHAR); 
     cs2.registerOutParameter(3, Types.INTEGER); 

     int x = 0; 
     int i = 0; 

     System.out.println("DONE Preparring Call and Registering Parametrs!"); 
     while(x == 0) { 
      System.out.println("Entered WHILE LOOP!"); 
      i++; 
      cs2.execute(); 
      Integer result = cs2.getInt(3); 

      if (result == 1) { 
       System.out.println("dbmsAlert |DBMSResponse| for 1 : " + result); 
      } else { 
       String Result2 = cs2.getString(2); 
       responseRow.put("DBMS", Result2); 
       DBMSResponse.put(i, responseRow); 

      } 
     } 
    } catch (Exception e) { 
     //TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally { 
     try { 
      cs2.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     try { 
      cs1.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     try { 
      conn.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    System.out.println("dbmsAlert |DBMSResponse| for 0 : " + DBMSResponse); 
    return DBMSResponse; 
} 



код, который запускает dbmsAlert() асинхронно:

1. doGet() часть:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    final AsyncContext asyncContext = request.startAsync(request, response); 
    asyncContext.setTimeout(0); 
    contexts.add(asyncContext); 

    System.out.println("| contexts | contains : " + contexts.size() + " asyncContext elements"); 

    try { 
     System.out.println("| HANDLING REQUEST |"); 
     handleRequests(request, response); 
     System.out.println("| HANDLING REQUEST end |"); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

2. doPost() часть:

protected void doPost(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

    doGet(request, response); 

    List<AsyncContext> asyncContexts = new ArrayList<>(this.contexts); 
    this.contexts.clear(); 

    System.out.println("| HANDLING RESPONSE |"); 

    System.out.println("| doPost | FOR REACHED!"); 
    for (AsyncContext asyncContext : asyncContexts) { 

     int i = 1; 

     System.out.println("| doPost | TRY REACHED!"); 
     try { 
      asyncContext.getResponse(); 
      System.out.println("| dbmsAlert | REACHED! " + i++); 
      dbmsAlert(); 
      System.out.println("| dbmsAlert | PASSED! " + i++); 
      asyncContext.complete(); 
      System.out.println("| HANDLING RESPONSE end |"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 



Спасибо.

ответ

0

Обнаружена проблема!

ЭТА кусок кода (теперь, когда я смотрю на это больно глаза):

for (int i = 1; i < 4; i++) { 
    System.out.println("Entered FOR LOOP!"); 
    cs1 = conn.prepareCall("sql" + i); 
    System.out.println("sql" + i); 
    cs1.execute(); 
} 


ДОЛЖНЫ БЫТЬ так:

String[] sqls = new String[] {sql1, sql2, sql3, sql4}; 

for (int i = 0; i < 4; i++) { 
    ALERTS.add(i, sqls[i]); 
    System.out.println("ALERTS : " + ALERTS.get(i)); 

    csA = conn.prepareCall(ALERTS.get(i)); 
    csA.execute(); 
} 



На самом деле действительно ... глупая ошибка.

Смежные вопросы