The power of DOTS Frank van der Linden, e-office Frank van der Linden & e-office @flinden68 http://www.domino-weblog.nl nl.linkedin.com/in/flinden68 fli@e-office.com Roadmap Introduction Setup your environment My first DOTS tasklet Debug the DOTS tasklet Deploy the DOTS 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 9+ OSGi and IBM Notes/Domino – – – – – Since 8.5.2 Extension points Extension Library DOTS (Domino OSGi Tasklet Service) OpenSocial Container 8.5.3 8.5.2 Introduction of 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 of DOTS Introduction of DOTS DOTS Tasklets outperforms over Java Agents! Java Agent: DOTS tasklet: AMGR launches a Thread JVM Initializes Prepare Java and JNI interfaces Load 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 of 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 a local 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 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 Prefences,if Domino Debug Plugin is installed Setup the target platform [Domino Program Files]\osgi-dots\rcp\eclipse [Domino Program Files]\osgi-dots\shared\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.In this case a log statement, which will printed to the console. My First DOTS tasklet Modify the plugin.xml name of the class tasklet id 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 the DOTS Tasklet Debug the 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 the DOTS Tasklet Server needs to know what to debug Debug the DOTS Tasklet Adding breakpoint to debug the code Deploy the DOTS 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 the DOTS Tasklet Create a jar file from the plugin ̶ Right Click Export Deployable plug-ins and fragments... Deploy the DOTS 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 the DOTS 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 the DOTS Tasklet Creating Profile Repository as NSF – Create an empty Notes database, set ACL as required – 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 the DOTS Tasklet Create a Feature project in Eclipse Deploy the DOTS Tasklet Create the update site project in Eclipse Deploy the DOTS Tasklet Build the update site project Deploy the DOTS Tasklet Create an Update Site Database Deploy the DOTS Tasklet Open OSGi profile db – Add update site database into Sites section Restart DOTS task Tips and tricks Tips and tricks 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 Tips and tricks 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"); } 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 @flinden68 http://www.domino-weblog.nl nl.linkedin.com/in/flinden68 fli@e-office.com