/[Apache-SVN]
ViewVC logotype

Revision 1750557


Jump to revision: Previous Next
Author: jleroux
Date: Tue Jun 28 18:50:04 2016 UTC (7 years, 9 months ago)
Changed paths: 14
Log Message:
A patch from Amardeep Singh Jhajj for "Add websocket support in OFBiz" https://issues.apache.org/jira/browse/OFBIZ-7073
It also contains a slightly modified patch from Amardeep Singh Jhajj for "WebSocket Example - Push Notifications" - https://issues.apache.org/jira/browse/OFBIZ-7467 - It's adding working example (in example application) of WebSocket support

I tried to use websockets in OFBiz. I simply added tomcat-embed-websocket.jar in catalina lib and created one webapp for websocket and also added server endpoint class.
It didn't work. After that, I tried the same thing with plain j2ee application with embedded tomcat. It worked there.
I researched on above issue in OFBiz and got the reason. Websockets implementation need jar scanning enabled and it is currently disabled in OFBiz. Below is the code snippet of disabling jar scan from CatalinaContainer.java:

    JarScanner jarScanner = context.getJarScanner();
    if (jarScanner instanceof StandardJarScanner) {
        StandardJarScanner standardJarScanner = (StandardJarScanner) jarScanner;
        standardJarScanner.setScanClassPath(false);
    }

Jar scanning enabling increase OFBiz server startup time upto couples of minutes (in my case, it took approx 8 minutes), so we don't want this much of startup time for OFBiz.
I got the following document where I found the reason why websocket is not working if scanning disabled.

    https://wiki.apache.org/tomcat/HowTo/FasterStartUp

Here tips are given to decrease the startup time. This tips also include disabling of jar scanning. 
We can say disabling jar scanning is right approach because if we enable it then scanner will scan all the jars loaded in OFBiz startup that we don't want.
But, If we want websockets working then we have to enable jar scanning.
For enabling jar scanning, we need below code:

    standardJarScanner.setScanClassPath(true); // Will increase server startup time.

Solution: We can add filter on jar scanning. It will allow only some kind of jars only. For example: jars having websockets endpoints. I am attaching patch for the same here.
I added filter like if jar name string contains "discoverable" word then only it will be considered for jar scan. We can change jar name of our jars using build.xml to make it discoverable for jar scanning.
For example: I have added my websocket endpoint class in "specialpurpose/ecommerce/src" and changed the "name" property in build.xml of ecommerce component from "ofbiz-ecommerce"
to "ofbiz-ecommerce-discoverable". Here is the code snippet from build.xml:

    <property name="name" value="ofbiz-ecommerce-discoverable"/>

This change will create the jar with name "ofbiz-ecommerce-discoverable.jar" in "ecommerce/build/lib/".
Now created jar will be scanned in jar scanner as its name contains "discoverable" word in it.
This change will not increase server start up time more than couple of seconds (in my case, it just two seconds). So scanning time totally depends on the list of jars scanned.
Conclusion: We can use websocket support with the help of jar filters.

The very basic working example of sending push notifications to all connected clients using WebSocket added by Amardeep Singh Jhajj works as follow:
1. Adds support to show push notifications over every screen of an example application using WebSocket when any example created or updated.
2. As it's an example, so for now push notifications will only for example creation and update using SECA's.
3. Push notification will be shown on screen for 5 seconds only, we can close it before 5 seconds using close button if needed.
The UI of notification pop-up can be changed. I kept it simple (No fancy work) to just demonstrate the WebSocket usage.
To see it in action, Please follow the steps given in OFBIZ-7073 and apply patch given here.


jleroux: I committed the 2 patches at the same time because the changes in .classpath and the LICENSE files were in the example patch for OFBIZ-7467. 

I also slightly modified the example patch in order to provide an example where no sync issues are possible by using a Collections.synchronizedSet for the javax.websocket.Session Set. I also used synchronized loops as it's requested for synchronizedSet where it's used. I know it rather symbolic in the example component but it will remember developers about the possible sync issue.

Changed paths

Path Details
Directoryofbiz/trunk/.classpath modified , text changed
Directoryofbiz/trunk/LICENSE modified , text changed
Directoryofbiz/trunk/framework/catalina/lib/tomcat-embed-websocket-8.0.33.jar added
Directoryofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java modified , text changed
Directoryofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/FilterJars.java added
Directoryofbiz/trunk/specialpurpose/example/build.xml modified , text changed
Directoryofbiz/trunk/specialpurpose/example/servicedef/secas.xml modified , text changed
Directoryofbiz/trunk/specialpurpose/example/servicedef/services.xml modified , text changed
Directoryofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleServices.java added
Directoryofbiz/trunk/specialpurpose/example/src/org/ofbiz/example/ExampleWebSockets.java added
Directoryofbiz/trunk/specialpurpose/example/webapp/example/WEB-INF/web.xml modified , text changed
Directoryofbiz/trunk/specialpurpose/example/webapp/example/js/ added
Directoryofbiz/trunk/specialpurpose/example/webapp/example/js/ExamplePushNotifications.js added
Directoryofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml modified , text changed

infrastructure at apache.org
ViewVC Help
Powered by ViewVC 1.1.26