Multithreading a java agent

放肆的年华 提交于 2019-12-11 21:05:47

问题


A java agent has to upload a file in the background and return the Url of the uploaded file. While uploading, the agent has to report its progress.

I marked the agent to be "Run in background client thread.

I am stuck in the following dilemma:

  • I can run the agent from Lotus Script and pass its parameters in an In-Memory file, but the client actually doesn't run in its own thread. Instead, it blocks the whole client.
  • I can run the agent from a formula, but then I can't pass any parameters!
  • If I use Lotus Script and take care of the threading on my own in Java, my thread doesn't even get started!

I've read that the Notes client doesn't support multithreading. But I can't make the agent RunOnServer because it is accessing a web server available only for the client.

This is related to another question of mine by the way.

Is there any better solution for this?


回答1:


If you can't make the agent RunOnServer then you can use LS2J instead of agent. Create your own class with threading and use its properties.
Here is example with custom Java Class and Java Timer:

import java.util.Timer;
import java.util.TimerTask;

public class Test
{
    private boolean _isOver;
    private int _counter;
    private Timer _timer;
    private String _url; 

    public Test()
    {
        _timer = new Timer("Timer");
    }

    public void Start() //Add parameters here that you want to use in Java
    {
        _counter = 0;
        _isOver = false;
        _url = "";

        TimerTask timerTask = new TimerTask()
        {
            public void run()
            {   
                if (_counter++ == 9)
                {
                    _isOver = true;

                    _timer.cancel();

                    _url = "http://stackoverflow.com/";
                }
            }
        };

        _timer.scheduleAtFixedRate(timerTask, 30, 5000);
    }

    public int getCounter() { return _counter; }
    public boolean getIsOver() { return _isOver; }
    public String getURL() { return _url; }
}

In LotusScript add global LS2J variables:

(Options)
Uselsx "*javacon"
Use "MyJavaLibrary"

(Declarations)
Dim jSession As JavaSession
Dim jClass As JavaClass
Dim jObject As JavaObject

Sub Initialize

    Set jSession = New JavaSession()
    Set jClass = jSession.GetClass("MyClass")
    Set jObject = jClass.CreateObject

End Sub

To start Java object use (in LotusScript of Button):

Call jObject.Start() 'Call with parameters that you want to use in Java

To check state and show progress use (in LotusScript of Timer):

If jObject.getIsOver() Then
    s$ = jObject.getURL()
    'Show results
Else        
    i% = jObject.getCounter()
    'Show progress
End If


来源:https://stackoverflow.com/questions/24739811/multithreading-a-java-agent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!