Oracle Documentation also provides a similar guide on this process (link). The difference is that this post is more specific and in-depth, trying to provide a more thorough guide from start to finish.
Versions of Oracle technology this post utilizes:
Weblogic: 10.3
JDeveloper: 11.1.1.6.0
BPM 11g
So we have a server (soa_server) and deployed to it are SOA + BPM processes + BPM ADF UI's (Human task pages) + an ADF application that manages the BPM solution. We shall be migrating all ADF components + BPM Task pages to a newly created managed server under the same server node, thus restoring the connection between the BPM process and its Task page over different server ports.
I will be referring to the SOA server that currently has all deployments as soa_server, and the newly created ADF/UI server as ui_server.
Pre-requisites
1. Un-deploy all UI (ADF + BPM task pages) from soa_server.
BPM Task page application - wf_client_config.xml
We need to include the above XML file into your BPM Task page application code so that when deployed to the ui_server, it will register to its corresponding BPM Process that resides on the soa_server. The property that refers to weblogic.jndi.WLInitialContextFactory will be created shortly.
Note: Each BPM Task page will require the insertion of this wf_client_config.xml file
1. We need to create a new XML file (if it does not already exist) called wf_client_config.xml under the directory: bpm_ui_code/public_html/WEB-INF/classes
2. Use the following template as the body of the code:
wf_client_config.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <workflowServicesClientConfiguration xmlns="http://xmlns.oracle.com/bpel/services/client" clientType="REMOTE"> <server default="true" name="default"> <localClient> <participateInClientTransaction>false</participateInClientTransaction> </localClient> <remoteClient> <serverURL>t3://server_hostname_address:8001</serverURL> <initialContextFactory>weblogic.jndi.WLInitialContextFactory</initialContextFactory> <participateInClientTransaction>false</participateInClientTransaction> </remoteClient> <soapClient> <rootEndPointURL>http://server_hostname_address:8001</rootEndPointURL> <identityPropagation mode="dynamic" type="saml"> <policy-references> <policy-reference enabled="true" category="security" uri="oracle/wss10_saml_token_client_policy"/> </policy-references> </identityPropagation> </soapClient> </server> </workflowServicesClientConfiguration>
3. Do not forget to update the server_hostname_address for serverURL and rootEndPointURL. An example could be:
<serverURL>t3://tom.company-name.co.uk:8001</serverURL>
<rootEndPointURL>http://tom.company-name.co.uk:8001</rootEndPointURL>
4. Once complete, save the file. The rest of the configurations will take place inside the Server Console and EM.
Create new UI server
1. Log into your Server Console
2. Click servers and click New
3. Enter the following details:
Server Name: ui_server
Server Port: 8020 (You can choose any new port number, as long as it is not already used)
Should this server belong to a cluster? No, this is a stand-alone server
4. Click Finish
5. Click on the newly created server: ui_server
6. Click on the drop down for Machine and select your domain address from the list
7. In Listen Address, type your domain address
8. Click Save, then Activate Changes
9. Click on Servers, click Lock & Edit, click the Control tab, select ui_server and then click Start, and click Yes on the next screen.
Apply the Java Runtime Files (JRF) Template
When the JRF Template is applied to a Managed Server, the ADR libraries are added to the server in order to run ADF based application successfully:
1. Log into your Server EM
2. Expand the Weblogic Domain
3. Expand your_domain and click on ui_server
4. On the main panel, there is a button at the top 'Apply JRF Template'. Click on the button
5. Return to the Server Console and restart ui_server.
Configure Data Sources for ui_server
You need to point any Data Sources (Databases, MDS repositories etc) that are used in the application to the new ui_server:
1. Log into your Server Console
2. Click on Data Sources, click on your_data_source, click the Targets tab and tick the ui_server target. (Save and Activate changes)
3. Repeat the above step for all Data Sources that are used in your application.
Configure required Libraries for ui_server
Similar to configuring the Data Sources, we want to do the same for any libraries that are used by the ADF or BPM Task pages:
1. Log into your Server Console
2. Click on Deployments
3. You need to find out what specific libraries are used by your application. You can find some of the libraries by analysing the source code of weblogic-application.xml, which is found under every project (Application Resources -> Descriptors -> META-INF). The application I worked on used the following libraries:
- adf.oracle.domain
- adf.oracle.domain.webapp
- oracle.soa.workflow.wc
- oracle.soa.workflow
- oracle.soa.worklist.webapp
- oracle.soa.bpel
- oracle.bpm.runtime
- oracle.jsp.next
- jsf
- jstl
3. For each of the identified libraries, click on each one from the deployments list, then click the Targets tab and tick the ui_server target. (Activate changes after each one).
Create a new Foreign JNDI Provider
This new Foreign JNDI Provider is what the code in wf_client_config.xml will refer to, to allow the BPM Task page to communicate with its BPM Process on the soa_server
1. Log into your Server Console
2. Click on Services, click Foreign JNDI Providers and click New:
a. Set Name as: ForeignJNDIProvider-SOA
b. Click Next
c. Select the following as Targets - soa_server; ui_server
d. Click Finish
e. Click on the newly created Foreign JNDI Provider - ForeignJNDIProvider-SOA
f. Enter the following details:
i) Initial Context Factory: weblogic.jndi.WLInitialContextFactory
ii) Provider URL: t3://soa_hostname:soa_portnumber/soa-infra
iii) User: Weblogic username (weblogic)
iv) Password: Weblogic password (welcome1)
vi) Save and Activate changes.
3. Click the Links tab for the above ForeignJNDIProvider-SOA
4. For each of the 14 JNDI Links below, click New and create a Link with the specified information:
Name: ejb/bpel/services/workflow/TaskMetadataServiceBean
Local JNDI Name: ejb/bpel/services/workflow/TaskMetadataServiceBean_local
Remote JNDI Name: ejb/bpel/services/workflow/TaskMetadataServiceBean
Name: ejb/bpel/services/workflow/TaskServiceBean
Local JNDI Name: ejb/bpel/services/workflow/TaskServiceBean_local
Remote JNDI Name: ejb/bpel/services/workflow/TaskServiceBean
Name: ejb/bpel/services/workflow/TaskServiceGlobal/TransactionBean
Local JNDI Name: ejb/bpel/services/workflow/TaskServiceGlobal/TransactionBean_local
Remote JNDI Name: ejb/bpel/services/workflow/TaskServiceGlobal/TransactionBean
Name: ejb/bpm/services/BPMUserAuthenticationServiceBean
Local JNDI Name: ejb/bpm/services/BPMUserAuthenticationServiceBean_local
Remote JNDI Name: ejb/bpm/services/BPMUserAuthenticationServiceBean
Name: ejb/bpm/services/InstanceManagementServiceBean
Local JNDI Name: ejb/bpm/services/InstanceManagementServiceBean_local
Remote JNDI Name: ejb/bpm/services/InstanceManagementServiceBean
Name: ejb/bpm/services/InstanceQueryServiceBean
Local JNDI Name: ejb/bpm/services/InstanceQueryServiceBean_local
Remote JNDI Name: ejb/bpm/services/InstanceQueryServiceBean
Name: ejb/bpm/services/ProcessDashboardServiceBean
Local JNDI Name: ejb/bpm/services/ProcessDashboardServiceBean_local
Remote JNDI Name: ejb/bpm/services/ProcessDashboardServiceBean
Name: ejb/bpm/services/ProcessMetadataServiceBean
Local JNDI Name: ejb/bpm/services/ProcessMetadataServiceBean_local
Remote JNDI Name: ejb/bpm/services/ProcessMetadataServiceBean
Name: ejb/bpm/services/ProcessModelServiceBean
Local JNDI Name: ejb/bpm/services/ProcessModelServiceBean_local
Remote JNDI Name: ejb/bpm/services/ProcessModelServiceBean
Name: RuntimeConfigService
Local JNDI Name: RuntimeConfigService_local
Remote JNDI Name: RuntimeConfigService
Name: TaskEvidenceServiceBean
Local JNDI Name: TaskEvidenceServiceBean_local
Remote JNDI Name: TaskEvidenceServiceBean
Name: TaskQueryService
Local JNDI Name: TaskQueryService_local
Remote JNDI Name: TaskQueryService
Name: TaskReportServiceBean
Local JNDI Name: TaskReportServiceBean_local
Remote JNDI Name: TaskReportServiceBean
Name: UserMetadataService
Local JNDI Name: UserMetadataService_local
Remote JNDI Name: UserMetadataService
5. Save and Activate Changes
6. Click on the Targets tab for the newly created ForeignJNDIProvider-SOA
7. Ensure that soa_server and ui_server are ticked
8. Save and Activate changes
9. Restart both soa_server and ui_server (Shutdown then Start up).
Deployment of BPM Task pages + ADF
1a. If you are deploying your ADF/BPM Taskpage using JDeveloper, ensure you select the ui_server when selecting what managed server to deploy to
1b. If you are deploying using scripts (WLST), ensure you make the modifications required such as the name of the managed server or the port number to deploy to
2. Following the above deployment, your BPM Task should now be successfully registered with their corresponding BPM Processes that reside on the soa_server. Clicking on a task link should open the task page whose processing will take place on the ui_server.
Note
This process can also be followed during the architecture set up before any development takes place so that right from the beginning, all ADF deployments are on a separate server to any other non-ADF components.
When deploying to different environments further down the line (From a Development to Test environment), be sure to update any end points you have defined that initially point to a specific server. E.g. The server end points located in wf_client_config.xml (ServerURL and RootEndPointURL properties).
Any questions, feel free to ask.
Hi Onkar,
ReplyDeleteNice post.
Few corrections in the post.
Step, Foreign JNDI configuration right provider information would be
Provider URL: t3://soa_hostname:soa_portnumber/soa-infra
I struggled a bit following exact as is info on this blog. Then referred: http://docs.oracle.com/cd/E23943_01/dev.1111/e10224/bp_designtf.htm#CACDDJDA
to find the difference.
Finally, I was able to make it work.
Thanks for this great detail post. Typo things are fine but sometime are killer ;)
Thanks,
Bhargav.
One more correction is the file name is wf_client_config.xml & not wl_client_config.xml
DeleteThank you Bhargav for your observations, I will update the post. :)
DeleteRegards
Onkar
Hi Onkar,
ReplyDeleteThanks for interesting post.
I tried to test your instruction, but when I reach the step "Clicking on a task link should open the task page whose processing will take place on the ui_server."(Deployment of BPM Task pages + ADF, step 2.), I go to the standard Oracle BPM workspace app click on the task link and I get an error: Could not connect to the server host_name:8020. The UI server is running.
Could you tell me the reason? Maybe you have a working sample and you can share it with me?
Thanks.
Best regards, Stanislav
hi Onkar,
ReplyDeleteIsaw your blog it was good and helpful too me.dba bpm
thanks
Good to hear Veena.
DeleteHI Onkar,nice post..I was doing the same thing...got the knowledge to create your own server
ReplyDeleteHope it was a successful process for you!
DeleteNice post Onkar,
ReplyDeleteDid you use the BPM Workspace when you implemented such project? We are splitting ADF from SOA now but we are facing problems to have the Workspace running in the SOA Server while we have the ADF Task application running on the non-SOA server.
Thanks!
Bruno
Hi Bruno,
DeleteWe utilised both the default BPM Workspace as well as a custom implementation of the BPM Workspace using the BPM Jars 'taskList-task-flow-definition' pageflow. The custom implementation was inserted into an ADF application, which was running on the ADF server whereas the Default BPM Workspace was running on the SOA server.
We definitely had a few issues and it was an iterative process getting it working. It goes to show how important infrastructure architecture designs are.
Let me know how it goes.
Regards
Onkar
Is it possible to install bpm worklistapp itself in a seperate server ?
ReplyDeleteYes it is.
DeleteYou can have 2 separate domains.
1 SOA domain which includes an Admin Server and an SOA server with BPM extensions to host your SOA/BPM services.
1 ADF domain with an Admin Server and an ADF server to host your Custom ADF BPM Application and BPM Human Task Form Applications.
There are configurations required such as:
- Enabling Cross Domain Security
- Ensuring that required libraries are installed on both servers
- A JNDIProvider set up on ADF domain
- Granting access to bpm-services.jar on the ADF domain.
The above are the main activities required.
Andrejus Baranovkis also has a blog post that goes further into the above points.
Hope this helps.
Regards
Onkar
Gr8 post, but I could not figure out for cluster environment, how the single configuration file i.e. wf_client_config.xml will keep different host/domain name of different managed server in clustered environment i.e. different machine. I seen this file even not stores under domain, otherwise we might have been used to point to different machine, under "servers" folder.
ReplyDeleteIf you could through some lights on this approach, it would be great, if I found something related to this scenario I will also update to all.
Thank you.
Regards,
Pranab
Hi Pranab,
DeleteIn this scenario you need to set the HTTP front end host for the SOA cluster and then use this name within the wf_client_config.xml.
To do this:
1. Log into Weblogic Console
2. Click Clusters
3. Click the SOA Cluster
4. Click on the HTTP tab
5. Set Frontend Host to: soa.company.com
6. Set Frontend HTTP Port to: 0
7. Set Frontend HTTPS Port to: 0
8. Restart the SOA servers
9. In the wf_client_config.xml, instead of referencing a specific soa server, use the Frontend Host name - soa.company.com
e.g. t3://soa.company.com:8001
Hope this helps
Onkar
Thanks for sharing such an useful information. It is very informative.
ReplyDeleteS&M consultants
Thank you for this useful information. I use it in my Oracle BPM Suite Development Training .
ReplyDeleteHello Onkar,
ReplyDeleteThanks for the helpful information, it was our starting point for spliting our SOA and ADF components.
But we are having issue in one point. We created a isolated ADF Cluster only containing some SOA libraries that are probably needed to run the Enterprise Manager and other things. We cannot deploy SOA COMPOSITES into it for example. So, it is a completely isolated domain from SOA.
What we are facing is, whenever we access any application from the load balancing URL (we are using Oracle HTTP Server) we are experiencing a JAVASCRIPT issue whenever user do any request in any deployed ADF Application, the application starts begings behaviour losing the state of the objects.
Alternatively a JS (looks like error from framework) error pings in Google Chrome console:
Uncaught ReferenceError: AdfDhtmlActiveData is not defined
Do you remember of facing something like that in the past? If you were me how could you start investigating into this? I could really assure you that we tried pretty much almost everything, it even includes using another load balancing server, this JS error persists.
Hope if you can reach this message and give your point of view of our issue.
Thank you alot,
Best Regards,
Renan.
Hi Renan, based on the issue you describe, it sounds like a more generic issue rather than something specific to Middleware. Although it does sound like a library issue. Unfortunately, I am not able to help without getting more involved. Hope you managed to fix it!
Delete
ReplyDeleteThanks for the nice blog here.I was searching this one for a long time.This blog is very helpful for my studies..I got another one site also,which is same as yours Oracle BPM.Check this one also Oracle Fusion HCM Sure it will be helpful for you too..Once more iam thanking you for your creative blog.