xpages java多线程说明上下文未初始化错误
我正在尝试编写一些Java代码,这些代码将通过线程读取视图。我使用的是Callable而不是Runnable,如果我将其作为远程应用程序运行,也就是说,使用NCSO.jar使用Java CORBA/DIIOP方式连接到Domino,它就可以正常工作。 现在,当我试图将相同的代码移动到我的数据库时,我遇到了多个错误。最新的是 HTTP JVM:java.util.concurrent.ExecutionException:java.lang.IllegalStateException:NotesContext未为线程初始化。这是我的密码。AccessRequests(后面的类)是主AccessRequestsViewNav类的工作程序。我正在以1000个条目为单位阅读视图,所以我正在动态创建线程池和线程。当我从eclipse将其作为外部应用程序运行时,这是有效的代码,但当我在NSF文件中实现相同的代码时,则不是。 这是NSF中的代码 AccessRequestsViewNav.javaxpages java多线程说明上下文未初始化错误,java,multithreading,xpages,Java,Multithreading,Xpages,我正在尝试编写一些Java代码,这些代码将通过线程读取视图。我使用的是Callable而不是Runnable,如果我将其作为远程应用程序运行,也就是说,使用NCSO.jar使用Java CORBA/DIIOP方式连接到Domino,它就可以正常工作。 现在,当我试图将相同的代码移动到我的数据库时,我遇到了多个错误。最新的是 HTTP JVM:java.util.concurrent.ExecutionException:java.lang.IllegalStateException:NotesC
package com.company.apse.admin;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import lotus.domino.Database;
import lotus.domino.Session;
import lotus.domino.View;
import lotus.domino.ViewNavigator;
import com.ibm.commons.util.io.json.*;
import com.ibm.xsp.extlib.util.ExtLibUtil;
import com.ibm.domino.xsp.module.nsf.NSFComponentModule;
import com.ibm.domino.xsp.module.nsf.NotesContext;
import com.ibm.domino.xsp.module.nsf.SessionCloner;
public class AccessRequestsViewNav {
static JsonJavaObject jso = new JsonJavaObject();
static JsonJavaArray jsarr = new JsonJavaArray();
static SessionCloner sessionCloner;
static NSFComponentModule module;
public static String mainly() {
Session s = null;
Database database = null;
View accReqView = null;
int threadCount = 0;
Date sdate = new Date();
try {
/**
* we need handle current user session to compute common name in
* user names field
*/
s = ExtLibUtil.getCurrentSession();
module = NotesContext.getCurrent().getModule();
sessionCloner = SessionCloner.getSessionCloner();
database = ExtLibUtil.getCurrentDatabase();
accReqView = database.getView("MyView");
accReqView.setAutoUpdate(false);
threadCount = accReqView.getEntryCount();
if (threadCount % 1000 > 0) {
threadCount = threadCount / 1000 + 1;
} else {
threadCount = threadCount / 1000;
}
System.out.println(threadCount);
ViewNavigator nav = accReqView.createViewNav();
nav.setBufferMaxEntries(400);
jso.putArray("data", jsarr);
// Get ExecutorService from Executors utility class, thread pool
// size is decided based on viewentries ..one thread is supposed to
// handle 1000 entries
System.out.println("Creating executor service");
//ExecutorService executor = Executors.newFixedThreadPool(threadCount);
ExecutorService executor = Executors.newFixedThreadPool(5);
// create a list to hold the Future object associated with Callable
System.out.println("Creating list to hold future job");
List<Future<JsonJavaArray>> list = new ArrayList<Future<JsonJavaArray>>(threadCount);
for (int i = 0; i < threadCount; i++) {
System.out.println("Adding jobs to the list : " + i);
// submit Callable tasks to be executed by thread pool
Future<JsonJavaArray> future = executor.submit(new AccessRequests(module, sessionCloner, nav, 1 + i * 1000, 1000));
// add Future to the list, we can get return value using Future
list.add(future);
}
for (Future<JsonJavaArray> fut : list) {
try {
jsarr.add(fut.get());
} catch (InterruptedException e) {
System.out.println("Interrupt Exception : " + e.toString());
e.printStackTrace();
} catch (ExecutionException e) {
System.out.println("Executor Exception : " + e.toString());
System.out.println("");
e.printStackTrace();
}
}
// shut down the executor service now
System.out.println("Seems like processing is done.. shutdown executor");
executor.shutdown();
nav.recycle();
accReqView.recycle();
database.recycle();
s.recycle();
Date edate = new Date();
System.out.println(jso.size());
System.out.println("Finished .... finally ... Start: " + sdate + " Finish: " + edate);
jso.putJsonProperty("error", false);
} catch (Exception ex) {
// tbd: handle exception
jso.putJsonProperty("error", true);
jso.putJsonProperty("errorMessage", ex.toString());
ex.printStackTrace();
System.out.println(ex.getStackTrace().toString());
} finally {
jsarr = null;
}
return jso.toString();
}
}
**this is worker class**
**AccessRequests.java**
package com.company.apse.admin;
import java.util.concurrent.Callable;
import java.util.Date;
import java.util.Vector;
import lotus.domino.*;
import com.ibm.commons.util.io.json.*;
import com.ibm.domino.xsp.module.nsf.NSFComponentModule;
import com.ibm.domino.xsp.module.nsf.NotesContext;
import com.ibm.domino.xsp.module.nsf.SessionCloner;
public class AccessRequests implements Callable<JsonJavaArray> {
private ViewNavigator nav;
private int start;
private int ecount;
private SessionCloner sessionCloner;
private NSFComponentModule module;
Session session = null;
static JsonJavaArray jsarr = new JsonJavaArray();
public AccessRequests(NSFComponentModule module1, SessionCloner sc1, ViewNavigator nav1, int start1, int ecount1) {
this.sessionCloner = sc1;
this.module = module1;
this.nav = nav1;
this.start = start1;
this.ecount = ecount1;
}
@SuppressWarnings("unchecked")
public JsonJavaArray call() throws Exception {
System.out.println("Start : " + start);
Date sdate = new Date();
try {
NotesContext context = new NotesContext(this.module);
NotesContext.initThread(context);
Session session = this.sessionCloner.getSession();
Database db = session.getCurrentDatabase();
System.out.println(db.getTitle());
View view = db.getView("myView");
ViewNavigator nv = view.createViewNav();
nv.setBufferMaxEntries(400);
ViewEntry ve = nv.getNth(start);
int count = 1;
while (null != ve && count <= ecount) {
Vector v = ve.getColumnValues();
JsonJavaObject curObj = new JsonJavaObject();
curObj.put("rb", v.get(0)); // raised by
curObj.put("ro", v.get(1)); // raised on
curObj.put("rmd", v.get(2)); // Remedy
curObj.put("unid", v.get(3)); // Universal ID
curObj.put("excompany", v.get(4));
curObj.put("client", v.get(5));
curObj.put("newcompany", v.get(6));
curObj.put("apseuser", v.get(7));
jsarr.add(curObj);
curObj = null;
v = null;
count++;
ve = nav.getNext();
}
Date edate = new Date();
System.out.println("Start : " + start + " at " + sdate + " Finish: " + edate);
} catch (NotesException e) {
System.out.println("NotesException occured in worker class");
e.printStackTrace();
} catch (Exception e) {
System.out.println("Exception occured in worker class");
e.printStackTrace();
} finally {
NotesContext.termThread();
try {
this.sessionCloner.recycle();
} catch (NotesException nex) {
System.out.println("NEX Exception occured in worker class");
nex.printStackTrace();
}
}
return jsarr;
}
}
**this is working code as eclipse project**
**AccessRequestsViewNav.java**
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import lotus.domino.*;
import org.json.JSONArray;
import org.json.JSONObject;
import com.company.apse.admin.*;
public class AccessRequestsViewNav {
public static void main(String[] args) {
int threadCount = 0;
JSONObject jso = new JSONObject();
JSONArray jsarr = new JSONArray();
Date sdate = new Date();
try {
System.out.println("Creating a new session");
Session s = NotesFactory.createSession(hostname, user, password);
Database db = s.getDatabase("", "Testing/Demo.nsf");
View view = db.getView("myView");
view.setAutoUpdate(false);
threadCount = view.getEntryCount();
if (threadCount % 1000 > 0) {
threadCount = threadCount / 1000 + 1;
} else {
threadCount = threadCount / 1000;
}
System.out.println(threadCount);
ViewNavigator nav = view.createViewNav();
jso.put("data", jsarr);
// Get ExecutorService from Executors utility class, thread pool
// size is decided based on viewentries ..one thread is supposed to
//handle 1000 entries
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
// create a list to hold the Future object associated with Callable
List<Future<JSONArray>> list = new ArrayList<Future<JSONArray>>(threadCount);
for (int i = 0; i < threadCount; i++) {
// submit Callable tasks to be executed by thread pool
Future<JSONArray> future = executor.submit(new AccessRequests(nav, 1 + i * 1000, 1000));
// add Future to the list, we can get return value using Future
list.add(future);
}
for (Future<JSONArray> fut : list) {
try {
jsarr.put(fut.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
// shut down the executor service now
executor.shutdown();
nav.recycle();
view.recycle();
db.recycle();
s.recycle();
/*
* FileWriter file = new FileWriter("c:\\test.json");
*
* System.out.println("writing to file started");
* file.write(sdate.toString());
*
* file.write(jso.toString());
*/
Date edate = new Date();
/*
* file.write(edate.toString());
* System.out.println("writing to file finished"); file.flush();
* file.close();
*/
jsarr = null;
jso = null;
System.out.println("Finished .... " + sdate + " Finish: " + edate);
} catch (Exception e) {
e.printStackTrace();
}
}
}
**AccessRequests.Java**
package com.company.apse.admin;
import java.util.concurrent.Callable;
import java.util.Date;
import java.util.Vector;
import lotus.domino.*;
import org.json.*;
public class AccessRequests implements Callable<JSONArray> {
private ViewNavigator nav;
private int start;
private int ecount;
public AccessRequests(ViewNavigator nav1, int start1, int ecount1) {
this.nav = nav1;
this.start = start1;
this.ecount = ecount1;
}
@Override
public JSONArray call() throws Exception {
System.out.println("Start : " + start);
JSONArray jsarr = new JSONArray();
Date sdate = new Date();
try {
/*
* FileWriter file = new FileWriter("c:\\test-start-at-" + start +
* ".json");
*
* file.write(sdate.toString());
*/
ViewEntry ve = nav.getNth(start);
int count = 1;
while (null != ve && count <= ecount) {
@SuppressWarnings("rawtypes")
Vector v = ve.getColumnValues();
JSONObject curObj = new JSONObject();
curObj.put("a1", v.get(0)); // raised by
curObj.put("a2", v.get(1)); // raised on
curObj.put("a3", v.get(2)); // Remedy
curObj.put("unid", v.get(3)); // Universal ID
curObj.put("a4", v.get(4));
// file.write(curObj.toString());
jsarr.put(curObj);
// System.out.println(curObj.toString());
curObj = null;
v = null;
count++;
// System.out.println(count);
ve = nav.getNext();
}
// file.write(jsarr.toString());
// nav.recycle();
Date edate = new Date();
/*
* file.write(edate.toString()); file.flush(); file.close();
*/
System.out.println("Start : " + start + " at " + sdate + " Finish: " + edate);
} catch (NotesException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return jsarr;
}
}
package com.company.apse.admin;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.List;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Future;
导入lotus.domino.Database;
导入lotus.domino.Session;
导入lotus.domino.View;
导入lotus.domino.ViewNavigator;
导入com.ibm.commons.util.io.json.*;
导入com.ibm.xsp.extlib.util.ExtLibUtil;
导入com.ibm.domino.xsp.module.nsf.nsfc组件模块;
导入com.ibm.domino.xsp.module.nsf.NotesContext;
导入com.ibm.domino.xsp.module.nsf.SessionCloner;
公共类AccessRequestsViewNav{
静态JsonJavaObject jso=新的JsonJavaObject();
静态JsonJavaArray jsarr=新JsonJavaArray();
静态SessionCloner SessionCloner;
静态NSF组件模块;
公共静态字符串(){
会话s=null;
数据库=null;
视图:qview=null;
int threadCount=0;
日期sdate=新日期();
试一试{
/**
*我们需要处理当前用户会话以计算中的公共名称
*用户名字段
*/
s=ExtLibUtil.getCurrentSession();
module=NotesContext.getCurrent().getModule();
sessionCloner=sessionCloner.getSessionCloner();
database=ExtLibUtil.getCurrentDatabase();
accReqView=database.getView(“MyView”);
acgreqview.setAutoUpdate(false);
threadCount=acgreqview.getEntryCount();
如果(线程数%1000>0){
threadCount=threadCount/1000+1;
}否则{
threadCount=threadCount/1000;
}
System.out.println(线程数);
ViewNavigator nav=acgreqview.createViewNav();
资产净值(400);
putArray(“数据”,jsarr);
//从Executors实用程序类、线程池获取ExecutorService
//大小根据viewentries确定。应该有一个线程
//处理1000个条目
System.out.println(“创建执行器服务”);
//ExecutorService executor=Executors.newFixedThreadPool(线程计数);
ExecutorService executor=Executors.newFixedThreadPool(5);
//创建一个列表以保存与Callable关联的未来对象
System.out.println(“创建保存未来作业的列表”);
List List=新的ArrayList(线程数);
对于(int i=0;i java.lang.SecurityException: ECL Permission Denied (java.lang.RuntimePermission modifyThread