Domino Open Liberty Runtime

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
По поводу внешней JVM есть интересный проект .
Удалось прикрутить сервер Open Liberty (внедренный в Domino) к IDEA.

@Author - Jesse Gallagher
@Source - GitHub - OpenNTF/openliberty-domino: Open Liberty server embedded in Domino

Хотел бы поделиться своими изысканиями по поводу сабжа.

В сухом остатке получаем современные javaEE подходы и инструменты: нормальная IDE + JVM 11 (возможны другие) + servlet-api-4.0, el-3.0, jsp-2.3 + возможность стандартной VCS.

Понятно, что проект еще сыроват - замечено выпадение domino в NSD (при завершении) и как бы не совсем легаси.
Тем не менее, как мне кажется, заслуживает внимания. Автору большой респект.

3-я версия запилена на автоматическое скачивание всего необходимого (open liberty, jvm ...) из интернета. Поэтому за прокси поставить у меня не получилось, хотя автор давал пару советов по предварительной ручной закачке и размещении. Но пока руки для проверки не дошли.

How does it work? Author answer:
As for how this all works, it comes from how Notes's shared memory works, and how it can be shared generally cleanly by child processes. It's actually basically the same way that all of the addin tasks, HTTP included, work, where they're really just child processes of the main Domino server task. Since these Liberty instances are doing the same sort of thing, they can access the Domino API as the server the same way other tasks can. They just have to obey the same rules that addins do: make sure to use NotesInit/NotesTerm for the process, make sure to do NotesInitThread/NotesTermThread for each thread, etc.. The notesRuntime feature just does the above at a server level, so your individual app doesn't have to worry about it. The calls at the same, though.

После установки на сервер необходимо создать конфигурацию. Здесь важно указать "Integration Features: Domino API" для использования domino-классов и <feature>localConnector-1.0</feature> - для удаленного доступа к серверу.

1638987641495.png


Далее в проекте JavaEE необходимо подключить remote WebSphere/Liberty.

1638987841739.png


В качестве Domino API необходимо подключить Notes.jar (или domino-jna) через системные библиотеки или мавен (тут на любителя).

1638987969683.png


Запускаем сервер.

1638988062249.png


1638988086639.png


Build + deploy = Получаем выхлоп в браузере.

index.jsp:

1638988833682.png


1638988181407.png


test servlet:

1638988211984.png


1638988256972.png


Автор кода: Jesse Gallagher
Java:
package example;

import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import lotus.domino.NotesFactory;
import lotus.domino.NotesThread;
import lotus.domino.Session;

@WebServlet("/hello")
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    private ExecutorService exec;
 
    @Override
    public void init() throws ServletException {
        exec = Executors.newCachedThreadPool(NotesThread::new);
    }
 
    @Override
    public void destroy() {
        exec.shutdownNow();
        try {
            exec.awaitTermination(5, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/plain");
    
        try {
            String username = exec.submit(() -> {
                Session session = NotesFactory.createSession();
                try {
                    return session.getEffectiveUserName();
                } finally {
                    session.recycle();
                }
            }).get();

            resp.getWriter().println("I am " + username);
        } catch (InterruptedException | ExecutionException e) {
            throw new ServletException(e);
        }
    }
}
 
  • Нравится
Реакции: lmike и VladSh

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
По поводу внешней JVM есть интересный проект .
В проекте можно прикрутить разную JVM, использовать jsp, jsf, el, servlet-api-4.0...
Удалось прикрутить сервер Open Liberty (внедренный в Domino) к IDEA.
интересно, но "как всегда", при обсуждении доп. развертывания, в нек. компаниях, этот вариант под сомнением (поддержка)
 

savl

Lotus Team
28.10.2011
2 625
314
BIT
544
По поводу внешней JVM есть интересный проект .
В проекте можно прикрутить разную JVM, использовать jsp, jsf, el, servlet-api-4.0...
Удалось прикрутить сервер Open Liberty (внедренный в Domino) к IDEA.
Я так понимаю, что она не может работать с обычными агентами, а значит их надо мигрировать, полноценно.
Я пока третью версию не смотрел, но Джесси что-то там много сделал.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Мне видится, что инструмент подразумевает возможность web-разработки в сторонных IDE. Лотусовую парадигму разработки можно забыть и переключиться на современные javaEE подходы и инструменты. Большим плюсом, мне кажется, будет стандартная поддержка VCS.
как общее направление - оно так и мну нра
а вот в каком режиме оно работает с внешней жвм - для меня не ясно
+ как уже упоминал @savl РЕСТАПИ даст подобно (если мы про ноду и иже с ней) и в текущей сборке Джесси юзает "старые" notes.jar со всем ворохом их наследия
проксирование с копирование кук авторизации (получится прозрачно гонять, и какие накладные расходы) - вязкая тема, если рассматривать 2FA....
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
@Imike
Мне пока тоже не понятно...

Пока получилось использовать notes-классы только с JVM из Domino. Сторонние JVM ругаются на "WLP: Caused by: java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.UnsatisfiedLinkError: lotus/domino/local/Session.NCreateSession(I)J " или "WLP: Caused by: java.lang.UnsatisfiedLinkError: Native Library /opt/ibm/domino/notes/10000000/linux/liblsxbe.so already loaded in another classloader".

Но это я, видимо, не умею их готовить. У Джесси по этому поводу есть:

Domino API Access​

Code that uses the Notes runtime should take care to terminate all Notes-initialized threads, as leaving threads open may lead to server crashes. In practice, these steps have helped avoid trouble:

  • Ensure that any ExecutorService that contains Notes threads is shut down properly in a ServletContextListener
  • Run any Notes-based code in infrastructure listeners (such as ServletContextListeners) inside explicit NotesThreads and use Thread#join to wait for their results

Но это пока выше моего понимания.
 

savl

Lotus Team
28.10.2011
2 625
314
BIT
544
3-я версия запилена на автоматическое скачивание всего необходимого (open liberty, jvm ...) из интернета.
А вот как это правильно понять?
Имеет в виду скачка именно для сервера? не на локальной машине при разработке/сборке/деплое?
Серверу нужен выход и инет?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Java:
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/plain");
    
        try {
            String username = exec.submit(() -> {
                Session session = NotesFactory.createSession();
                try {
                    return session.getEffectiveUserName();
                } finally {
                    session.recycle();
                }
            }).get();

            resp.getWriter().println("I am " + username);
        } catch (InterruptedException | ExecutionException e) {
            throw new ServletException(e);
        }
    }
}
А где (откуда) сам doGet вызывается?
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
А вот как это правильно понять?
Имеет в виду скачка именно для сервера? не на локальной машине при разработке/сборке/деплое?
Серверу нужен выход и инет?

На локальной машине при разработке/сборке/деплое для domino open liberty интернет НЕ нужен.
При первичной установке domino open liberty (или изменении состава компонентов) нужен выход в интернет серверу.

Я задавал вопрос про установку за корпоративным прокси.

Ответ автора:
Hmm, it should be, though, the toolkit doesn't do anything specific to help in this case. There's two aspects that I can think of to make it work. However, as I was typing, I realized that a change in version 3.0 makes it trickier to work around, and may involve some changes on my end.

Since the downloads it does use the normal URLConnection route in Java, you could use the "http.proxyHost"/"http.proxyPort"/"https.proxyHost"/"https.proxyPort" Java properties if the proxy is basic: . That wouldn't account for authentication (which would require special code in the toolkit side, from what I can gather here) or if it's something other than a normal HTTP proxy.

Alternatively, you could avoid the toolkit attempting to do downloads at all by pre-populating the JVM (optionally) and the Liberty instance. These are downloaded into the "<domino program>\wlp" directory on Windows or "<domino data>\wlp" directory on Linux by default, and that can be configured in the NSF. The structure for the two components is:

If you use the Domino JVM, you can skip pre-downloading the JVM. Otherwise, the JVMs are downloaded to a "jvm" directory within the "wlp" one, and then by major version and type. For example: "11-OpenJ9" for the IBM Semeru/OpenJ9 build of Java 11 or "11-HotSpot" for the Adoptium build of Java 11. Those directories just have the expanded contents of the ZIP/tar.gz you'd get from those sites.

For the Liberty downloads, you could download one of the "All GA Features" builds from and then place them into a directory based on the build number. For example, 21.0.0.12 will be in the directory "wlp-21.0.0.12".

In both of these cases, the runtime should see the presence of the downloaded files and skip trying to download them itself.

Thinking further, there's one last bit that the runtime attempts to auto-download as of version 3.0, and that's the CORBA file for the Notes API bundle. Unfortunately, this one may be the part that breaks it: it pre-caches the final result, but it's not redistributable legally, and it's specific to the build of the Domino server. I'll think about ways to get around this, but in the mean time it'd be safest to use a version previous to 3.0.

Заведен соответсвующий issue (Improve handling of "/" context roots in the UI and reverse proxy · Issue #75 · OpenNTF/openliberty-domino).

Мои настройки:

1639031986933.png


Вот какая структура каталогов у меня получилась:

1639031303038.png


папка wlp находится в доминошном каталоге (в linux = notesdata, windows = domino (создавать на уровне data))

download:

1639031790598.png


jvm:

1639031833717.png


wlp-21.0.0.2

1639031896656.png


work:

1639038485978.png
 
Последнее редактирование:
  • Нравится
Реакции: VladSh

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
Еще пример ExampleContextListener от @Author - Jesse Gallagher

Альтернатива notesRuntime-1.0.
Из-за:
notesRuntime-1.0 + HotSpot 1.8 = good;

notesRuntime-1.0 + HotSpot 11 = WLP: Unresolved requirement: Import-Package: javax.activation. javaMail-1.6 does not fix the issue.

Jesse Gallagher
Hmm, well, it's good to know that it can at least work normally in Java 8. I've made an issue for me to track this and investigate when I have a chance: notesRuntime feature has missing package dependency on Java 11+ · Issue #92 · OpenNTF/openliberty-domino

You can also work around not being able to load notesRuntime by instead doing the same thing in your code. The main purpose of the notesRuntime feature is to perform the process-wide NotesInit and NotesTerm calls, and the same could be done if you make a ServletContextListener instance that does this. Much of the code from notesRuntime could apply:

openliberty-domino/RuntimeActivator.java at 8dc3b8231cd2c66071543a0c30471435cf5e2dd9 · OpenNTF/openliberty-domino

What this does is call NotesInit, potentially based on some environment variables, as well as initializing the HTML capabilities. Then, it sits idle in an executor until termination, at which time it calls NotesTerm. You could adapt that code into a ServletContextListener, like the one I've attached (though I haven't tested this specific variant). That code is using the Darwino NAPI. You could either adapt it to Domino JNA or include the Darwino NAPI by adding the OpenNTF Maven repo and then including the dependency.

Java:
package example;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import com.darwino.domino.napi.DominoAPI;
import com.darwino.domino.napi.DominoException;
import com.ibm.commons.util.StringUtil;

@WebListener
public class ExampleContextListener implements ServletContextListener {

    private ExecutorService notesExecutor = Executors.newSingleThreadExecutor();
 
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        if(!"true".equals(System.getProperty("notesruntime.init"))) {
            notesExecutor.submit(() -> {
                try {
                    String notesProgramDir = System.getenv("Notes_ExecDirectory");
                    String notesIniPath = System.getenv("NotesINI");
                    if (StringUtil.isNotEmpty(notesProgramDir)) {
                        String[] initArgs = new String[] {
                                notesProgramDir,
                                StringUtil.isEmpty(notesIniPath) ? "" : ("=" + notesIniPath)
                        };
                     
                        DominoAPI.get().NotesInitExtended(initArgs);
                    } else {
                        DominoAPI.get().NotesInit();
                    }
                    System.setProperty("notesruntime.init", "true");
                 
                    DominoAPI.get().NotesInitThread();
                    DominoAPI.get().HTMLProcessInitialize();
                 
                    try {
                        while(true) {
                            TimeUnit.DAYS.sleep(1);
                        }
                    } catch (InterruptedException e) {
                        // Expected on shutdown
                    } finally {
                        DominoAPI.get().HTMLProcessTerminate();
                        DominoAPI.get().NotesTermThread();
                        DominoAPI.get().NotesTerm();
                    }
                } catch (DominoException e) {
                    throw new RuntimeException(e);
                }
            });
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        notesExecutor.shutdownNow();
        try {
            notesExecutor.awaitTermination(1, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
 
Последнее редактирование:

savl

Lotus Team
28.10.2011
2 625
314
BIT
544
При первичной установке domino open liberty (или изменении состава компонентов) нужен выход в интернет серверу.
Можно ли просто "перетащить" с установленного места на неустановленное?
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
Я по ка не пробовал.
Тут есть нюанс, который может не сработать при простом копировании папки wlp.

Thinking further, there's one last bit that the runtime attempts to auto-download as of version 3.0, and that's the CORBA file for the Notes API bundle. Unfortunately, this one may be the part that breaks it: it pre-caches the final result, but it's not redistributable legally, and it's specific to the build of the Domino server. I'll think about ways to get around this, but in the mean time it'd be safest to use a version previous to 3.0.
 
  • Нравится
Реакции: savl

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
В качестве Domino API необходимо подключить Notes.jar (или domino-jna) через системные библиотеки или мавен (тут на любителя).
вот тут непонятно с (или domino-jna у них разный способ общения с доминой
Запускаем сервер.
это про домину?
При первичной установке domino open liberty (или изменении состава компонентов) нужен выход в интернет серверу.
ну чего бы не сделать локльное зеркало?
Можно ли просто "перетащить" с установленного места на неустановленное?
думаю заглушка и редайрект спасут
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
вот тут непонятно с (или domino-jna у них разный способ общения с доминой
если на domino-сервере установлено domino-jna, то и в проекте, вероятно, можно будет его использовать, вместо Notes.jar.
это скорее догадка, нужно будет проверить.

нет, про сервер open liberty в проекте

ну чего бы не сделать локльное зеркало?
как вариант
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
может я не верно понял начальный вопрос: "это про домину?".
доминошную консоль я показал, чтобы было видно, что коннектор (<feature>localConnector-1.0</feature>) работает. в консоли отображается процесс удаленого обращания к defaultServer.
запускается (по факту происходит соединение с remote) сервер в проекте (домина + open liberty должны быть подняты заранее). проект деплоится реально на defaultServer сервер open liberty, который находится внутри домины.

1639050986268.png
 
  • Нравится
Реакции: VladSh и lmike

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
Проверил - перенос папки WLP работает (с учетом совпадения ОС и битности).
На всякий перенес еще .m2 и натравил на нее nginx + в настройках defaultServer указал для maven локальную репу. Но, возможно, это лишнее.

Если ОС отличается, то нужно качать JVM для этой оси.

зы: возможно это мои какие-то косяки, но на винде Open Liberty (OL) в домине вела себя более капризно - в консоли отображается меньше инфы, но если открыть на чтение лог, то сразу сбрасывается в консоль.

заметил, что в IDEA подлючить remote сервер OL с другого хоста не получается, только localhost - печалька - надо еще покопать.
 
Мы в соцсетях:

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