let me introduce you: dots
DESCRIPTION
Entwicklercamp 2013TRANSCRIPT
Let me introduce you: DOTS
Frank van der Linden
Frank van der Linden & e-office
nl.linkedin.com/in/flinden68
http://www.domino-weblog.nl
@flinden68
Roadmap
• Introduction• What is DOTS• Setup your environment • My first DOTS tasklet• Debug my first DOTS tasklet • Deploy your tasklet• Tips and tricks
Introduction
Introduction of OSGi
• Open Services Gateway initiative– Started in 1999– Still improved– module system and service platform
• OSGi bundles– Can be installed remotely.– No reboot required– Lifecycle
Introduction of OSGi
• OSGi and IBM Notes/Domino– Since 8.5.2– Extension points– Extension Library– DOTS (Domino OSGi Tasklet Service)– OpenSocial Container
8.5.2
8.5.3
9+
Introduction to DOTS
• Domino OSGi Tasklet Service– Easy development– Outside in Eclipse IDE– Tasklets can run: scheduled, manual
• Next generation agents for Domino• OpenNTF project by IBM since April, 2011
(replaced JAVADDIN project)
• Included in IBM Domino 9 Social Edition
Introduction to DOTS
Introduction to DOTS
• DOTS Tasklets outperforms over Java Agents!
Java Agent:
DOTS tasklet:
AMGR launches a
ThreadJVM Initializes
Prepare Java and JNI
interfacesLoad Agent Bytecode Run!
Run!Everything is ready to run
> tell amgr run "test\XPagescrash.nsf" 'LongJobAgent'
09.11.2012 19:38:39 JVM: Java Virtual Machine initialized.
09.11.2012 19:38:39 AMgr: Start executing agent 'LongJobAgent' in 'test\XPagescrash.nsf'
09.11.2012 19:38:39 Agent Manager: Agent printing: 181349
09.11.2012 19:41:02 Agent Manager: Agent printing: 2227
09.11.2012 19:41:02 Agent Manager: Agent printing: Finished in 143 secs... -
09.11.2012 19:41:02 AMgr: Agent 'LongJobAgent' in 'test\XPagescrash.nsf' completed execution
> load dots
> Listening for transport dt_socket at address: 8001
09.11.2012 19:42:40 Domino OSGi Tasklet Container started ( profile DOTS )
> 181349
> 2227
09.11.2012 19:43:22 [DOTS] (annotated) Finished in 41 secs...
Introduction to DOTS
• DOTS versus Agents– AMGR is old and complicated– Range
• Agents are database depended• DOTS run server wide
– DOTS are more flexible• Precise timing
Setup your environment
Setup your environment
• DOTS should be installed into IBM Domino server– For IBM Domino 9 Social Edition Public Beta, you
don’t need to do anything.– For versions 8.5.2 and 8.5.3,
• Download DOTS package from OpenNTF• You will also need some Eclipse plugins from Eclipse
3.6.2+
Setup your environment
• Create some folders inside your Domino folder– [Domino Program Files]\osgi-dots\rcp\eclipse\plugins– [Domino Program Files]\osgi-dots\shared\eclipse\plugins
• Copy files from Eclipse install directory
These plugins will be copied
from Eclipse installation
[Eclipse]\plugins
Setup your environment
• The DOTS package contains the executables– The jar files in the newly created directories– The executables in the Domino program directory
Copy to
[Domino]\osgi-dots\shared\eclipse\plugins
Copy to
[Domino]\osgi-dots
Setup your environment
• The DOTS package contains the executables– The jar files in the newly created directories– The executables in the Domino program directory
Copy to
[Domino]\osgi-dots\shared\eclipse\plugins
Copy to
[Domino]\osgi-dots
Setup your environment
• Download Eclipse– http://www.eclipse.org/downloads– Eclipse >3.6.2(Eclipse IDE for Java EE Developers)
• Download projects from OpenNTF– Domino Debug Plug-in from XPages SDK for Eclipse RCP: http://
tiny.cc/XPagesSDK
Setup the Domino Debug Plugin
• Accept all next steps
• Restart Eclipse
Setup the Domino Debug Plugin
• Check Preferences,if Domino Debug Plugin is installed
Setup the target platform
[Domino Program Files]\osgi-dots\rcp\eclipse
[Domino Program Files]\osgi-dots\rcp\eclipse
Setup the Notes Java Api reference
My first DOTS tasklet
My First DOTS tasklet
• Create a new Plug-in Project– File New Plug-in Project
My First DOTS tasklet
• Prepare the DOTS extensions
My First DOTS tasklet
• Import DOTS extensions– Deselect «Show only extension points from the required
plug-ins»– Find & pick «com.ibm.dots.task» extension from the list– Correct the warning in the Manifest.mf tab, then Save &
Close Manifest view.
My First DOTS tasklet
• Import Domino package
My First DOTS tasklet
• Create the Java class
My First DOTS tasklet
• Add some code
My First DOTS tasklet
• Modify the plugin.xml
tasklet id
name of the class
My First DOTS tasklet
• Now we can run our tasklet• DOTS will run on the Domino server• There are two ways to run from Eclipse IDE
– Run– Run and debug
My First DOTS tasklet
• Create a “run configuration”
My First DOTS tasklet
• PDE Configuration file should be created, the first time
• PDE file is created in the dots workspace
My First DOTS tasklet
• Now, lets run the tasklet
Debug a DOTS tasklet
• Stop DOTS task– Tell dots quit
• Adding debug parameters to notes.ini– DOTS_DEBUGADDRESS=8001– DOTS_DEBUGSUSPEND=y
• Reload DOTS task– Load dots– Dots task will start only when debugger connects
Debug my first DOTS tasklet
• Server needs to know what to debug
Debug my first DOTS tasklet
• Adding breakpoint to debug the code
Debug my first DOTS tasklet
• Some tips– Schedule tasks
– OSGi allows you to refresh bundles without restart, here is how:• Find out the «bundle-id» for the plug-in• Refresh the bundle
Debug my first DOTS tasklet
• More tips...Annotations– Annotations is supported in DOTS.– Powerfull way of specify for each method, what to do
@RunOnStart
public void runOnStart( IProgressMonitor monitor ){
logMessage("Annotated onStart method");
}
@Run( id="manual")
public void runManual( String[] args, IProgressMonitor monitor ){
logMessage("Annotated run method with id=manual");
}
@RunOnStart
@RunEvery( every=60, unit=RunUnit.second )
@HungPossibleAfter( timeInMinutes=1 )
public void runEvery60seconds( IProgressMonitor monitor ){
logMessage( "Called from annotated method every 60 seconds");
}
Deploy your tasklet
Deploy your tasklet
• DOTS plugins can be deployed as OSGi bundle– As jar file in OSGi plugins folder– As update site
• Disable debug parameters– Delete PDE runtime configuration (pde.launch.ini)– Disable suspend feature in debugging (DOTS_DEBUGSUSPEND)
Deploy your tasklet
• Create a jar file from the plugin• Right Click Export Deployable plug-ins and fragments...
Deploy your tasklet
• Select the plugin and destination• Place exported JAR file into plugins folder, then
restart DOTS task[Domino Program Files]\osgi-dots\shared\eclipse\plugins
Deploy your Tasklet
• Another deploy method, DOTS profiles– It can stored inside a Notes database– Can run in is own profile container– With his own security settings– Can started seperatly “tell profilename run abc”
Deploy your Tasklet
• Creating Profile Repository as NSF– Create an empty nsf, set ACL– Configure DOTS to use profiles database
• tell dots quit• set config OSGI_CONFIGURATION_DB=dotsprofiles.nsf• load dots• tell dots profileCreate dots
– DOTS profile is created
– You can import an updatesite in the profile
Deploy your Tasklet
• Create a Feature project in Eclipse
Deploy your Tasklet
• Create the update site project in Eclipse
Deploy your Tasklet
• Build the update site project
Deploy your Tasklet
• Create an Update Site Database
Deploy your Tasklet
• Open OSGi profile db– Add update site database into Sites section
• Restart DOTS task
Tips and tricks
Multiple profiles
• You may create more than one profiles.– For testing– Tasklets that you use occasionally– Tasklets with different security needs– Heavily loaded Tasklets
Life-cycle for a scheduled Tasklet
• When a tasklet runs on schedule, DOTS class loader will create an instance from your tasklet class. This instance will not be disposed until DOTS process stops.
Multiple purpose Tasklet
• Same Tasklet, different Java instances• In multiple scheduled runs
– persistent objects, stays in memory
• In multiple manual runs– unloaded from memory afterwards
Tips and tricks
• Logging– Try not to use System.out.println. (No output to log.nsf)
– Instead, use logMessage(...) and logException(...)
• Progress Monitoring– IProgressMonitor monitor
argument passed on tasklet methods.
– Very useful for tasklets running long time.
Vector<?> views = db.getViews();
monitor.beginTask( "List the views", views.size() );
Init with # of steps
for ( Object view : views ){
if ( monitor.isCanceled() ){
break;
Break if canceled.
}
logMessage("\t" +
((View)view).getName() );
try {
Thread.sleep( 1000 );
} catch (InterruptedException e) {
e.printStackTrace();
}
monitor.worked( 1 );
One step completed
}
Questions
Contact details
nl.linkedin.com/in/flinden68
http://www.domino-weblog.nl
@flinden68