Подключение ресурсов jar-файла

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
Добрый. Толком решения не нашел...
Ситуация такая, есть LS агент (шедуль), внутри себя запускает java-агент (action list selection) через ag.run()
Все бы хорошо, но выпадает вот такая ошибка:
Exception in thread "AgentThread: JavaAgent"
java.lang.NoClassDefFoundError: nu.xom.Verifier (initialization failure)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:140)
at nu.xom.Element._setLocalName(Unknown Source)
at nu.xom.Element.<init>(Unknown Source)
at nu.xom.Element.<init>(Unknown Source)
at JavaAgent.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)
Caused by:
java.lang.RuntimeException: Broken XOM installation: could not load nu/xom/characters.dat
at nu.xom.Verifier.loadFlags(Unknown Source)
at nu.xom.Verifier.<clinit>(Unknown Source)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
... 6 more

Понимаю, что не может получить ресурс, вернее открыть в потоке. Потому что ресурс так таковой он находит, иначе была бы другая ошибка.
Более того, если из Designer сделать Run, все отрабатывает без ошибок.
Никто не сталкивался? Знаете как решить?

Я подозреваю две вещи:
1. Доп. настройки надо сделать.
2. XOM-код переписать именно этот кусок.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
на серванте, в папке ...\lib\ext
В notes.ini прописаны пути, да и пакет он видит
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Ситуация такая, есть LS агент (шедуль), внутри себя запускает java-агент (action list selection) через ag.run()
Не в тему: ситуация конечно специфическая с обработкой больших файлов... но в других случаях я не вижу смысла из агента, крутящегося на сервере, запускать ещё один с помощью Run, runWithDocumentContext(ndParam) гораздо лучше.
Для этого случая я бы тоже попробовал.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
Не вариант, да и контекста нет. Вопрос почему не может получить файл ресурса...
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
На какой-нибудь Permission в стек-трейсе не ругается? Попробуйте в java.policy в секции grant прописать permission java.security.AllPermission
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
Прописано по умолчанию. И да, не ругается. Ищу дальше.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
да, в самой секции grant такого не было, сейчас прописал, понаблюдаем...
Все равно как-то странно, policy такая же как у меня на клиенте, ничем не отличается, разве что это строчкой теперь.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
О, как... XML создан, теперь проблема вот в этом:
Exception in thread "AgentThread: JavaAgent"
error message: java.lang.NoClassDefFoundError: org.apache.commons.logging.LogFactory
error message: at com.zehon.FileTransferClient.<clinit>(FileTransferClient.java:50)
error message: at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:167)
at JavaAgent.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)

Caused by:
error message: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.lang.ClassNotFoundException.<init>(ClassNotFoundException.java:77)
at java.net.URLClassLoader.findClass(URLClassLoader.java:383)
at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:269)
at java.lang.ClassLoader.loadClass(ClassLoader.java:652)
at java.lang.ClassLoader.loadClass(ClassLoader.java:618)


Я так понял, что он нашел org.apache.commons.logging.LogFactory, но на клиенте работало...
Если я правильно понял, то мне надо найти этот класс в jar и подключит на сервере, да?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Если доки нет, то да, - ругается на недостачу класса, - добросил пакет, пробуем, опять недостача? - опять добрасываем...
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
Я так понял, что он нашел org.apache.commons.logging.LogFactory, но на клиенте работало...
Если я правильно понял, то мне надо найти этот класс в jar и подключит на сервере, да?
Это он хочет
Потом он ещё чего-нибудь попросит - ну, так и добавляй потихоньку, пока не угомонится.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
Угу, так и подумал, все еще учусь читать стеки...
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
Спасибо всем, передача удалась.
Еще только один вопрос, в логе было вот такое сообщение:
error message: 13.12.2012 12:41:07 org.apache.commons.vfs.VfsLog info
INFO: Using "C:\WINDOWS\TEMP\vfs_cache" as temporary files store.
На передачу файлов это не повлияло, но стало интересно критично ли данное сообщение?
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
Ключевое слово INFO:. Это Apache Commons Logging "улучшенные" логи пишет. Оно как-то должно настраиваться писать ли всё подряд или только ошибки.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
ммм, все прекрасно работало, но началась проблема:
com.zehon.exception.FileTransferException: org.apache.commons.vfs.FileSystemException: Unknown scheme "sftp" in URI
Понимаю, что возможно ошибка в пакете, из-за инициализации схемы.
Но в тоже время если сервер перезагрузить, то следующий запуск проходит без ошибки.
Предположение: LN-JVM "держит" в памяти экземпляр или контейнер java кода (не знаю как назвать все это) и не выгружает правильно.
Или я чего-то не дописал... Агент запускается раз в неделю, за ним почти не следим.
Ребутить серв раз в неделю - тупо не хочется, да и не правильно это. Может кто подскажет?
В коде ничего такого нет, так что выкладываю. Данный агент вызывается через LS агента, через Run. Может в этом дело?
Java:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ResourceBundle;
import java.util.Vector;

import lotus.domino.*;

import nu.xom.Attribute;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Serializer;

import com.zehon.FileTransferStatus;
import com.zehon.exception.FileTransferException;
import com.zehon.sftp.SFTPClient;

public class JavaAgent extends AgentBase {

    public String tempdir() {
        String tempdir = System.getProperty("java.io.tmpdir");
        if (!(tempdir.endsWith("/") || tempdir.endsWith("\\")))
            tempdir = tempdir + System.getProperty("file.separator");
        return tempdir;
    }
    
    public void NotesMain() {
        try {
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();
            
            // (Your code goes here)
            boolean debug = false;
            
            if (debug) System.out.println("Start");
            
            ResourceBundle settingsRes = ResourceBundle.getBundle("Sett");
            String ExportFileName = settingsRes.getString("ExportFile");
            String[] srvList = settingsRes.getString("ServerList").split(",");
            
            File exportFile = new File(tempdir() + ExportFileName);
            
            boolean flag = false;
            
            View vw = null;
            lotus.domino.Document doc = null;
            lotus.domino.Document tmpdoc = null;
            
            long cnt = 0;
            
            Element expRoot = new Element("ContactList");
            
            for (int i = 0; i < srvList.length; i++) {
                if (debug) System.out.println(srvList);
                
                Database db = session.getDatabase(srvList.toString(), "names.nsf", false);    //session.getCurrentDatabase();
                
                if (db != null && db.isOpen()) {
                    if (debug) System.out.println(db.getTitle());
                    vw = db.getView("EmailUser");
                    
                    if (vw.getEntryCount() > 0) {
                        doc = vw.getFirstDocument();
                        while (doc != null) {
                            //if (debug) System.out.println(doc.getFirstItem("MailFile").getValues().elementAt(0).toString());
                            
                            if (doc.getItemValueString("FirstName").length() != 0) {
                                if (debug) System.out.println(doc.getItemValueString("FirstName"));
                                Element child = new Element("Contact");
                                
                                Element tag = new Element("DisplayName");
                                lotus.domino.Item docfields = doc.getFirstItem("FullName");
                                Vector values = docfields.getValues();
                                docfields.recycle();
                                tag.appendChild(values.get(values.size()-1).toString());
                                child.appendChild(tag);
                                
                                tag = new Element("LastName");
                                tag.appendChild(doc.getItemValueString("LastName"));
                                child.appendChild(tag);
                                
                                tag = new Element("GivenName");
                                tag.appendChild(doc.getItemValueString("FirstName"));
                                child.appendChild(tag);
                                
                                tag = new Element("Company");
                                tag.appendChild(doc.getItemValueString("CompanyName"));
                                child.appendChild(tag);
                                
                                tag = new Element("SMTPAddress");
                                tag.appendChild(doc.getItemValueString("InternetAddress"));
                                child.appendChild(tag);
                                expRoot.appendChild(child);
                                
                                flag = true;
                                ++cnt;
                                if (debug) System.out.println("98");
                            }
                            
                            if (debug) System.out.println("100");
                            
                            tmpdoc = vw.getNextDocument(doc);
                            doc.recycle();
                            doc = tmpdoc;
                            
                            if (debug) System.out.println("104");
                        }
                        
                    }
                }
                
                vw.recycle();
                db.recycle();
                if (doc != null) doc.recycle();
                if (tmpdoc != null) tmpdoc.recycle();
            }
            
            if (flag) {
                Attribute count = new Attribute("Count",String.valueOf(cnt));
                expRoot.addAttribute(count);
                
                FileOutputStream ExportFile = new FileOutputStream(exportFile.getAbsoluteFile());
                Document expDoc = new Document(expRoot);
                try {
                    Serializer serializer = new Serializer(ExportFile, "ISO-8859-1");
                    serializer.setIndent(4);
                    serializer.setMaxLength(64);
                    serializer.write(expDoc);
                    ExportFile.close();
                }
                catch (IOException ioEx) {
                    ioEx.printStackTrace();
                }
            }
            
            String host = settingsRes.getString("host");
            String username = settingsRes.getString("username");
            String password = settingsRes.getString("password");
            String sftpFolder = settingsRes.getString("sftpFolder");
            String writeToLocalFolder = tempdir();
            String ImportFile = settingsRes.getString("ImportFile");
            
            SFTPClient SFTPObj = new SFTPClient(host, username,password);
            
            if (flag) {
                try {
                    int status = SFTPObj.sendFile(tempdir() + ExportFileName, sftpFolder);    //SFTPObj.getFile(ExportFile, "/", writeToLocalFolder);
                    
                    if (FileTransferStatus.SUCCESS == status)
                        if (debug) System.out.println("Send");
                    else if (FileTransferStatus.FAILURE == status)
                        if (debug) System.out.println("Can not sent sftp");
                }
                catch(FileTransferException ex) {
                    ex.getCause().printStackTrace();
                }
            }
            
            try {
                int status = SFTPObj.getFile(ImportFile, sftpFolder, writeToLocalFolder);
                
                if (FileTransferStatus.SUCCESS == status)
                    if (debug) System.out.println("Copy to " + writeToLocalFolder);
                else if(FileTransferStatus.FAILURE == status)
                    if (debug) System.out.println("Can not copy from sftp");
            }
            catch(FileTransferException ex) {
                ex.getCause().printStackTrace();
            }
            
            SFTPClient.closeCache();
            if (debug) System.out.println("Done");
            agentContext.recycle();
            session.recycle();
            System.gc();
        }
        catch (Exception e) {
            e.getCause().printStackTrace();
        }
    }
    
}
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
Предположение: LN-JVM "держит" в памяти экземпляр или контейнер java кода (не знаю как назвать все это) и не выгружает правильно.
то что лежит в lib/ext и не должно выгружаться...
я не понял насчет существования ResourceBundle settingsRes - оно вам для чего?
так понимаю - управляете через настройки..., дык почемубы не хранить настройки в доке нотусов?!
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
да, настройки через файл Settings в агенте.
Хранить в доке не хочется, даже профайл не хочется. Вот такая прихоть.
Если понадобиться другую адресную книгу синхронизировать, то просто перекинем агента, а в нем все есть.
Да, минус если измениться пароль и логин или адрес, но ничего сильно страшного.
как все же сделать успешным - второй запуск?
 
  • Нравится
Реакции: magistr

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
вот с этим объектом и морочтесь - как его дестроить ;)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!