Featured Posts

books, soa

Book review : Oracle SOA Suite Developer's Guide

Oracle SOA Suite Developer’s Guide

Finally i had some spare time to read this nice book!
It’s real bookshelf filler with 621 pages.

The book already got released before fusion 11g went live, but it was still nice to get some more information about the ‘old’ soa-suite stack.
Over at IT-eye we did quiet some soa implementations with the Oracle stack, so i already had good background on the information discussed in the book.
What i particularly was interested in was the best practices of others on the different components of the soa suite. When we start a project at IT-eye we have a default set of best practices and ways to go on how to implement certain functionality.
Matt Wright and Antony Reynolds gave a good overview of how to use the different components and what Oracles/their best use was for them.

Oracle also provides the Oracle SOA Suite Developer’s Guide as free guide on this internet, but this book discusses a lot of extra/advanced topics on the soa suite.
So i would recommend to read both to learn more and more about all the ins and outs of the soa suite. Since it delivers a lot of components in the stack, these 2 will give you a lot of good information.

Let’s go on with the book.

The book starts with a few topics with some basic information about the soa suite, the standards/frameworks which are used.
After that the components of the stack are getting discussed, writing your first bpel, implementing human workflow, adding bussines rules and building bam dashboards.

For starters the way to go. Get your hands dirty and just try to develop everything which is discussed in the book.
The authors explain it all real well, so it’s good step by step manual to get a feeling with all what the soa suite provides us.

Besides the real technical topics it gives some good information about the design concepts to implement (service enable existing systems, how too loosely couple services, design service contracts, good explanation about xsd schemas/wsdl and how to construct them).

To bring all of these topics in practise they added a use case called oBay. This one will be used in the whole book to implement all the functionality of the stack.
From developing the basics, adding rules, secure service invocations till testing and deployment, all will be reviewed.

And i was very pleased to see they even added the ‘new’ Oracle Service Bus (OSB) as subject of discussion to the book. They didn’t just added a topic for it, but after discussing every component in the soa suite stack, they added some extra information on how to implement this in the Oracle Service Bus. Sort of one on one compair to see what functionality is available in the new bus, good one!

Conclusion

I would really recommend this book to anyone who’s starting or already busy with the Oracle SOA Suite. The book discusses the 10g soa suite stack, but part of the components will be available as is, in the new fusion 11g stack. For example the implementation of Oracle Webservice Manager will be different.
Although there is a lot of information to read, it’s still all that well written it won’t take ages to finish it. The authors explain all very well by using good screengrabs and examples, so what i would recommend is to start up the soa suite, and get the hands on experience pon the topics the authors try to inform you about.

Book details

Contens

Section 1 Getting Started

  • Chapter 1: Introduction to Oracle SOA Suite: An initial introduction to the Oracle SOA Suite and its various components.
  • Chapter 2: Writing your first service: A hands-on introduction to the core components of the Oracle SOA Suite, namely the Oracle BPEL Process Manager and the Oracle Service Bus.
  • Chapter 3: Service-enabling existing systems: Looks at a number of key technology adapters and how we can use them to service-enable existing systems.
  • Chapter 4: Loosely coupling services: Describes how we can use the Oracle Service Bus to build services that are implementation-agnostic.
  • Chapter 5: Building composite services and business processes: Covers how to use BPEL to assemble services to build composite services and long-running business process.
  • Chapter 6: Adding in human workflow: This chapter looks at how human tasks can be managed through workflow activities embedded within a BPEL process.
  • Chapter 7: Using business rules to define decision points: This chapter introduces business rules and how we can use them to externalize “decision points” in a BPEL process.
  • Chapter 8: Building real-time dashboards: This chapter looks at how Business Activity Monitoring (BAM) can be used to give business users a real-time view into how business processes are performing.

Section 2 Putting it all together

  • Chapter 9: oBay introduction: Provides a blueprint for our SOA architecture, highlighting some of the key design considerations and describing how they fit our architecture for oBay.
  • Chapter 10: Designing the service contract: Gives guidance on how to design XML schemas and service contracts for improved agility, reuse, and interoperability.
  • Chapter 11: Building business services: Examines different approaches for building new business services either from scratch or by re-using existing logic.
  • Chapter 12: Building validation into services: Examines how we can implement validation within a service using XSD validation, Schematron, and Business Rules.
  • Chapter 13: Error handling: This chapter examines strategies for handling system and business errors, with detailed coverage of the BPEL Fault Management Framework.
  • Chapter 14: Message interaction patterns: Covers complex messaging interactions, including multiple requests and responses, timeouts, and message correlation (both system and business).
  • Chapter 15: Workflow patterns: Looks at how to implement workflows involving complex chains of approval and how to use the Workflow Service API.
  • Chapter 16: Using business rules to implement services: Here we look at the Rules engine‚Äôs inferencing capabilities, and how we can use them to implement types of business services.
  • Chapter 17: The importance of bindings: Looks at the protocols available in addition to SOAP over HTTP for invoking web services and the advantages they provide.

Section 3 Other considerations

  • Chapter 18: Packaging and deployment: Examines how to package up a SOA application for deployment into environments such as test and production.
  • Chapter 19: Testing composite applications: Looks at how to create, deploy, and run test cases that automate the testing of composite applications.
  • Chapter 20: Defining security and management policies: Details how to use Web Service Manager to secure and administer SOA applications.

You can order the book at Packt
Original blog

oracle aq, osb

Oracle Service Bus, publish small/big messages to Oracle AQ endpoint

The weird thing was for certain responses i couldn’t find the payload back when i queried the aq table in the database.

select qt.user_data.text_vc
,      qt.user_data.text_lob
from my_aq_table qt

The process just completed succesfull in osb, but the payload wasn’t there (well it looked like it wasn’t there).

queue_table_select

When publishing big payloads to an Oracle AQ endpoint, Oracle (db) will decide weither the payload will get stored either as text-value or clob-value.
Messages smaller then 4k will get inserted as text, messages bigger then 4k will get inserted as clob.

When you’ve stored a object type in the user_data column you can cast it with something like

select treat(qt.user_data as <my_object_type>).<my field in the object_type>
from my_aq_table qt

osb

Oracle Service Bus, jms request/response, response doesn't arrive

This week i was trying to make my proxyservice working in osb which was based on a jms transport, nothing fancy.
Just a normal request/response messageflow and the response needed to be published on a different queue.proxyservice

After testing the flow from the console all worked fine, request pipeline completed, response pipeline completed, but no messages in the response queue.
Looking at the definition of the proxyservice, we will notice the correlation pattern will make use of the JMSCorrelationID.
Since i use the easy way of testing (and this proved this isn’t the best way) by using the testconsole of the proxyservice, the jms properties will never be set.
To check this look in the invocation trace for ‘receiving request > $inbound’. In here we should see the values. Since they won’t be set the osb can’t correlate the response back and so the response will never be published to the queue.

From now on we will add a ‘publish’ folder to every osb project to fill our resources in a ‘real scenario’ way. It’s folder for all the testing resources.
In my case i just needed a simple business service with jms transport which would add a test-message on ‘queue_to_listen_on’.
Like this i can just trigger the process in the way it should happen, and others can re-use the testingtools.

Lets test with the businessservice, send a message to the queue. In the proxyservice i will log the inbound to see if the jms properties are set.

<bea-000000> < [Pipeline_Request, Pipeline_Request_request, stage1, REQUEST] !!! debug, logging inbound variable !!!:
<con:endpoint name="ProxyService$your_project$services$proxy$your_proxyservice" xmlns:con="http://www.bea.com/wli/sb/context">
  <con:service/>
  <con:transport>
    <con:uri>jms://queue_to_listen_on</con:uri>
    <con:mode>request-response</con:mode>
    <con:qualityOfService>best-effort</con:qualityOfService>
    <con:request xsi:type="jms:JmsRequestMetaData" xmlns:jms="http://www.bea.com/wli/sb/transports/jms" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <tran:headers xsi:type="jms:JmsRequestHeaders" xmlns:tran="http://www.bea.com/wli/sb/transports">
        <tran:user-header name="JMS_OracleDelay" value="0"/>
        <tran:user-header name="JMS_OracleDeliveryMode" value="2"/>
        <tran:user-header name="JMSXState" value="0"/>
        <tran:user-header name="JMSXRecvTimestamp" value="1249544253835"/>
        <tran:user-header name="JMS_OracleTimestamp" value="1249544242855"/>
        <jms:JMSDeliveryMode>2</jms:JMSDeliveryMode>
        <jms:JMSExpiration>0</jms:JMSExpiration>
        <jms:JMSMessageID>ID:707430ACF0811C4CE044000000000000</jms:JMSMessageID>
        <jms:JMSPriority>4</jms:JMSPriority>
        <jms:JMSRedelivered>false</jms:JMSRedelivered>
        <jms:JMSTimestamp>1249544242855</jms:JMSTimestamp>
        <jms:JMSXDeliveryCount>1</jms:JMSXDeliveryCount>
        <jms:JMSXUserID>mdsplus</jms:JMSXUserID>
      </tran:headers>

Now we see the jms properties are set.

Lessons learned
Either put messages on the queue by use of the wls console, hermes or by using a dedicated business service. In these cases jms properties will be set and the correlation will succeed.

Original blog

weblogic

Weblogic, side-by-side deployment

Weblogic Server supports a nice feature called side-by-side deployment (or versioned deployment). This function is extremely usefull when you need to deploy a new version of an application and still keep the old one up and running. So the running instances will still use the current version and all new instances will be able to invoke the new deployed version of the application.
As soon as all the sessions who’re using the old version of the application are expired, Weblogic will recognize it and will deactivate the old version. So at this moment only the new deployed version is active and all new sessions will make us of it.

So how does this work.

You could either use wlst to deploy the application and specifiy the versionnumber on deployment as one of the parameters or you can use the manifest.mf file. We’ll be using the last one.

  1. Create a webservice project
  2. Edit to manifest file located in WebContent > META-INF and add the next on a new row : ‘WebLogic-Application-Version: v1’
    manifest
  3. Package the service and deploy it in the console

Deployment

  1. Go to the Weblogic Console > Deployments. Click ‘Lock & Edit’ and in the deployments part click Install
  2. Select the just created archive
    install-1
  3. Install this deployment as an application
  4. Optional Settings. And in here we will see the ‘Archive Version’ of our application. Change the name to ‘MyService’ and leave the rest on default value
    install-2

If you look in the list of deployments we will see our application is labeled with a version indication (v1).
deployment1
The current version is still active.

Now create a new version of the application and change the v1 in the manifest file to v2, and package it.

Update Deployment

  1. Go to the Weblogic Console > Deployments. Click ‘Lock & Edit’, select the application we want to update (MyService) and in the deployments part click Update
  2. Click Change Path of the source path and select the just created archive (v2), the application will be deployed as version v2

If we now look in the list of deployments, we will see 2 versions of our application deployed.
deployment2

Version v1 gets status ‘Retired’ and the new version v2 will get status ‘Active’.

Running instances
We have the next scenarios

  1. Version v1 is deployed. Deploy version v2. The new version v2 will get status ‘Active’ and the old version v1 will get status ‘Retired’.
    Since there aren’t any open sessions Weblogic will recognize this and changed the status of the version v1
  2. Version v1 is deployed and has open sessions. Deploy version v2. The new version v2 will get status ‘Active’ and the old version v1 will stay on status ‘Active’ untill all sessions to it will be closes. After that, Weblogic will change the status to ‘Retired’ and the only ‘Active’ version will be v2

Resources
http://edocs.bea.com/wls/docs100/deployment/redeploy.html#wp1020276
http://weblogic.sys-con.com/node/185310

Original blog

fusion11g

Oracle Fusion 11g links overview

A short overview of the resources i mostly use when developing fusion11g applications.
Since i’m always googling and googling to find the correct document, just a short list as reminder for myself.

Oracle JDeveloper 11g Tutorials
Oracle Fusion Middleware Documentation Library
Oracle Fusion Middleware Administrator’s Guide 11g Release 1 (11.1.1)
Oracle Fusion Middleware Installation Guide for Oracle SOA Suite 11g Release 1 (11.1.1)
Oracle Fusion Middleware Administrator’s Guide for Oracle SOA Suite 11g Release 1 (11.1.1)
Oracle Fusion Middleware Security Guide Release 1 (11.1.1)
Oracle Fusion Middleware Tutorial for Running and Building an Application with Oracle SOA Suite 11g Release 1 (11.1.1)
Oracle Fusion Middleware Developer’s Guide for Oracle SOA Suite 11g Release 1 (11.1.1)
Oracle Fusion Middleware Fusion Developer’s Guide for Oracle Application Development Framework 11g Release 1 (11.1.1)
Oracle Fusion Middleware 11gR1 Software Downloads
Oracle Fusion Order Demo Application
Deploying a JDeveloper SOA Application to Oracle WebLogic Server 11g

ORACLE SOA SUITE
Installation Guide
Quick Installation Guide
Upgrade Guide for Oracle SOA Suite, Oracle WebCenter, and Oracle ADF
Getting Started
Tutorial for Running and Building an Application
Developer’s Guide
Administrator’s Guide

ORACLE ADAPTERS
User’s Guide for Technology Adapters
User’s Guide for Oracle Applications

Oracle By Example (OBE)
Virtual Book : SOA Tasks
Oracle Sample Code
Check the blog of Marc for the overview of all the samplecode listed per product

FORUMS
SOA Suite
BPEL
Application Server (wls oc4j)
JDeveloper and ADF

I’ll update the list when i come by other usefull links

Original blog

osb

Oracle Service Bus, BEA-423405, java.lang.NullPointerException

When trying to browse the java libs from my osb project i get the next stacktrace in the console.

<BEA-423405> <An exception [null] was thrown while rendering the content at [/jsp/resources/archive/ArchiveBrowser.jsp].
java.lang.NullPointerException
        at jsp_servlet._jsp._resources._archive.__archivebrowserdetails._jspService(__archivebrowserdetails.java:101)
        at weblogic.servlet.jsp.JspBase.service(JspBase.java:35)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
        at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:27)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
        at org.apache.beehive.netui.pageflow.PageFlowPageFilter.continueChainNoWrapper(PageFlowPageFilter.java:456)
        at org.apache.beehive.netui.pageflow.PageFlowPageFilter.runPage(PageFlowPageFilter.java:432)
        at org.apache.beehive.netui.pageflow.PageFlowPageFilter.doFilter(PageFlowPageFilter.java:284)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
        at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:503)
        at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:432)
        at weblogic.servlet.jsp.PageContextImpl.include(PageContextImpl.java:164)
        at jsp_servlet._jsp._resources._archive.__archivebrowser._jspService(__archivebrowser.java:978)
        at weblogic.servlet.jsp.JspBase.service(JspBase.java:35)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
        at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:27)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
        at org.apache.beehive.netui.pageflow.PageFlowPageFilter.continueChainNoWrapper(PageFlowPageFilter.java:456)
        at org.apache.beehive.netui.pageflow.PageFlowPageFilter.runPage(PageFlowPageFilter.java:432)
        at org.apache.beehive.netui.pageflow.PageFlowPageFilter.doFilter(PageFlowPageFilter.java:284)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:43)
        at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:503)
        at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:432)
        at org.apache.beehive.netui.pageflow.scoping.internal.ScopedRequestDispatcher.include(ScopedRequestDispatcher.java:119)
        at com.bea.netuix.servlets.controls.content.JspContent.beginRender(JspContent.java:552)
        at com.bea.netuix.servlets.controls.content.NetuiContent.beginRender(NetuiContent.java:365)
        at com.bea.netuix.nf.ControlLifecycle$7.visit(ControlLifecycle.java:485)
        at com.bea.netuix.nf.ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:518)
        at com.bea.netuix.nf.ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
        at com.bea.netuix.nf.ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
        at com.bea.netuix.nf.ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
        at com.bea.netuix.nf.ControlTreeWalker.walk(ControlTreeWalker.java:220)
        at com.bea.netuix.nf.Lifecycle.processLifecycles(Lifecycle.java:395)
        at com.bea.netuix.nf.Lifecycle.processLifecycles(Lifecycle.java:361)
        at com.bea.netuix.nf.Lifecycle.processLifecycles(Lifecycle.java:352)
        at com.bea.netuix.nf.Lifecycle.run(Lifecycle.java:326)
        at com.bea.netuix.nf.UIControl.render(UIControl.java:583)
        at com.bea.netuix.servlets.controls.PresentationContext.render(PresentationContext.java:486)
        at com.bea.netuix.servlets.util.RenderToolkit.renderChild(RenderToolkit.java:146)
        at com.bea.netuix.servlets.jsp.taglib.RenderChild.doStartTag(RenderChild.java:62)
        at jsp_servlet._framework._skeletons._wliconsole.__flowlayout._jspService(__flowlayout.java:273)
        at weblogic.servlet.jsp.JspBase.service(JspBase.java:35)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:176)
        at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:505)
        at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:432)
        at com.bea.netuix.servlets.controls.application.laf.JspTools.renderJsp(JspTools.java:132)
        at com.bea.netuix.servlets.controls.application.laf.JspControlRenderer.beginRender(JspControlRenderer.java:72)
        at com.bea.netuix.servlets.controls.application.laf.PresentationControlRenderer.beginRender(PresentationControlRenderer.java:65)
        at com.bea.netuix.nf.ControlLifecycle$7.visit(ControlLifecycle.java:481)
        at com.bea.netuix.nf.ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:518)
        at com.bea.netuix.nf.ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
        at com.bea.netuix.nf.ControlTreeWalker.walk(ControlTreeWalker.java:220)
...

Make sure the rights in unix on the osb domain directory are correctly set on group stage.
In my case only the user had the correct rights.

** update
We noticed the problem came back on our development enviroment, without things got changed on filesystem.
One of the dba thought it had something to do with the caching weblogic creates during clicking around in the console.
Restarting the admin server (restarting the managed servers wasn’t needed) fixed the problem for us, and cleared the cache too.

Original blog

osb

Oracle Service Bus, testing proxy services with Direct Calls

Today i stumbled on one of the features which is available on the testconsole page of a proxyservice.
I was testing some flows in the Oracle Service Bus which made use of a XAConnectionFactory.
The process made use of a proxyservice which gets a message out of a jmsqueue, routes it to an other businessservice, which eventually would put it back on some other queue.

When the process was getting triggered by some other eai component which puts a message in the queue the process would eventually fail.
But when i would try to replicate the problem and test the process from the beginning by using the testconsole on the proxyservice, the process would just complete without errors.

After a close look on the testconsole we see some extra options in the test configuration
testconsole

Direct Call and Include Tracing.

Direct Call

When we dive into the guides we will find the next information.

“Testing proxy services with the direct call option enabled bypasses some important security steps (authentication/authorization), including access control. Oracle recommends that you not use the test service in production systems.

A direct call is used to test a proxy service that is collocated in the Oracle Service Bus domain. Using the direct call option, messages are sent directly to the proxy service, bypassing the transport layer. When you employ the direct call option, tracing is turned on by default, allowing you to diagnose and troubleshoot a message flow in the test console. By default, testing of proxy services is done using the direct call option.

When you use the direct call option to test a proxy service, the configuration data you input to the test console must be that which is expected by the proxy service from the client that invokes it. In other words, the test console plays the role of the client invoking the proxy service. Also, when you do direct call testing, you bypass the monitoring framework for the message. “

directcall

This illustrates a direct call. Note that the message bypasses the transport layer it is delivered directly to the proxy service (P1).

In my case i was testing a proxyservice which made use of jms transport and xaconnectionfactories.
The direct call would skip the transport layer and would not force the xa transaction.
This XA transaction was eventually the problem for my situation. One of the contributers on the xa transaction (custom oracle aq adapter) was for some reason messing up the transaction.
Since i don’t want to change anything on this adapter, i just skip the enforcing of the xa on this message flow.

So be sure when testing the flow and you really want to replicate the original situation (so use the original designed transport mechanismes), to put off the ‘Direct Call’ option.

Resources

http://download.oracle.com/docs/cd/E13159_01/osb/docs10gr3/transportsdk/developing.html (Co-Located Calls)
http://download.oracle.com/docs/cd/E13159_01/osb/docs10gr3/userguide/testing.html (Testing Proxy Services)
Thread: OSB 10gR3: Handling response received from a proxy service

Original blog

osb

Oracle Service Bus, MFL and empty element-tree in xquery

Sometimes it will happen after creating the mfl and trying to map the elements in xquery to the target, the element-tree of the mfl won’t be visible and only shows the head-element.
Open the mfl file in a text-editor and change the version-attribute of the MessageFormat-tag to ‘2.02’

<messageFormat name='MyMFLFormat' version='2.01'>

to

<messageFormat name='MyMFLFormat' version='2.02'>

Original blog

osb

Oracle Service Bus, xquery and optional parameters

We use custom soap headers to implement end-to-end tracking over all eai components.
Those headers will get updated during transport over all components and will also get logged to the db, together with some other metadata.
That info will be used to track and trace messages and problems.

A soap-envelope will look like this :

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <slg:CustomHeader xmlns:slg="http://www.it.eye.nl/services/CustomHeader">
      <slg:CorrelationId>3253252er5235432</slg:CorrelationId>
      <slg:MessageType>iDOC</slg:MessageType>
      <slg:TimeStamp>2001-12-17T09:30:47Z</slg:TimeStamp>
      <slg:Status>OK</slg:Status>
      <slg:Direction/>
    </slg:CustomHeader>
  </soap:Header>
  <soap:Body>
    <!-- over here the body payload -->
  </soap:Body>
</soap:Envelope>

Some fields in the payload can be nullable.
When we create an xquery to transform this header to our EventObject-variable we can either create the xquery with one parameter which holds the whole ‘CustomHeader’ payload, or just map the parameters we need.

  1. declare function xf:Header2EventObject($customHeader1 as element(ns1:CustomHeader))
  2. declare function xf:Header2EventObject($corId as xs:string, $MessageType as xs:string, $Status as xs:string)
  1. When we use the payload described in the example, the assign will work. Only problem is we need to assign the whole CustomHeader-element as parameter.
    When we need to data out of the body-payload which could get huge, we would need to assign this whole payload just to get a few values out of it.
  2. We only assign the values we need, but when the xquery results in an empty node the assign will fail.
    <con:fault    xmlns:con="http://www.bea.com/wli/sb/context">
      <con:errorCode>BEA-382510</con:errorCode>
      <con:reason>
      OSB Assign action failed updating variable "eventObject": com.bea.wli.common.xquery.XQueryException: Error parsing XML: {err}FORG0005: expected exactly one item, got 0 items
      </con:reason>
      <con:location>
      <con:node>PipelinePairNode1</con:node>
      <con:pipeline>PipelinePairNode1_request</con:pipeline>
      <con:stage>stage1</con:stage>
      <con:path>request-pipeline</con:path>
      </con:location>
      </con:fault>
    

And the solution i was looking for (thanks to a colleague)
I need to be able to setup the parameters of the xquery as optional, like this i don’t need to evaluate every parameter in the xquery and can just pass the result of the xquery which is used for every parameter of the xquery.

http://www.w3.org/TR/xquery/
“attribute()? refers to an optional attribute node”

The xquery function will then look like

declare function xf:test1($corId as xs:string?,
    $MessageType as xs:string?,
    $Status as xs:string)
    as element(ns0:EventObject) {
        <ns0:EventObject>
            <ns0:Logging>
                <ns0:CorId>{ $corId }</ns0:CorId>
                <ns0:MesType>{ $MessageType }</ns0:MesType>
                <ns0:Status>{ $Status }</ns0:Status>
            </ns0:Logging>
        </ns0:EventObject>
};

See the definition of the $corId and $MessageType, now they can be null!

Original blog

fusion11g, oracle, soa

Oracle Fusion 11g, my first impressions

Last i finished the last day of the 3day Oracle Fusion 11g workshop.
And i must say…i’m pretty impressed by the new stack Oracle presented.

For development during the workshop i used my own vmware of fusion 11g on Centos.
And it’s a real killer when all components of the suite are up and running, my laptop had a tuff time.

During the workshop we used the famous ‘Order processing’ tutorial to get in touch with the components of the fusion 11g.
A short overview of what we have been discussing and developing

  • SCA Components wiring bpel and human tasks together and exposing them as soap services
  • Using the mediator for transformation between the SCA components
  • Orchestrating a few bpels to execute human tasks and update payload
  • Adding Business Rules
  • Handling Business Events using EDN
  • Creating BAM dashboards and using BAM adapter/sensors to push data
  • Integration with Oracle B2B
  • Virtualize services on Oracle Service Bus (OSB)
  • Web services policy enforcement
  • Managing the lifecycle of a SOA composite application
  • Unit Testing
  • New Fault Handling framework (mediator and bpel)
  • Using Service Data Objects (SDO)

My first thoughts

SCA modelings looks good, composite application development in JDeveloper works like a charm.
Business rules development got new gui, way better then the old one.
BAM dashboards look really good, customers will love those.
EDN framework, event based architectures, nice!
ADF BPEL Worklist, finally an easy way to design your own worklist gui.
Mediator is the old OESB, now it’s used for the wire in the composite applications and subscription on events
New console looks good, all integrated and good support for End 2 End tracking
Fault Policy framework from 10.1.3.4 now works for both BPEL and Mediator

A few impressions

To find out about all the other new functionality, install it and go play with it!

Original blog

Page 8 of 10« First...678910