JavaScript調用Applet方法,Applet異步調用遠程RPC。

項目中涉及到JavaScript調用Applet方法,然後Applet遠程調用Server端的service。雖然Applet已經簽名,但由於JavaScript是不被JavaVM信任的,迫不得已使用異步調用remote API。遠程API使用Hessian實現的。

1。被JavaScript調用的Applet方法

    public String deleteFaceId(String faceId) {
     String result = null;
     
     try {
      Task task = new Task("deleteFaceById");
      task.setTypes(new Class[] {String.class, Calendar.class, String.class});
      task.setArgs(new Object[] {faceId,
warituke.table.getPubDate(), warituke.table.getMediaId()});
      
      tasks.add(task);

      ServiceContext temp = (ServiceContext)getResult(task.getName());

       if (temp.getAttribute("warning") != null) {
        result = (String)temp.getAttribute("warning");
       }
       if (temp.getAttribute("error") != null) {
        result = (String)temp.getAttribute("error");
       }
      
       warituke.setTable((Table)temp.getAttribute("result"));
      
       displayTable(warituke.table);
     } catch (Exception e) {
        log.log(Level.SEVERE, e.getMessage(), e);
        result = e.getMessage();
     }

        return result;
    }

 2。 Task代表一個方法調用

public class Task {
 private String name;
 private Class[] types;
 private Object[] args;
 private Object result;
 
 public Task() {}
 
 public Task(String name) {
  this.name = name;
 }
 
 public Object[] getArgs() {
  return args;
 }
 public void setArgs(Object[] args) {
  this.args = args;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Class[] getTypes() {
  return types;
 }
 public void setTypes(Class[] types) {
  this.types = types;
 }

 public Object getResult() {
  return result;
 }

 public Task setResult(Object result) {
  this.result = result;
  
  return this;
 }
}
3. Applet

public class BaseApplet extends Applet implements Runnable {

    Vector tasks = new Vector();
    Vector taskResults = new Vector();


public void init() {

new Thread(this).start();

}

//接受返回參數的方法。

 public Object getResult(String name) {
  do {
   try {
    Thread.sleep(200);
   } catch (Exception e) {
    log.log(Level.SEVERE, e.getMessage(), e);
   }
  } while (taskResults.size() == 0);

  Task[] tasks = (Task[]) taskResults.toArray(new Task[0]);
  for (int i = 0; i < tasks.length; i++) {
   Task task = tasks[i];

   if (task.getName().equals(name)) {
    taskResults.remove(task);

    return task.getResult();
   }
  }

  return null;
 }

//Applet的執行遠程調用的線程

 public void run() {
  while (true) {

   if (tasks.size() > 0) {
    Task task = (Task) tasks.get(0);

    try {
     Method m = service.getClass().getMethod(task.getName(), task.getTypes());
     Object result = m.invoke(service, task.getArgs());

     taskResults.add(task.setResult(result));
    } catch (Exception e) {
     log.log(Level.SEVERE, e.getMessage(), e);
    }

    tasks.remove(0);
   }

   try {
    Thread.sleep(100);
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }

 

}

網頁裏貼代碼好醜啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章