|
Are
You Getting the Most Out of Your Oracle E-Business Suite Deployment?
By Sancho Pinto and Stephen Schleifer
[Mar-09]
The right imaging system can help drive
efficiencies in lines of business throughout the enterprise
– including IT.
Today’s ERP applications have enabled
organizations to automate many business processes, taking
common daily operations out the physical world and bringing
them online to achieve greater efficiency. However, paper
content still drives many high transaction processes –
from procure-to-pay, to expense management, to employee benefits
– presenting a tangible obstacle to optimizing process
efficiency. In effect, workers still need to manage a single
process by toggling between the online and offline worlds,
which not only results in higher productivity costs related
to slower transaction processing and increasing the likelihood
of human error, but also it also significantly increases costs
related to paper storage and transportation.
By deploying an imaging solution, organizations
can leave the physical world of paper behind, to achieve a
higher degree of business process automation that brings measurable
productivity gains and cost savings. Oracle Imaging and Process
Management (Oracle I/PM), a part of Oracle’s content
management suite of products, digitizes paper content and
inserts it into application workflows to optimize business
operations. It offers an out-of-the-box integration with Oracle
E-Business Suite, in a solution that offers business users
access to images and workflows directly from their E-Business
Suite UIs while minimizing its integration footprint. . The
end result augments the existing business process without
significantly altering it, so that departments can streamline
their operations with minimum user disruption.
It’s a simple concept with clear value
for business users, applicable to many different areas of
an organization. In fact, the ROI to image-enabling applications
is so quickly evident, that its use within a company is viral:
one department head speaks to another about how it’s
helped to achieve process optimization in their area, and
soon that manager will knock on IT’s door asking when
imaging can be integrated with their application. Oracle I/PM
is well-suited to this type of shared-services deployment
model, as it’s designed to be used as an imaging platform,
allowing an IT organization to maintain a central imaging
and workflow system that can be leveraged organization-wide
to support any application without requiring additional infrastructure
or administration.

Oracle I/PM’s Unique Approach
to Application Integration
From an infrastructure perspective, when
it comes to image-enabling business applications, the more
customization and coding that exist between an imaging system
and a business application, the more complex things become.
For example, small changes such as modifying a system-to-system
workflow can require additional consulting services. Or, performing
a system upgrade to the application environment can end up
being a major undertaking, as the imaging system will also
need to conform to the updated ERP. In short, when there is
too much inter-dependence between the two systems, an IT department
can find that it no longer has complete control over its application
infrastructure, nor the flexibility that it needs.
Oracle I/PM takes a different approach.The
E-Business Suite Adapter for I/PM acts as a plumbing layer
between the two systems to make this integration possible.
The E-Business Suite Adapter for I/PM is built on a standardized
Application Extension Framework (AXF), which manages a list
of configured integrations and their association with solution
templates that are provided for automating processes such
as procure-to-pay or expense management. The AXF manages a
list of configured integrations and their association with
solution templates that are provided for automating processes
such as procure-to-pay or expense management. These best practice
templates comprise of Oracle BPEL Process Manager-based workflows
with associated approval rules, data entry forms and reports.
This effectively eliminates all hard-coded integration mechanisms
and provides flexible configuration options to define which
additional commands are made available to E-Business Suite
users. Once the integration is installed image enabling an
additional E-Business Suite module is done through an AXF
configuration change without any additional E-Business Suite
customizations.

The Oracle I/PM integration approach allows
the imaging system to be maintained separately from the E-Business
Suite environment, while providing end users access to imaged
documents and workflow tasks from within the context of E-Business
Suite.
Fusion Matters: Oracle I/PM and
the Future of Oracle Applications
For Oracle customers who are looking to
simplify their IT infrastructures and image-enable multiple
business applications on one infrastructure, there is a lot
to look forward to with Oracle I/PM. Not only will the AXF
be built out to support other Oracle Application families
such as PeopleSoft and JDEdwards over the coming months, but
Oracle I/PM provides additional web service APIs and tools
to easily integrate imaging and workflow with other applications
in your environment. For those who are looking towards a future
with Fusion Applications, the story gets even better. Oracle
I/PM will also provide the default image repository for Fusion
Applications, so it will be able to be leveraged wherever
imaging services are needed throughout the enterprise.
Next Steps
· Take a look at the Oracle I/PM
for E-Business Suite solution
sheet and viewlet for an integration overview
· Review the Demonstration
Viewlet for a detailed step-by-step run through of Oracle
I/PM’s integration with Oracle E-Business Suite Payables
· Download Oracle
I/PM 10gR3
Business Event
Subscriptions with Custom Payloads
By Michael Baguley [Mar-08]
Many Oracle E-Business Suite products leverage
the Oracle Workflow Business Event System for business process
integration. Whilst this is not the only method available
for integrating E-Business Suite into a business process,
it does allow an ESB or BPEL process to be event driven using
standard E-Business Suite functionality.
Subscriptions to Business Events have a
payload type of WF_EVENT_T. The Oracle E-Business Suite Adapter
can be used to integrate with Oracle E-Business Suite to use
this payload. However the WF_EVENT_T payload may not meet
your particular use case. One way that this situation could
be addressed is by combining the Business Events System with
Oracle Advanced Queuing (AQ). The Oracle AQ Adapter could
then be used to start a BPEL or ESB process following triggering
of a Business Event.
In summary this approach requires:
· Creation of an Advanced Queue in
the E-Business Suite.
· Creation of an Agent in the Business
Events System for the Advanced Queue.
· A Subscription to the required
Event to build the XML message.
· A Subscription to the same Event
to post the message to the Agent.
· An XML Schema that matches the
payload of the Advanced Queue message.
· A BPEL process that commences with
an AQ Partnerlink that dequeues messages from the Advanced
Queue or if Enterprise Service Bus is to be used, an AQ Adapter
service that dequeues messages from the Advanced Queue.
The use of multiple Business Event subscriptions
follows the same approach that would be used if subscriptions
were initiating processes internal to the E-Business Suite,
for example starting a Workflow.
Business Events System Configuration
1. Create an AQ in the APPS Schema for use
with the Business Events System. The APPS_OUT_Q example presented
here uses a RAW payload.
2. A custom Queue Handler is needed to support
the Business Events Agent. Create a package in the APPS Schema
with procedures to be used by the Business Events System to
enqueue and dequeue messages on the AQ. The standard WF_EVENT_QH
package can be used as the basis for this development. The
Package name is used later as the Queue Handler value when
configuring the Agent in the Business Events System. As the
AQ will only be used for outbound messages the dequeue procedure
can be a stub without any processing logic.
/*--------------------------------------------------
| Queue Handler Enqueue Procedure
--------------------------------------------------*/
PROCEDURE enqueue (p_event IN WF_EVENT_T
, p_out_agent_override IN WF_AGENT_T)
IS
/*--------------------------------
| AQ Variables
--------------------------------*/
l_msgid RAW(16);
l_enq_opt dbms_aq.enqueue_options_t;
l_msg_prop dbms_aq.message_properties_t;
l_xml_clob CLOB;
l_amt NUMBER;
l_data VARCHAR2(32000);
BEGIN
/*----------------------------------------
| Event XML to CLOB for AQ
----------------------------------------*/
dbms_lob.createtemporary( lob_loc => l_xml_clob
, cache => FALSE
, dur => dbms_lob.call);
l_amt := length(p_event.getEventData()); -- set amount to process
/*--------------------------------
| Enqueue RAW message
--------------------------------*/
DBMS_LOB.READ (
lob_loc => p_event.getEventData(),
amount => l_amt,
offset => 1,
buffer => l_data);
IF l_data != 'VOID' THEN
DBMS_AQ.ENQUEUE
( queue_name => 'APPS_OUT_Q'
, enqueue_options => l_enq_opt
, message_properties => l_msg_prop
, payload => utl_raw.cast_to_raw(l_data)
, msgid => l_msgid);
END IF;
END ENQUEUE;
PROCEDURE dequeue (p_agent_guid IN RAW,
p_event OUT WF_EVENT_T)
IS
BEGIN
NULL;
END;
3. The next step is to set up an Agent in
the Business Events System:
4. A PL/SQL function is required for use
with the first subscription. This will build the XML message.
Parameters are extracted from the Event payload (WF_EVENT_T)
and used in the subscription. You can use the Agent Activity
in Oracle Applications Manager to view processed subscriptions
in the WF_DEFERRED queue to see parameter lists used by an
event.
The function takes the standard format for
subscriptions, for example:
FUNCTION person_record
( p_subscription_guid IN RAW
, p_event IN OUT WF_EVENT_T) RETURN VARCHAR2 The function needs to:
· Retrieve the Event parameters,
for example:
l_user_id:= to_number(p_event.GetValueForParameter (pName => 'USER_ID')); · Initialise the
E-Business Suite environment using FND_GLOBAL.APPS_INITIALIZE
with the user credentials retrieved from the Event parameters.
· Create the XML message. The PL/SQL
Package DBMS_XMLQUERY can be used to build the XML payload
into a CLOB.
· Set the value of the p_event.event_data
CLOB with the value of the CLOB returned by using DBMS_XMLQUERY:
p_event.setEventData(l_xml_query_result); · The first subscription
builds the XML message. The PL/SQL Rule Function value is
the function defined in step 4.
· The second subscription sends the
message to the Agent (i.e. Advanced Queue).
Note the subscription phase number must be greater than the
first message subscription.
BPEL Process Consuming The Business Event
The following example shows the start of
a BPEL process that dequeues a message from the subscription
to the E-Business Suite example outlined above using the AQ
Adapter.
1. An XML Schema matching the payload being
transferred in the message from Oracle E-Business Suite is
required.
2. Create an Empty BPEL Process.
3. Add an AQ Adapter Partnerlink to the
BPEL process to dequeue messages placed in the AQ defined
as the Business Events System Agent.
Select the XML Schema defined for the process
as the Message Schema.

4. Add a Receive activity into the BPEL
process.
5. The remainder of the BPEL process can
now be added, deployed and tested.
Using
R12 TCA Business Object APIs with BPEL Process Manager
By Michael Baguely [Mar-08]
Release 12 introduces Trading Community
Architecture (TCA) Business Object APIs. These are an abstract
grouping of TCA entities to form an operable, logical business
unit.
Put more simply, with one invocation of
the Oracle E-Business Suite Adapter from your BPEL process,
you can process multiple entities in the TCA instead of having
to call granular APIs in turn. In addition to simplifying
the creation of complex entities, the APIs also provide Update,
Save (either create or update depending if the passed identification
information matches an existing business object.) and Get
(to extract and return business object data) capability.
So how might this work in practice?
The following example process uses the API
HZ_PERSON_BO_PUB.get_person_bo to test whether the person
already exists in the TCA and if the person doesn’t
exist, a Person Party, Location, Party Site and Party Site
Use is created using the HZ_PERSON_BO_PUB.create_person_bo
API. The E-Business Suite Adapter has been used to call these
APIs.
Start by defining an XML Schema that caters
for the input data and any output parameters returned by the
API (such as party_id).
<?xml version="1.0" encoding="windows-1252" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.mb.com/xsd"
targetNamespace="http://www.mb.com/xsd"
elementFormDefault="qualified">
<xsd:element name="Person">
<xsd:annotation>
<xsd:documentation>
A sample element:
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="FirstName" type="xsd:string"/>
<xsd:element name="LastName" type="xsd:string"/>
<xsd:element name="Country" type="xsd:string"/>
<xsd:element name="Address1" type="xsd:string"/>
<xsd:element name="City" type="xsd:string"/>
<xsd:element name="Zip" type="xsd:string"/>
<xsd:element name="PartyId" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
The following diagram shows the high level
process. A check to determine whether the person already exists
in the TCA is carried out in the PersonExistenceCheck Scope.
The subsequent Switch activity caters for the cases of whether
or not the person has been found in the TCA.

Each Oracle E-Business Suite Partnerlink
uses the appropriate TCA Business Object API. Although officially
documented in the TCA
Technical Implementation Guide, the TCA BO PL/SQL packages
may need to be located by navigating to the Other Interfaces
– Custom Objects - PLSQL APIs in the Oracle Applications
Module Browser.
A Transform activity is added prior to each
Invoke activity to transfer data from process input variable
to the input variable defined for the Invoke activity.
This also allows the payload to be transformed
and default or mandatory values required by the API to be
added. An example of a default value requirement is CREATED_BY_MODULE.
Default values are added by right clicking an element and
selecting Set Text… in the XSLT mapper.
A further benefit of using these APIs is
that any error messages raised by the APIs are returned to
the BPEL process in the x_messages element of the output variable.
The following diagram shows the complete
process.
In conclusion, the increased functionality
provided by these APIs makes them highly suited to use in
BPEL processes. Processes will be quicker to develop, and
be less complex and clearer as a result. You can find further
information about the available APIs and their use in the
TCA
Technical Implementation Guide.
BI Publisher
Standards
By Kevin Bouwmeester [Mar-08]
Fusion is coming. And in this setting BI
Publisher (BIP) will be the main reporting tool. You will
be amazed if you try and imagine the number of templates that
will be worked on, in the coming years. On one hand, it is
bliss that the creation of templates is so flexible, because
it allows you to meet the requirements for your documents.
But when every developer has their own way, this freedom can
also become a serious problem for maintainability, readability
and cooperation.
Eventually, all templates might need extension
or customization. In the near future BI Publisher developers
from EMEA (or even worldwide) will be adjusting templates
build by others. Without some guidelines the work of others
will not be as easy to read and adapt as it could be. That's
why I think BI Publisher development can really use some standards
and best practices. And guess what: this blog will provide
you an overview for free!
Name The Names
One of the first things I can think of when
tying to make BI Publisher development more intuitive, is
a naming convention. In the end you will be working with several
XML files: a data template, a bursting control file and some
preview data. I have seen people get confused and load a data
template in the Word template builder, to build their layout
on! What I propose is really simple, but will save you the
time figuring out which file is which:
· Data template
- use _DT.xml as postfix for the filename.
· Bursting control file
- use _BC.xml as postfix for the filename.
· Preview data -
use _DATA.xml as postfix for the filename.
See below for a BI Publisher customization
I have been working on, it's easy to see what each file is
meant for.
Best Way To Do XML
When you begin building a BI Publisher report,
you need to be sure you have all the answers you need. Therefore,
it is important to think about several fundamental BIP aspects
before beginning to define the XML structure:
· How many different layout templates are you going
to develop on the XML structure? Take the requirements of
each of the templates into account when thinking about the
XML structure. The data needs to be complete and the hierarchy
of the structure in the XML file needs to follow the structure
(master and detail records) of the reports.
· Do you need to do bursting? If so take good care
with the XML structure. Since bursting will split the XML
data into smaller parts, all elements outside the scope of
bursting won't be accessible after the bursting process. You
have to be sure to put all relevant data under the XML element
that is bursted on. Yes, this might mean having redundant
data in the XML.
· Is translation needed? If so, the data should be
available in multiple languages and you need to build this
into queries, selecting the data for the XML.
When XML data is generated it is impossible
to see how, and when it was generated. In order to track the
source of bugs, it is sometimes important to know the database
on which an XML file was generated, as well as the id and
arguments of the concurrent request. For this pupose it is
necessary to have some meta-data information in each XML file
that is generated by BI Publisher. Below, I have given an
example of a query that can be added to the data template
in order to have some descriptive information in each generated
XML data.
The Ideal RTF Template
There is no such thing as an ideal RTF template,
but we can try to come as close as possible. An ideal template
would resemble the layout of the report that is to be generated
and would be easy and complete to the understanding of the
developer. This can be contradictory, but with the hide function
in Word it is possible to create two "views" in
your RTF template, and thus comply to both requirements.
The idea is simple: make everything that
only the developer wants to see hidden. Basically, these are
the statements that control the processing flow, but do not
print data. For example, this is the case for:
· conditions
(<?if:CURRENCY='EUR'?> and <?end
if?>)
· repetition (<?for-each:INVOICE?>
and <?end for-each?>)
· defining sub-templates (<?template:footer?>
and <?end template?>)
You can use this button
to switch between the layout view and the developer view.
Furthermore, all the Text Form Fields that
you use to insert data into the template can be given a descriptive
name. In order to improve readability this name should be
an example of the data that the Text Form Field represents.
This will make sure that you have a view on how the generated
document will look, based on example data. It is useful when
you want to determine how wide columns should be for the data
to fit in.
Want to know more?
My goal for this article was to provide
you a glimpse into the best practices and standards that I
have been working on, with my colleague Serge Vervaet. If
you would like to know more, please contact me directly, for
a broader dicussion about what's best in BI Publisher development.
Allthough not yet officially available, I can tell you there
is a BI Publisher Best Practices training coming ... so stay
tuned for more BIP Best Practices!
Oracle
E-Business Suite Adapter Overview
By Neeraj Chauhan[Mar-08]
The Oracle E-Business Suite Adapter provides
comprehensive, bi-directional, multi-modal, connectivity to
and from the Oracle E-Business Suite to provide seamless integration
in the heterogeneous ecosystem of your enterprise. The Oracle
E-Business Suite Adapter exposes the Oracle E-Business Suite’s
interfaces as Web services. These Web services can in turn
be composed into a SOA-based integration solution between
business processes across enterprise applications, using Oracle
Fusion Middleware.
Summary of some of the key features in the
Oracle E-Business Suite Adapter:
Leverages Integration Repository
The Oracle E-Business Suite Adapter leverages
the Oracle E-Business Suite Integration Repository to provide
the meta-data of the public integration interfaces. The Integration
Repository is the source of truth for external integration
published by Oracle E-Business Suite. In E-Business Suite
11i10 the Integration Repository is a hosted instance (http://irep.oracle.com)
whereas, in E-Business Suite R12.0 it is bundled with the
product, under the "Integration Repository" responsibility.
Widest range of Interfaces Supported
The Oracle E-Business Suite Adapter supports
different integration technologies from Oracle E-Business
Suite including PL/SQL APIs, Business Events, Open Interface
Tables, Concurrent Programs, XML Messages, eCommerce Gateway
Interface and Interface Views.
Secured and Trusted Connection
Establishing the connection between the
middleware and the enterprise application is of paramount
importance, to avoid any misuse of shared connection authentication
credentials. The Oracle E-Business Suite Adapter works in
a secured and trusted connection environment between Oracle
Fusion Middleware and Oracle E-Business Suite, that uses FND
user name and password only and thus requires no other shared
credentials. More details can be found on Metalink Note #
464164.1
Enables Functional Security from Oracle E-Business Suite
Security is the most critical feature that
is designed to guard application content from unauthorized
access. The Oracle E-Business Suite Adapter implements the
functional security model of E-Business Suite to provide the
security feature which only allows users with authorized privileges
to execute APIs that they are exposed through the Oracle E-Business
Suite Adapter. This feature is available with EBS 11i10 as
well EBS R12.0 release. More details can be found on Metalink
Note # 464164.1
Transaction Support
The Oracle E-Business Suite Adapter implements
and provides two-phase commit transaction support from the
technology foundation of the JCA compliant Oracle Fusion Middleware
Adapter Framework. The two-phase commit feature is available
via the implementation of Java Transaction API (JTA) under
Java Connector Architecture (JCA), to ensure that either all
the applications are updated or none, so that all the application
databases remain synchronized.
Application Context Ready
Global application context allows an application
context to be accessed across multiple database sessions,
reducing or eliminating the need to create a separate application
context for each user session. The Oracle EBS Adapter implicitly
initializes a user session before invoking the EBS service.
FND_GLOBAL.APPS_INITIALIZE procedure is called to initialize
the global security context for a database session.
Oracle E-Business Suite R12.0 Support and Oracle EBS Adapter
Roadmap
Support for E-Business Suite Release 12.0
is available with Oracle Fusion Middleware SOA Suite version
10.1.3.3, while the security features are available on 10.1.3.3
plus with patch numbers mentioned in Metalink Note #464164.1
There are certain roadmap features on the
horizon for Oracle E-Business Suite Adapter, namely, unified
error and exception handling and service monitoring at run-time.
Integrating
with Oracle E-Business Suite using the Oracle E-Business Suite
Adapter and E-Business Application Security
By James Lewis [Mar-08]
So, you made it past the long title. It’s
good to see there are still people with enough patience for
long-winded titles. I’m an integration architect for
an Oracle partner consulting company called E2E Consulting
out of Tempe, Arizona. In one of my SOA projects we had need
to integrate with Oracle E-Business Suite, affectionately
known as E-Biz. I had never integrated with Oracle E-Biz nor
one of the big ERP systems before, but was very familiar with
general integration with databases, queues, files, etc. So
what’s the big deal, anyway? It turns out there really
isn’t a big deal integrating with E-Biz, when you’re
using Oracle’s SOA Suite and the E-Business Suite Adapter
in Oracle JDeveloper. Of course, I’m sure some of you
astutely noticed the abundance of the word Oracle in the previous
sentence, which was on purpose. You would expect a company
to have a seamless integration strategy among their own products,
which is precisely what Oracle has done with the Oracle E-Business
Suite Adapter.
For my project, E-Biz is the system of record
for project management. So the first integration with E-Biz
was sending it work orders from their various work management
systems, which become tasks in E-Biz, in order for employees
to be able to charge time against the task on their timesheet,
and/or order materials using the task ID. Thankfully, since
we were already knee-deep in BPEL using JDeveloper at this
time, and noticed the handy E-Business Suite Adapter icon
available as a BPEL service in JDeveloper, that seemed a logical
choice. However, even when using the Oracle E-Business Suite
Adapter, there are still several options for integrating to
E-Biz using it.
Which Integration Method to Use?
As you can see in Figure 1, there are many
options for integration with Oracle E-Biz. Since we were integrating
from Oracle BPEL Process Manager to E-Biz, we could rule out
several of the methods shown, which left the following options:
· Oracle XML Gateway
· Concurrent Programs
· PL/SQL APIs
· Interface tables
In this case, we selected to use PL/SQL
APIs directly, to avoid additional configuration and maintenance
in future upgrades of E-Biz. As seen in the figure above,
internally the Oracle Applications adapter makes heavy use
of J2CA (J2EE Connector Architecture) to make the physical
connections to Oracle E-Biz. We’ll come back to configuring
the J2CA connection in the Oracle E-Business Suite Adapter
later in the blog. What is important for now is J2CA allows
SOA Suite to hide the specific connectivity details of what
each adapter needs by exposing just the J2CA connector to
the BPEL process.
I’m guessing that if you’re
reading this blog, you’re familiar with creating BPEL
processes in JDeveloper already, and interested in seeing
how easy it is to use the E-Business Suite Adapter to connect
with E-Biz. If not, there’s an abundance of good tutorials
out there that step through creating a BPEL process in JDeveloper,
and even ones that step through using the E-Business Suite
Adapter to connect to E-Biz. My intention is not to duplicate
information on these sites, but to augment them by providing
what insight I’ve gleaned through personal experience
using the E-Business Suite Adapter in my project. However,
it’s inevitable that I’ll present some steps that
you’ll see elsewhere, but only to illustrate specific
points.
One duplication is the Oracle Applications
Module Browser, which is used by the Oracle Applications wizard
in JDeveloper to determine which communication method and
API to invoke. In our case we had an Oracle E-Biz support
developer from the customer on the integration team who knew
the specific APIs and package they were in that we needed
to use, so it took no time finding the specific APIs for adding
and updating tasks in the Projects module. Based on the communication
methods listed previously, you could also filter the APIs
shown by selecting only the communication methods you want
to use at the top of the module browser. Figure 2 shows an
example of what the Applications Module Browser looks like
within JDeveloper.
Application Contexts and Oracle E-Business Suite
Defining what an application context is
outside the scope of this blog, and you can read more about
it here. What was primarily important is that in addition
to using database-level security in the connection to the
E-Biz database, E-Biz also uses application-level security
to authorize use of its APIs. In order to support application-level
authorization, the Oracle E-Business Suite Adapter allows
the use of a header variable in the BPEL process. At a minimum,
the header variable must contain the application username
and responsibility to use to pass application level authorization.
Additionally it can contain the organization to use for the
username and responsibility, depending on the version of E-Biz
and whether E-Biz is configured to use multiple organization
units. In our situation we only needed the username and responsibility,
and since we would need to invoke multiple PL/SQL APIs using
this header variable, we declared a global variable of the
header type and assigned the username and responsibility early
in the BPEL process. Fortunately when we created the partner
link service, JDeveloper created a WSDL named procedureAdapterHeader.wsdl
that defined the message type for the Oracle Applications
header, so we only needed to create a global variable of this
type. Then, an assign activity was added to the BPEL process
that allowed the global header variable to be initialized
for use later. In order to allow access to all the APIs needed
the username was set to Sysadmin and the responsibility was
set to “Order Management Super User, Vision Operations
(USA)”.
Then, when the Invoke activity in the BPEL
process was added for adding a task in E-Biz, we selected
the variable storing our E-Biz credentials to use in the API
using the “Browse” flashlight icon. That’s
it! And now we can access the APIs we selected before without
errors from Oracle. We did the same steps when adding the
invoke activity for updating a task in E-Biz, using the same
variable.
Before leaving the discussion about application
context, I’d be remiss if I didn’t mention that
JDeveloper does embed a standard username and responsibility
in the partner link WSDL it creates for E-Biz APIs. By default
it will embed a username of “sysadmin” and responsibility
of “System Administrator” in the <jca:operation>
in the WSDL, so if that works for your installation of E-Biz
and the APIs you need to access, then you won’t need
to even use a header variable to set your application context
in the API call.
Don’t Forget to Cross Your Eyes and Dot Your T’s
Even if you’ve been using the Database
Adapter to integrate various systems in Oracle SOA Suite thus
far, if this is the first time you’re using the Oracle
E-Business Suite Adapter, you can still forget to configure
the BPEL server instance completely. Just like with the Database
Adapter, when you add a Database Adapter Partner Link to a
BPEL process, it will use your JDeveloper database connection
information in the WSDL for the Partner Link so in case you
don’t configure the server’s J2CA adapter with
the corresponding JNDI entry, it can at least function properly,
even if inefficiently creating a new connection each invocation
and pointing to a development database. Similarly, when a
partner link using the Oracle E-Business Suite Adapter is
created, JDeveloper embeds connection information into the
WSDL for the web service. You’ll find a JDBC URL connection
string, username and password to connect to the E-Biz database
within a <jca:address/> element in the WSDL, as when
using the database adapter. One diagram I found particularly
useful in understanding which connection information is used
by the adapters is located here. So based on this, we created
a database connection pool and datasource in the Oracle Application
Server that support XA transactions, and then edited the AppsAdapter’s
oc4j-ra.xml file as mentioned in the WSDL created by JDeveloper
to create a <connector-factory> element with a location
attribute matching the location attribute within the <jca_address>
element in the WSDL created by JDeveloper for the partner
link. Finally we added a <config-property> element under
the <connector-factory> whose name=”xADataSourceName”
and value matched the XA datasource created. After restarting
the OC4J instance we could deploy our BPEL process and have
it use the configured datasource and connection pool to connect
to E-Biz and not create a new connection using the WSDL properties
each time the process was invoked.
No Pain, All Gain
The entire process above took only a few
hours, which included time to read and investigate on how
to setup the header variable for the Oracle EBS API calls.
However, now having done it once it would really only take
several minutes to connect to E-Biz and use the existing APIs
provided, configure the server and deploy the BPEL process.
Hopefully this blog will save some of your time that otherwise
would be spent investigating how E-Biz credentials can be
passed to the E-Biz adapter.
BPEL:
Migrating from DEV:TEST:PROD Environments
By Anirudh Pandit [Apr-09]
"Ah, to build, to build!
That is the noblest art of all the arts."
-- Henry Wadsworth Longfellow
Deployment is a vital step in developing and implementing
any BPEL application, as most applications must be deployed
to multiple environments including Dev, Test, QA, and Production.
Given these environments are often configured differently
from each other, for example Service End points, runtime properties,
adapter properties, deployment can often pose numerous challenges
if this process is not considered and planned for. This article
will highlight the new deployment capabilities in BPEL version
10.1.3.4 and also revisit deployment approaches that can be
used when using BPEL version 10.1.3.3.
Deployment in BPEL Version 10.1.3.4
Oracle BPEL Process Manager version 10.1.3.4
introduces a significantly enhanced methodology for application
deployment to different environments. In BPEL 10.1.3.4 a single
BPEL Suitcase is used to deploy your BPEL application to all
of the various deployment environments. The distinct configurations
for each environment are maintained in a deployment plan attached
to the BPEL Suitcase, and at the time of deployment all respective
environment changes are applied to the appropriate BPEL project
files. Test, QA, Prod environments each have a deployment
plan with assoicated configurations for service endpoint WSDL,
XSD etc.
The next few steps describe how to create
a deployment plan and associate it with the BPEL Suitcase
for deployment to different environments. The following logical
steps allow you to simply automate BPEL deployment in 10.1.3.4:
1. Create a deployment plan for each environment
2. Maintain each environments configuration in the respective
deployment plan
3. Attach the deployment plan to the build process to generate
the BPEL Suitcase
4. Deploy the Suitcase to the Environment
In the example below we are using JDeveloper
as the development environment, but any other ANT based development
tool can be used.
The screenshot below shows a BPEL process
to be deployed to the Test Environment. The Partner link (CreditRatingService)
WSDL locations are different in Dev and Test.

In BPEL 10.1.3.4 there are 4 ANT commands
provided:
| Element |
Description
|
generateplan |
This option creates a deployment
plan file for editing that includes all partner links,
configuration properties, and WSDL imports in the BPEL
process. The planfile attribute indicates the name to
use for the deployment plan file. You can create a plan
from either of two sources. o bpel.xml deployment descriptor
fileSpecify a value with the descfile attribute. For
example, descfile="${process.dir}/bpel/bpel.xml".This
source is for developers who want to generate a plan
without compiling the project. After development is
complete, you copy the deployment plan file to the build
folder and create the JAR file.o BPEL suitcase JAR fileSpecify
a value with the suitecase attribute. For example: suitecase="${process.dir}/output/_BPELProcessDeployment_1.0.jar".This
source is for administrators who do not want to review
code. Instead, you take the JAR file, generate a deployment
plan file, attach the file to the JAR file, and deploy
it.Note: The content of the deployment plan is the same
with either source. |
attachplan |
This option packages a deployment
plan file with the suitcase JAR file. The deployment
plan file is automatically renamed to bpeldeployplan.xml
in the suitcase JAR file. If this file already exists
in the suitcase JAR file, it is overwritten with the
new plan. |
validatePlan |
This option validates the deployment plan and identifies
all search and replacement changes to be made on the server
side during BPEL process deployment. Use this option for
debugging only. The reportfile attribute indicates the
file name in which the results of this test are written.
For example, reportfile="${process.dir}/output/debug.txt" |
extractplan |
This option extracts the existing deployment plan packaged
with the suitcase JAR file for editing. If no plan file
exists, this is the same as creating a new file with generateplan. |
Step 1) Create Deployment Plan
Open the build.xml file and add the following
code .
< target name="generatePlanForTestEnv">
< generateplan planfile="${process.dir}/Test_EnvDeploymentPlan.xml" verbose="true"
overwrite="true" descfile="${process.dir}/bpel/bpel.xml"/>
</target>
<target name="generatePlanForDevEnv">
<generateplan planfile="${process.dir}/Dev_EnvDeploymentPlan.xml" verbose="true"
overwrite="true" descfile="${process.dir}/bpel/bpel.xml"/>
</target>
The build file should now look something like this:

Now we will run ANT from JDeveloper to create
the deployment plans for the Dev and Test environments, you
can use any other ANT tool to generate the plans.
Right click the build.xml file and select the Run Ant option.

Now select the generatePlanForDevEnv and
generatePlanforTestEnv to the target pane as shown in the
screenshot below.

Click Ok.
This should generate the deployment plans
for the Dev and Test environments, output from the ANT log
file in JDeveloper is shown below:
This should generate the Dev_EnvDeploymentPlan.xml
and Test_EnvDeploymentPlan.xml.xml files in the ${process.dir}
folder.

Step 2) Maintain each environment's configuration in the
respective deployment plan
Open the respective deployment plans to
change or add the environment configurations
In this example, we will change the WSDL URL of the PartnerLink
to point to the Test environment.
The deployment plan for Test should look
similar to the following:
Step 3) Attach the deployment plan to the build process
to generate the BPEL Suitcase
Add the following code to the build.xml
file:
<target name="AttachTestPlan">
<echo> ---- Attaching the Test deployment plan file -----</echo>
<attachplan planfile="${process.dir}/Test_EnvDeploymentPlan.xml" verbose="true"
overwrite="true"
suitecase="${process.dir}/output/bpel_BPELProcessDeployment_v2009_03_23__53965.jar"/>
</target>
You can also parameterize the suitcase directory.
The build.xml file should look similar to the one shown below:

Right Click Build.xml in JDeveloper and Select the RunAnt
command and move AttachTestPlan to Selected Targets and click
Ok.

The build process should attach the plan
to the BPEL Suitcase. Output from the ANT log file in JDeveloper
is shown below:

Note that the attachplan command does not
replace the old bpel.xml. Replacement occurs only when the
BPEL process is deployed to the server. Similarly, we can
extract and validate plans based on the ANT commands that
are provided with BPEL 10.1.3.4
Step 4) Deploy the Suitcase to the Test Environment
Deploy the BPEL Suitcase to the server. In our example I will
use the deploy (default) ANT target but this can be customized.
Right click build.xml and select deploy
(default) and move it to Selected Targets and click OK.
This will deploy the BPEL Suitcase with the Test Environment
Configuration for the WSDL location, to the server.
Deployment in BPEL 10.1.3.3
When a BPEL process is developed in JDeveloper,
it creates ANT scripts that can be directly deployed from
JDeveloper to the Dev environment.
This is not the best approach when applications are deployed
to multiple environments because of the need to support different
environment variables.
BPEL 10.1.3 provides a “Customize”
ANT task where different properties of various environments
can be declared in a single file.
Properties can be parameterized for these
environments in the bpel.xml file. Different property values
can be defined for these environments in the Build properties
file.
These are passed to the bpel.xml file parameters in the customize
task. The “Customize” task can be run as a subtask
of BPELC or as a standalone ANT task.
In BPEL Version 10.1.3.3, a BPEL Suitcase
file is generated for every environment the project is deployed
to.
Solution Details
The following files can be found in the
BPEL Process Directory:
· BPEL Process Folder
· Build.xml
· Build.properties
· BPEL (folder)
The following steps are required to customize the deployment
task.
1. Create copies of the build.properties
file for each environment, naming them as follows and save
them in the same location.
· build_dev.properties
· build_test.properties
· build_qa.properties
· build_prod.properties
2. Each environment property file i.e. build_<env>.property
file supply values to parameters that will be defined in a
later step.
Make the following changes to build_<env>.properties
to reflect the respective environment and application parameters
values.
bpel_host=<bpel server host name> # e.g. prod host name in build_prod.properties file
bpel_port=<bpel server port>
admin.user = oc4jadmin #This is default, it can be any other admin user
http.hostname = <hostname> # hostname of the server where we are deploying
# Change if deploying to domain other than "default"
domain = <bpel domain>
# Change if deploying with process revision other than 1.0
rev = <current revision>
3. Copy the build.xml from <BPEL Process main folder>
to the BPEL sub-folder . 4. Define
the ANT ‘customize’ task to change the WSDL URL
of a PartnerLink.
Add the <partnerLinkBinding > tag
and the WSDL location property with respective parameters.
Repeat this step for every partnerlink that needs modification.
a) Find the following piece of XML in the build.xml file
under {BPEL Application}/bpel folder
<target name="compile">
<echo>
--------------------------------------------------------------
| Compiling bpel process ${process.name}, revision ${rev}
--------------------------------------------------------------
</echo>
<bpelc input="${process.dir}/bpel/bpel.xml" out="${process.dir}/output"
rev="${rev}" home="${bpel.home}"/>
</target>
Replace the above XML with the following:
<target name="compile">
<bpelc input="${process.dir}/bpel/bpel.xml" out="${process.dir}/output"
rev="${rev}"home="${bpel.home}">
<customize>
<partnerLinkBinding name="TestProcess">
<property name="wsdlLocation">
http://${bpel_host}:${bpel_port}/orabpel/${domain}/TestProcess/TestProcess?wsdl
</property>
</partnerLinkBinding>
</customize>
</bpelc>
</target>
b) The second part of this step is to point
to the properties file to provide environment parameter values.
To do this, find the following piece of XML in build.xml file
under {BPEL Application}/bpel folder
<property file="${process.dir}/build.properties"/>
Replace the above XML with the following:
<property file="${process.dir}/build_${env}.properties"/>
The ${env} parameter
value will be provided when the ANT script is compiled.
5. The following steps direct the main {BPEL
Process}/build.xml to run the {BPEL Process} /bpel/build.xml
file that was created.
a) Create a new target to redirect to the
{BPEL Process}/bpel/build.xml file
Make the following changes and add the following
target to the {BPEL Process}/build.xml file
<target name="compileEnv">
<echo>
--------------------------------------------------------------
|Compiling bpel process with following ${process.name}/bpel/build.xml file
-------------------------------------------------------------
</echo>
<ant dir="${process.dir}/bpel"/>
</target>
b) The second part of this step is to modify
the process-deploy target to invoke the new compile target
that was created.
Find the following piece of XML in the build.xml
file under {BPEL Application}/bpel folder:
<target name="process-deploy"
depends="validateTask, compile, deployProcess, deployTaskForm, deployDecisionServices" />
Replace
it with the following:
<target name="process-deploy"
depends="validateTask, compileEnv, deployProcess, deployTaskForm, deployDecisionServices" />
c) Find the following piece of XML in the
build.xml file under {BPEL Application}/bpel folder:
<property file="${process.dir}/build.properties"/> Replace
it with the following:
<property file="${process.dir}/build_${env}.properties"/>
6. Use ANT
and deploy the respective BPEL process.
ANT -Denv=dev -Dadmin.password=<oc4jadmin
password>
use env=prod or test or qa depending on environment.
Embedding
Oracle Configurator in WebCenter / ADF Applications
By Varun Puri and Anand Verma [Mar-08]
About Oracle Configurator
Oracle Configurator is an application that
offers guided selling to customers by enabling online product
configuration. Oracle Configurator is part of both Oracle
Order Management and Oracle CRM, and integrates seamlessly
with other Order Management and CRM applications, including
iStore, Order Management, Quoting, Sales and TeleSales.
How is it used?
The Configurator is installed in the source
application. It provides a component called Configurator Developer
to design the configurations of various products in the source
application. It also provides a Servlet that is embedded in
the application and enables a customer visiting the application
web site to configure a selected product as per his / her
choice and submit the configuration data. The Configurator
Servlet in turn, returns the processed information such as
Quote or Price based on the selected configuration.
Oracle Applications such as Oracle CRM and Order Management
include Oracle Configurator as part their installation while
other applications like iStore, Quoting, Sales and TeleSales
provide out of box integration with Oracle Configurator.
How is Configurator integrated in a Custom Application
As mentioned in the previous section, Configurator
provides a Servlet that should be embedded within the application
to access the product configurations defined in the source
application (CRM, Order Management etc).
To start using this servlet, it should be
initialized first to create a session. To do this you need
to pass an Initialization Message in the form of XML. The
initialization message contains a list of parameters to decide
which product’s configuration UI should be loaded in
the browser. The following provides a sample Initialization
Message XML:
There are a number of parameters that can
be passed, and the combination of parameters to be passed,
depends upon your requirements. The details of all of these
parameters can be found in the Oracle
Configurator Implementation Guide.
This data is submitted to the configurator
servlet through an HTML form. The action
attribute of the form should point to the Configurator Servlet:
http://<host>:<port>/OA_HTML/CZInitialize.jsp.
Where <host>
and <port>
are the host name and port number of the Configurator
Servlet installed in the Source Application (CRM, Order Management
etc). This loads up the UI of the specified configurable product.
After the user is finished with the configuration he / she
clicks the finish button. The submitted data is processed
by the configurator and based upon the product configured
in the Configurator UI; the Configurator Servlet posts a Termination
Message in the form of XML to the URL specified in
the return_url parameter. The termination message contains
the processed information for the configured product. The
developer of the return_url page needs to process the Termination
XML to extract the information. The following figure shows
a sample Termination Message XML:
This approach works well for simple J2EE
applications, but to do the same in an ADF or WebCenter application
you will need to do a little more work along with this. This
blog provides step-by-step guidelines to integrate Oracle
Configurator in an ADF Application.
Integrating with an ADF Application
The integration is achieved in three steps:
1. Creating a simple J2EE application and creating a page
with an HTML Form to pass Initialization Message to the Configurator
Servlet. Lets name it Initialization Page.
2. Creating a page to handle the Termination Message from
Configurator Servlet. Lets name it Return Page.
3. Embedding the Initialization Page in your ADF Application.
Note: The guidelines
below are based on developing applications using Oracle JDeveloper,
but of course, you can utilize any other commonly used Java/J2EE
Developer IDE(s).
Creating a simple J2EE Application and Initialization Page
1. Create a simple J2EE (non-ADF) application.
2. Create an HTML or JSP page in the application. This page
will be used to submit the initialization data to the Configurator
Servlet. This page will be embedded in your ADF Application
later on using HTML IFrame.
3. Create an HTML Form in the page with following parameters:
|
Form Attribute |
Value |
Description
|
action |
http://<host>:<port>/OA_HTML/CZInitialize.jsp |
The URL of the Configurator Servlet |
method |
post |
Form Method Type |
4. Create a Hidden Type HTML Field
in the Form with the name XMLmsg.
5. Specify the value of the field in the
form of Initialization Message
Note: If you want to
pass parameter values dynamically you should make this a JSP
page rather than a static HTML page.
6. Put the javascript code onload=”document.forms[0].submit()”
in your page’s <body>
tag. Adding this code will submit the HTML Form as
soon as the page loads up.
7. The return_url
parameter in the initialization message should point to your
return Page that you will create in the next section.
Note:You should specify
absolute URL in the return_url
parameter. This is required because; once the initialization
page is submitted the control is transferred to the Configurator
Servlet and on completing the product configuration, the Configurator
Servlet passes the control back to the URL specified in the
return_url parameter.
Creating Return Page
1. Create a JSP page in your simple J2EE
application. This page will be used by the Configurator Servlet
to pass the Termination Message once the user clicks finish
in the Configurator Servlet UI.
2. The Termination Message is passed via
HTTP Request Parameter XMLMsg. You can extract the message
using HTTPRequestObject.getParameter(“XMLMsg”).
3. Now you need to use Javascript to parse
the termination message xml and pass the extracted data to
the ADF Application (remember this page will load in the IFrame
within your ADF Application).
4. Lets assume, you are required to pass
the config_header_id
and config_rev_nbr
parameters to the ADF page.
5. The following figure shows a sample JSP
that you can use to start with:
Embedding Initialization Page in ADF Application
1. Open the ADF Page where you want to embed
the Oracle Configurator functionality.
2. At the appropriate place in your page,
insert an HTML IFrame as following:
3. Let's assume you have two fields on your
ADF page, one for Configurator Header Id and the second for
the Configurator Revision Number that you need to populate
from the Configurator Servlet’s processed data.
4. Modify the af:form
component and specify the Id attribute. In
JDeveloper, you can do it using the Property Inspector of
the Form. As shown in the figure below:
5. In the same manner specify the Id attributes
for Configurator Header Id and Configurator Revision Number
Fields as well. Make sure, you use the same Id(s)
used in the Javascript function on the Return Page JSP that
you created in the previous section.
6. Once you have the data on the ADF page,
you can use it for processing in your ADF Application.
7. This completes the integration. Now run
your ADF application and see the data being passed from the
Configurator UI to the ADF Application.
Sample Screen Flow
The screen flow will be as follows:
Step 1: The Configurator Servlet
opens up in the IFrame within ADF Application.
Step 2: Configure the Product in
the Configurator UI and click Finish.
Step 3: The Configurator Servlet
passes the control back to the Return URL page where using
Javascript the data is passed to the ADF Application.
Combining
Multiple Worklists into a Single BPEL Tasklist
By Michael Rulf [May-09]
When you start using both BPEL and E-Business
Suite, you end up with multiple worklists containing tasks
that have been assigned to you. This article will explain
how you can collect workflow tasks from E-Business Suite (EBS)
and populate them into the BPEL task list. We will be using
the Business Event functionality built-in to EBS to invoke
a BPEL process whenever Workflow sends a notification message.
First, some assumptions:
1. This exercise assumes that all your userids are the same
for both EBS and BPEL. This can either be done by configuring
EBS and BPEL to use the same LDAP repository, or you can manually
define and manage the users in both systems.
2. For this example, I am assuming that all notifications
have approval codes of “Approve” and “Reject”.
The code provided collects the approval codes for the
notification and you could extend the example to accommodate
additional approval codes.
After creating a new application to contain
your work, let’s create an Asynchronous BPEL process
to handle workflow notifications.

You will want to set the input schema to
match the EBS workflow event structure by selecting the APPS_WF_EVENT_T.xsd
file provided by Oracle and selecting the
WF_EVENT_T type.

The first step is to gather some additional
information about the workflow notification. I have written
a small PL/SQL procedure and two associated data types that
collects the necessary information.
The two data types are used to gather valid
response codes for a particular notification. While this example
does not deal with multiple sets of response codes,
you could use this code to extend the example based on your
response values.
create or replace type xx_bpel_response_record is object(code varchar2(30), meaning varchar2(30))
create or replace TYPE XX_BPEL_RESPONSE_ARRAY AS TABLE OF xx_bpel_response_record
This procedure returns information about the notification
that is used by the BPEL process to generate the BPEL notifications.
create or replace
procedure xx_bpel_GetSummary (notification_id in varchar2,
is_url out nocopy varchar2,
msg_subject out nocopy varchar2,
msg_body out nocopy varchar2,
msg_url out nocopy varchar2,
msg_role out nocopy varchar2,
response_codes out nocopy xx_bpel_response_array,
p_ret_array_size OUT NOCOPY NUMBER,
p_result OUT NOCOPY NUMBER,
p_error_code OUT NOCOPY NUMBER,
p_error_msg OUT NOCOPY VARCHAR2) is
/* declare */
C_RESULT_SUCCESS CONSTANT NUMBER(2) := 0;
C_RESULT_ERROR CONSTANT NUMBER(2) := 1;
C_INVALID_PARAM_ERROR CONSTANT NUMBER(2) := 2;
C_INVALID_ACTION_ERROR CONSTANT NUMBER(2) := 4;
resp_msgtype varchar2(100);
resp_msgname varchar2(100);
resp_priority varchar2(100);
resp_duedate varchar2(100);
resp_status varchar2(100);
cursor c1 is
select lookup.lookup_code code, lookup.meaning meaning
from wf_lookups lookup, wf_activities activities
where activities.message=resp_msgname
and activities.item_type=resp_msgtype
and activities.end_date is null
and lookup.lookup_type= activities.result_type;
begin
/* Get the subject line of the notification*/
msg_subject:= wf_notification.GetSubject(notification_id);
/* Get the body of the notification */
msg_body:= wf_notification.GetBody(notification_id);
/*See if there was a URL embedded in the notification*/
is_url:= wf_notification.isFwkBody(notification_id);
/* If there was a URL in the notification, retrieve it */
msg_url:= wf_notification.GetFwkBodyURL(notification_id,'text/plain');
/* Get the details about the notification*/
wf_notification.GetInfo(notification_id, msg_role, resp_msgtype, resp_msgname, resp_priority, resp_duedate, resp_status);
/*See if there was a URL embedded in the notification*/
is_url:= wf_notification.isFwkBody(notification_id);
/* Retrieve the response codes used by the notification */
response_codes:=xx_bpel_response_array();
for results in c1
loop
dbms_output.put_line(results.code);
response_codes.extend;
response_codes(response_codes.count):=xx_bpel_response_record(results.code, results.meaning);
end loop;
/* The number of response code values */
p_ret_array_size := response_codes.count;
p_result := C_RESULT_SUCCESS;
EXCEPTION
WHEN OTHERS THEN
p_ret_array_size := 0;
p_result := C_RESULT_ERROR;
p_error_msg := sqlerrm;
end xx_bpel_GetSummary;
Once we have the data types and procedure compiled in the
Database, we can call the procedure from the BPEL process
through the definition of a Database (DB) Adapter.

Select the Database connection to your EBS
instance:
Specify that you are going to call a stored
procedure.
Specify the procedure we just defined.
Select “Finish” then accept
the partner link that was created.
The next step is to create an “Invoke”
action to call our DB Adapter and generate the input and output
variables.
Add an “Assign” action to copy
data from the input variable to the input variable for your
Invoke action.
You will need to modify the default “from” xpath
to specify you want the first value entry (PARAMETER_LIST_ITEM[1])
in the parameter list as shown below.
Your BPEL process should now look like the
following:
Now that we have collected data about an
invoking EBS workflow, we need to add a “Human Task”
to the process and create a new task definition.
This “Human Task” will add your EBS notification
to the BPEL work queue.

You will need to add a parameter to the notification payload
so you can pass the notification recipient as defined by the
EBS workflow to the BPEL work queue.
Then add an assignment by expression that
uses this payload parameter to the participant list used by
BPEL.
Your Human Task should now look like this:
The last step for setting up the Human Task
is to populate the payload parameter you just added.
Select the assignment within the Human Task scope and add
the recipient. In order to do so, you need to update the schema
used by the BPEL
process to define the human workflow task. If you look at
the Application Navigator, you will see there currently are
two WorkflowTask.xsd files.
You need to update the one under “taskservice”
to include the payload specification you just created in the
EBSNotification and change the task payload type
to “payloadType”. When complete, your schema should
look like this:
After making these changes, refresh the
variable definitions via the structure pane to ensure your
BPEL process sees the new payload definition.
You are now ready to add the EBS recipient
to the Human Task by updating the first pre-populated assignment
action in the Human Task scope.
First, you need to remove the default XML
Fragment assignment created by the wizard process as highlighted
below.
This default assignment overwrites the payload data structure
which we now need in order to populate our recipient information.
Once that is deleted, add the recipient
information.
The final steps take the result returned
by the Human Task and pass them back to the EBS Workflow engine.
First, add a DB Adapter to populate the result code back to
EBS via the “wf_notification.SetAttrText” procedure.
Set the DB Connection info to your R12 instance.
You are going to want to call a stored procedure
to update.
Once the DB Adapter is created, you need
to call it for each of the Human workflow results.
This is done by adding assignment and invoke activities to
each of the case outcomes.
The assignment activity sets three parameters
required by the DB procedure:
1. The ID of the notification you wish to update.
2. The workflow notification attribute you will be assigning
a value. In this case is the “RESULT” attribute.
3. The value you will be assigning to the attribute. In this
case it the result code returned by the human workflow.
Repeat for the other explicit case outcome
value. Your BPEL process is now complete and should look as
follows:
Now that we have created a BPEL process
to coordinate the EBS workflow notifications, we need to implement
an ESB service to
collect the necessary Business Events from EBS. When ever
a workflow notification is sent in EBS, it raises the “oracle.apps.wf.notification.send”
business event. By creating an Oracle Applications Adapter
for this business event, JDeveloper will automatically generate
and execute the necessary code
to register your event listener. Create a new ESB project
in your application and add and Applications Adapter to the
project.
You will want to create a new WSDL file
which launches the EBS Adapter Wizard. After selecting your
connection
You may be asked to create the iRep file
which discovers all of the EBS services available to the adapter.
If this is your first EBS adapter, go ahead and build the
file. You are now ready to select the necessary service which
is under “Other Interfaces->Business Events->Outbound(Listen
to Business Events from Oracle Apps)”.
JDeveloper then populates the Operation
Objects for you.
You will want to specify a schema. Use the
APPS_WF_EVENT_T.xsd schema provided by Oracle and complete
the adapter definition.
The wizard automatically adds a routing
service for you and you will see the following:
The next step is to add a routing rule so
your BPEL process is called every time the notification event
is raised.
You should browse the service explorer and select the initiate
action for your BPEL process from the registered BPEL processes.
This completes your ESB configuration which
should look as follows:
You are now ready to start receiving EBS
workflow notifications in your BPEL work queue.
Service Oriented
Approach for E-Business Suite Integrations
By Peeyush Tugnawat [Sep-08]
Oracle E-Business Suite (EBS) is one of
the most widely used enterprise applications. EBS customers
are often challenged with the requirements for more collaboration
between traditionally separated business functions within
and outside the enterprise. This can be multiplied if the
enterprise consists of business functions served by diverse
best of breed applications.
Traditional enterprise application integration
mechanisms may deliver on short-term goals but it has many
shortcomings and often results in tightly coupled integrations
and vendor lockdown. Adopting a Service Oriented approach
for E-Business Suite Integration can deliver on fundamental
business needs. Besides addressing the immediate requirements,
a service oriented approach underscores and addresses the
fundamental reasons for doing the integration. Let’s
explore some of the things to consider to ensure the success
of SOA based integration solution for EBS.
Deliver on Fundamentals
Business process flexibility and collaboration
are the key forces that drive on-going requirements for integrating
with EBS and for that matter any enterprise application. A
Service Oriented Architecture (SOA) approach for EBS integrations
should try to deliver on the fundamental and implicit business
requirements of business process agility, simplicity, enhanced
visibility, efficiency, and reusability. When the fundamentals
are addressed, it becomes easy over time for businesses to
create new business processes that are composed of the existing
business functions and processes.
Understand Built-in EBS Integration Mechanisms
It is important to understand the different
integration components available within EBS to make an informed
decision about using one or more for your SOA integration
project. Your selection depends upon the integration requirements
and the interaction pattern determined to be the best fit.
The following integration mechanisms are
available within E-Business Suite.
| Oracle
XML Gateway |
E-Business
Suite utilizes the Oracle Workflow Business Event System
to support event-based XML message creation and consumption.
It can consume events raised by the Oracle E-Business
Suite and can subscribe to inbound events for processing.
It can be leveraged for Business-to-Business (B2B) and
Application-to-Application (A2A) integration scenarios.
|
Business Events |
The Oracle Workflow Business Event
System is an application service that leverages the
Oracle Advanced Queuing (AQ) infrastructure to communicate
business events between systems. There are more than
1000 built in events with in EBS that can be leveraged
for event-based integration of business processes. |
Concurrent Programs |
A concurrent program is an instance
of an execution file. Concurrent programs use a concurrent
program executable to locate the correct execution file.
Several concurrent programs may use the same execution
file to perform their specific tasks, each having different
parameter defaults. |
Interface Tables |
Interface tables are intermediate
tables into which the data is inserted first. Once the
data gets inserted into the interface tables, the data
is validated, and then transferred to the base tables.
|
PLS/SQL APIs |
These are stored procedures that
enable you to insert and update data in Oracle Applications.
|
Oracle E-Commerce Gateway
|
Oracle E-Commerce Gateway provides
a common, standards-based approach for Electronic Data
Interchange (EDI) integration between Oracle Applications
and third party applications. |
Use IREP to Discover and Catalog Available Business Services
To plan your SOA based integrations, the
architects and business users need to know about the services
available within EBS that can be leveraged to be a part of
your integration service(s). The first step when planning
and designing your integrations should be to use Oracle IREP.
This acts as single source of truth for the available business
services within EBS and also the details of service end-points.
IREP lets users easily discover the appropriate business service
interface for integration with any system, application, or
business partner.
To access IREP go to http://irep.oracle.com/.
If you are working on EBS R12, from the Navigator menu, select
the Integration Repository responsibility, then click the
Integration Repository link that appears.
Adopt SOA Principles for Integration Architecture
Use SOA principles of abstraction, loose
coupling, discoverability, and composition for service-oriented
integrations with Oracle EBS. Using Oracle SOA Suite for service-oriented
integrations can offer great advantage as it provides a complete
set of service infrastructure components for building, deploying,
and managing SOA's. Lets go over some details and things to
keep in mind while coming up with the architecture for EBS
integrations.
Use Standards
Using standards-based technologies for your
service-oriented integrations will help eliminate lock-down
with products and companies. This will enhance easy evolution,
enhancement, and composition of business processes that may
use services related to integrations.
Service Enable Enterprise Application Functions
Once you explore IREP and know the service
or interface that you want to use, the next step is to make
the function or service participate in your service oriented
integration architecture as a web service. To use one of the
integration functions such as business events or PL/SQL APIs
in a SOA-based solution (integration or composite process)
is relatively simple, with the help of Oracle Applications
Adapter by exposing them as Web services. This enhances re-usability,
extensibility, and delivers a faster design to deploy time.
It exposes existing EBS Integration interfaces as Web services.
The adapter inherently uses and leverages open standards,
including J2CA, XML, WSIF, WSIL, and WSDL. Most importantly,
it dramatically reduces the time to design and develop a SOA
based integration that interfaces with web service based integration
interface for EBS.
Business Semantics for Message Payloads
Business objects contained in the message
payloads for integration services should share common view
and semantics across the enterprise and should be architecturally
neutral. For example, there should be only one standard view
of Customer or Sales Order within an enterprise. This provides
common vocabulary and enables reuse, extensibility, and cross
pillar/application interoperability. The concept of a common
view of business information is commonly known as a Canonical
Data Model (CDM) pattern. Oracle has implemented this pattern
in the AIA foundation pack and it is termed Enterprise Business
Object (EBO). The majority of messages delivered with XML
Gateway are mapped using the Open Application Group (OAG)
standard.
Classify Integration Requirements
EBS requirements can be broadly classified
as real time / near real time and batch integrations. Identify
message exchange patterns for both types of integrations.
Event based asynchronous MEPs can be used for modeling both
type of integrations. Use synchronous services only when absolutely
required and if the SLA cannot be fulfilled by other integration
options.
Asynchronous Integration Patterns
Enable asynchronous near real-time business
interactions using event based integration services. Business
events can serve as the basic components of event driven architecture
and facilitate loosely coupled asynchronous service oriented
integration processes. Business events and AQ components provide
the mechanisms that can be used with the use of application
and AQ adapters respectively. For example, outbound integration
services can be invoked in real time by an employee create
event when new hire information is entered into EBS.
Batch Integrations
Batch integration requirements should be
carefully examined for factors such as volume, size, and other
transaction requirements. Typical batch integration requirements
include reading from a file from a secure location, transforming
data, and writing to database. Such requirements can be satisfied
by using file adapter with ESB. For large file sizes consider
debatching feature supported by File/FTP adapters. If the
batch integration includes a high volume of data with complex
data integrity requirements, ODI should be considered.
Service Layers
It is a good idea to adopt a layered approach
when designing your services. This promotes clear separation
within service stack and promotes enhanced reuse of services.
Think about the following layers:
Application Services Layer: These
are the application specific services like PL/SQL APIs or
business events related to a particular business function.
It also includes PL/SQL Web services.
Business Services Layer: The services
in this layer will encapsulate a particular business function
like creating a sales order. The service in this layer will
be a course-grained Web service that can be used by external
entities to perform a business function such as creating a
sales order in EBS or notifying other systems about a new
hire. The services in this layer can be implemented using
resource adapters (Application, DB, AQ) and ESB.
Orchestration Services Layer: The
process services in this layer are long-lived and cross-functional
processes that are composed of multiple services from the
business services layer and/or any other external Web service.
These services will provide a layer or abstraction for the
actual business service and the interactions it includes for
incorporating a business process. Services in this layer can
be implemented using BPEL that defines a model and a grammar
for describing the behavior of a business process based on
interactions between the process and its partners.
Inject Resiliency into SOA Components:
Build resiliency into the individual integration processes.
This may be easy to miss, even with the best architecture
in place. Always think about all the “what if”
scenarios and try to inject process level resiliency into
the individual integration processes.
For example, you can use partnerLinkBinding
configuration properties for implementing resilience to failures
in endpoints on which BPEL or ESB processes depend. Use retryMaxCount
and retryInterval.
Exception Handling: Despite all the
forward thinking there can be things that might and will go
wrong. Define reusable, extensible, and agile approach to
handle exceptions at process level and other unknown exceptions.
Using a common exception handler service with extensible interface
can provide the flexibility, re-usability, and extensibility.
Such common service can be implemented as a BPEL service.
Simplify Support Functions: Anyone
who has worked with application integration can relate to
the great deal of time and energy involved when troubleshooting
integration issues. With asynchronous messaging and multiple
services, the idea should be to ease the pains of traditional
EAI support functions.
In the case of EBS, people often jump to
the conclusion to create custom tables for handling integration
exceptions. Instead, try to leverage built-in human workflow
capabilities and the worklist application within BPEL. Notification
mechanisms can be used to notify support personnel in case
of exception and let them view and analyze the details in
an easy to read format within the worklist application. This
use of the human workflow feature has proved to be very helpful
for support persons.
Human interaction and intervention:
Business processes inevitably will involve human interaction
in some or other form. If your integration process involves
such role based people interaction, plan ahead and use standards-based
mechanisms to have human workflows. Oracle BPEL provides standards-based
human workflow capability that can be used for modeling human
interactions for your integration services.
Separate Business Rules: The integration
process is not a good place to embed and hard code business
rules. Avoid creating a custom layer in PL/SQL for applying
business rules or performing data validations. Identify the
rules and use Oracle Business Rules to provide loose coupling
between your integration service and rules. This will provide
the flexibility for business users to change business rules,
without needing developers to modify PL/SQL or redeploy integration
services.
Business Process Visibility: Plan
to provide visibility into your integration or business process.
This is very important because today, with heterogeneous systems
and applications, and with integrations spanning multiple
systems, it becomes very hard to have visibility at run-time.
Use Oracle BAM to enable users (IT and Business) to to monitor
and have visibility into business processes and integration
points in real-time.
SOA Governance:In simple terms, plan
for the capability to manage and apply policies for the services
within the service portfolio of your integration services.
This is critical for SOA and needs to be planned well to ensure
better management and control of services. Use Oracle Web
Services Manager for managing and applying policies for your
Web services.
Review AIA Offerings: Before diving
head-on into creating service oriented integrations for EBS
be sure to review the Oracle AIA offering. Oracle Application
Integration Architecture (AIA) provides an open standards-based
framework for creating cross-application business processes
and accelerates time-to-value. AIA offers Process Integration
Packs (PIPs) for delivering prepackaged, end-to-end business
process integrations across Oracle Applications. It also offers
the Foundation Pack which provides a reference architecture
and reusable Web service components that can accelerate your
SOA initiative for EBS integrations.
Conclusion
A service oriented approach for E-Business
Suite integrations offers tremendous advantages over other
traditional EAI approaches. Enterprise integrations can evolve
into reusable and implementation agnostic useful services
by applying very basic principles of flexibility, agility,
and extensibility in all the components of service oriented
integration architecture.
Integrating
E-Business Suite using Enterprise Service Bus
By Jaco Verheul [Mar-08]
Introduction
This document describes a straightforward
integration between E-Business Suite and a custom application.
The integration is built with an Enterprise Service Bus.
This integration is the result of research
done in the Appstech Community in the Netherlands. We wanted
to be able to show out-of-the-box integration scenario’s
in a customers environment. That’s why we defined certain
integration scenario to be developed in a Proof Of Concept.
This document describes one of them.
Integration scenario
Customer data is maintained in the TCA model
in E-Business Suite. A custom application receives the new
customer data. The E-Business Suite environment is the single
source of truth for customer data. See diagram below.

For simplicity we assume a very simple customer
table in the Custom Application. See table below.
Column |
Datatype |
cust_id |
varchar2(20) |
cust_num |
varchar2(20) |
name |
varchar2(100) |
street |
varchar2(100) |
city |
varchar2(30) |
zip |
varchar2(6) |
country |
varchar2(100) |
In the TCA model of E-Business Suite, the
data model is more complex. The information needed for this
integration is stored in the following tables:
· hz_cust_accounts
· hz_parties
· hz_cust_acct_sites_all
· hz_party_sites
· hz_locations
Technical Design Overview
This paragraph describes the way the integration
is built. The integration flow has the following steps:
· The integration utilizes the Business Event System.
After creating a customer account, the event oracle.apps.ar.hz.CustAccount.create
is fired. A Business Event in general only passes key field
values as parameters. In this case, the parameter CUST_ACCOUNT_ID
is most important.
· Because the business event only
passes the ID of the created customer account as an event
parameter, the other customer fields have to be retrieved
to construct a CustomerCreated message. The business event
data has to be enriched. This enrichment could be done in
two ways:
o Let the business event trigger an ESB
flow directly. Inside the ESB flow, query the needed fields
from the e-Business Suite database with the e-Business Suite
adapter or the Database Adapter.
o Create an PL/SQL event subscription for
event oracle.apps.ar.hz.CustAccount.create. This event retrieves
all customer data needed to create the message. The message,
enriched with all the needed fields, is placed on a custom
queue. This enriched message is used to trigger the ESB flow.
In this scenario, more logic is put in PL/SQL.
· Because data from multiple tables
is needed, enriching the event in PL/SQL is most easy. So
an event subscription listens to event CustAccount.create.
Based on the passed in CUST_ACCOUNT_ID, all other needed fields
are retrieved from the e-business tables involved. A message
is placed on a custom queue. This message has exactly the
columns that are needed by receiving application.
· The Advanced Queue Adapter listens
for new messages on the custom queue. The new message is routed
to a Database Adapter that writes the message to the custom
application.
Technical Design Details
This paragraph details the steps from the
previous paragraph and also shows code examples.
Advanced Queue Setup
A custom queue is needed to store the enriched
message. Before creating a queue, the queue message types
has to be created.
Queue message
type:
create or replace type xxjv_customer_t as object ( cust_id varchar2(20), cust_num varchar2(20), name varchar2(100), street varchar2(100), city varchar2(30), zip varchar2(6), country varchar2(100)); Note
the similarity of the object type definition and the customer
table definition of the receiving application.
After creating the message type, a Queue
and Queue table have to be created:
Creation of the queue
table:
dbms_aqadm.create_queue_table(
queue_table => 'xxjv_customers_sqtab',
comment => 'Queue table holding customer data for integration with ESB',
queue_payload_type => 'xxjv_customer_t',
message_grouping => DBMS_AQADM.TRANSACTIONAL,
compatible => '9.2',
primary_instance => 1,
secondary_instance => 2); Creation
of the queue:
dbms_aqadm.create_queue (
queue_name => 'xxjv_customers_new',
queue_table => 'xxjv_customers_sqtab'); After creation, the
queue has to be started as follows:
dbms_aqadm.start_queue ( queue_name => 'xxjv_customers_new',
queue_table => 'xxjv_customers_sqtab'); Event Subscription
Now we have the Custom Queue in place, we
can create an event subscription. We need a PL/SQL function
that is:
· triggered by event oracle.apps.ar.hz.CustAccount.create,
· retrieves all needed information from the TCA tables,
· creates a message of type xxjv_customer_t and
· places this message on queue xxjv_customers_new.
For the source of this PL/SQL function see
Appendix A: Source of Event Subscription
When this function is created, we have to
administer the event subscription in E-Business Suite:
· Login as Workflow Administrator.
· Choose function “Business
Events”.
· Query event oracle.apps.ar.hz.CustAccount.create.
· Click on Subscription. See screen
shot below.
Create a new subscription. Fill the first screen in similar
to the next screen shot.
Only the name of the System will be different.
Press next and fill in the next screen with
exact data from the following screenshot.
You can test the setup so far, by creating
a new Customer Account in e-Business Suite and check whether
a message is placed in the custom queue.
The following code snippet listens for a new message on the
custom queue. This script will wait until a message arrives.
SET SERVEROUTPUT ON;
DECLARE
queue_options DBMS_AQ.DEQUEUE_OPTIONS_T;
message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
message_id RAW(2000);
my_message xxjv_customer_t;
BEGIN
-- queue_options := dbms_aq.dequeue_options_t();
queue_options.navigation:=DBMS_AQ.FIRST_MESSAGE;
DBMS_AQ.DEQUEUE(
queue_name => 'xxjv_customers_new',
dequeue_options => queue_options,
message_properties => message_properties,
payload => my_message,
msgid => message_id );
COMMIT;
DBMS_OUTPUT.PUT_LINE(
'Dequeued cust_id: ' || my_message.cust_id);
DBMS_OUTPUT.PUT_LINE(
'Dequeued cust_num: ' || my_message.cust_num);
DBMS_OUTPUT.PUT_LINE(
'Dequeued zip: ' || my_message.zip);
END;
/
SET SERVEROUTPUT ON;
DECLARE
queue_options DBMS_AQ.DEQUEUE_OPTIONS_T;
message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
message_id RAW(2000);
my_message xxjv_customer_t;
BEGIN
-- queue_options := dbms_aq.dequeue_options_t();
queue_options.navigation:=DBMS_AQ.FIRST_MESSAGE;
DBMS_AQ.DEQUEUE(
queue_name => 'xxjv_customers_new',
dequeue_options => queue_options,
message_properties => message_properties,
payload => my_message,
msgid => message_id );
COMMIT;
DBMS_OUTPUT.PUT_LINE(
'Dequeued cust_id: ' || my_message.cust_id);
DBMS_OUTPUT.PUT_LINE(
'Dequeued cust_num: ' || my_message.cust_num);
DBMS_OUTPUT.PUT_LINE(
'Dequeued zip: ' || my_message.zip);
END;
/
ESB Flow
Now we have the event subscription that
places an enriched message on our custom queue, we can finalize
the integration by creating the ESB flow.
See diagram below:
The flow starts from the left with an Dequeue
operation that reads from the custom queue. In the setup wizard,
you configure the name of the queue to listen on.
See screenshot below.
The Dequeue operation passes the message
to Routing Service CustCreation_RS. This Routing Services
passes the message both to File Adapter CustWriteToFile for
logging purposes and to Database Adapter WriteCustomer.
Conclusion
The integration scenario presented in this
document, is straightforward. The main characteristic is the
enrichment in PL/SQL. When knowledge of both E-Business Suite
and SOA Suite is available, this type of integration can be
built in just a few days.
Appendix A: Source of Event Subscription
Function xx_event_subst reads all needed
customer information, creates a message from it and put the
message on a custom queue, where ESB will do the rest of the
processing.
-- event subscription for oracle.apps.ar.hz.CustAccount.create
-- receives cust_account_id from event
-- reads account and customer information
-- put information on custom queue for esb processing
CREATE OR REPLACE FUNCTION xx_event_subst(
p_subscription_guid IN RAW
,p_event IN OUT NOCOPY wf_event_t)
RETURN VARCHAR2 IS
l_user_name VARCHAR2(100);
l_user_id INTEGER;
cursor c_cust (b_cust_id number) is
SELECT c.cust_account_id cust_id
, p.party_number cust_num
, p.party_name name
, l.address1 street
, l.city
, l.postal_code zip
, l.country
FROM hz_cust_accounts c JOIN hz_parties p ON (c.party_id = p.party_id)
JOIN hz_cust_acct_sites_all ca ON (c.cust_account_id=ca.cust_account_id)
JOIN hz_party_sites ps ON (ca.party_site_id = ps.party_site_id)
JOIN hz_locations l ON (l.location_id = ps.location_id)
WHERE c.cust_account_id = b_cust_id;
r_cust c_cust%rowtype;
l_cust_account_id number;
queue_options DBMS_AQ.ENQUEUE_OPTIONS_T;
message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
message_id RAW(16);
my_message xxjv_customer_t;
BEGIN
l_cust_account_id := p_event.getvalueforparameter('CUST_ACCOUNT_ID');
open c_cust (l_cust_account_id);
fetch c_cust into r_cust;
close c_cust;
my_message := xxjv_customer_t(
r_cust.cust_id,
r_cust.cust_num,
r_cust.name,
r_cust.street,
r_cust.city,
r_cust.zip,
r_cust.country
);
DBMS_AQ.ENQUEUE(
queue_name => 'xxjv_customers_new',
enqueue_options => queue_options,
message_properties => message_properties,
payload => my_message,
msgid => message_id);
RETURN 'SUCCESS';
END;
/
|