我正在尝试构建一个始终检索相同文档(计数器文档)的bean,获取当前值,递增它并使用新值保存文档。最后它应该将值返回给调用方法,这将在我的Xpage中获得一个新的序列号。
由于Domino对象无法序列化或单例化,创建bean的好处是什么,而不是创建SSJS函数做同样的事情?
我的bean必须调用session,database,view和document,然后每次调用它。
SSJS函数中的内容与会话和数据库相同。
豆:
public double getTransNo() {
try {
Session session = ExtLibUtil.getCurrentSession();
Database db = session.getCurrentDatabase();
View view = db.getView("vCount");
view.refresh();
doc = view.getFirstDocument();
transNo = doc.getItemValueDouble("count");
doc.replaceItemValue("count", ++transNo);
doc.save();
doc.recycle();
view.recycle();
} catch (NotesException e) {
e.printStackTrace();
}
return transNo;
}
SSJS:
function getTransNo() {
var view:NotesView = database.getView("vCount");
var doc:NotesDocument = view.getFirstDocument();
var transNo = doc.getItemValueDouble("count");
doc.replaceItemValue("count", ++transNo);
doc.save();
doc.recycle();
view.recycle();
return transNo;
}
谢谢
答案 0 :(得分:3)
这两段代码都不好(抱歉直言不讳) 如果视图中有一个文档,则不需要在另一个视图上刷新后排队的视图刷新,并且速度非常慢。大概你在谈论一个单一的服务器解决方案(因为复制计数器文件肯定会导致冲突)。
你在XPages中做的是创建一个Java类并将其声明为应用程序bean:
public class SequenceGenerator {
// Error handling is missing in this class
private double sequence = 0;
private String docID;
public SequenceGenerator() {
// Here you load from the document
Session session = ExtLibUtil.getCurrentSession();
Database db = session.getCurrentDatabase();
View view = db.getView("vCount");
doc = view.getFirstDocument();
this.sequence = doc.getItemValueDouble("count");
this.docID = doc.getUniversalId();
Utils.shred(doc, view); //Shred currenDatabase isn't a good idea
}
public synchronized double getNextSequence() {
return this.updateSequence();
}
private double updateSequence() {
this.sequence++;
// If speed if of essence I would spin out a new thread here
Session session = ExtLibUtil.getCurrentSession();
Database db = session.getCurrentDatabase();
doc = db.getDocumentByUnid(this.docID);
doc.ReplaceItemValue("count", this.sequence);
doc.save(true,true);
Utils.shred(doc);
// End of the candidate for a thread
return this.sequence;
}
}
SSJS代码的问题:如果2个用户一起命中,会发生什么?至少你也需要在那里使用synchronized
。使用bean也可以在EL中访问它(你需要注意不要经常调用它)。同样在Java中,您可以将写入推迟到另一个线程 - 或者根本不将其写回来,在类中初始化代码使用实际文档读取视图并从那里选择值。
更新:Utils是一个使用静态方法的类:
/**
* Get rid of all Notes objects
*
* @param morituri = the one designated to die, read your Caesar!
*/
public static void shred(Base... morituri) {
for (Base obsoleteObject : morituri) {
if (obsoleteObject != null) {
try {
obsoleteObject.recycle();
} catch (NotesException e) {
// We don't care we want go get
// rid of it anyway
} finally {
obsoleteObject = null;
}
}
}
}