Friday, April 27, 2012

Tuesday, April 24, 2012

OSB Alerts Data File Location

So I won't forget it again, OSB alerts are stored in a binary file

./servers/WLS_OSB1/data/store/diagnostics/WLS_DIAGNOSTICS000000.DAT

when it grows big, the OSB console takes long time to show alerts. You need to purge this file periodically.

A Few BPEL Java Embedding Notes

1. Error: SCAC-50012
    check \SCA-INF\classes\scac.log file to find more details.

    Common issues:

    #1.1) check that you added the proper import at the top of .bpel file
     
     for example (right after <:process ...> element, and before partner links   
     <bpelx:exec import="java.util.*"/>
    <bpelx:exec import="java.lang.*"/>
    <bpelx:exec import="java.math.*"/>
    <bpelx:exec import="org.w3c.dom.Element"/>
    <bpelx:exec import="oracle.xml.parser.v2.*"/>   
    <bpelx:exec import="com.foo.bar.*"/>
    <bpelx:exec import="com.collaxa.cube.ws.wsif.providers.java.*"/>

     #1.2) check your syntax carefully. When in doubt, comment out as much as you can.

2. incorparte your own special classes and jars
    create your class jar file, place it under "SCA-INF/lib" folder

3. get/set your variables
    For simple string variables, it's straight forward. If you need to process the XML payloads, use forms like this:
 oracle.xml.parser.v2.XMLElement targetElem =
    (oracle.xml.parser.v2.XMLElement) getVariableData("myVarName", "payload",  "/ns3:foo/ns3:bar/ns3:car");  where "ns3" is defined precisely as it appears at the top of your .bpel file.

you can manipulate this element with functions, here are a few common functions: "getParentNode, getTextContent, cloneNode, setTextContent, insertBefore" etc.

4. if you need to debug, add some log entries using "addAuditTrailEntry".

Monday, April 9, 2012

OSB coherence cache localhost configuration

I have a standard localhost SOA 11.1.1.4 install. I have global result caching enabled (default) and i enabled result caching for my business service. However, the result is not cached.

I have checked coherence configure files under C:\Oracle\Middleware\user_projects\domains\soa_domain\config\osb\coherence, but I couldn't tell what's wrong.

I did some search and this link turned up: http://docs.oracle.com/cd/E17904_01/core.1111/e10106/ha_soa.htm

Here is the section (5.14.9) of the doc I followed to get mine to work:
  1. Log into Oracle WebLogic Server Administration Console. In the Change Center, click Lock & Edit.
  2. In the Domain Structure window, expand the Environment node.
  3. Click Servers. The Summary of Servers page appears.
  4. Click the name of the server (represented as a hyperlink) in the Name column of the table. The settings page for the selected server appears.
  5. Click the Server Start tab.
  6. Enter the following for WLS_OSB1 (on a single line, without a carriage returns):
    -DOSB.coherence.localhost=osbhost1vhn1 -DOSB.coherence.localport=7890 
    -DOSB.coherence.wka1= osbhost1vhn1 -DOSB.coherence.wka1.port=7890 
    -DOSB.coherence.wka2= osbhost2vhn1 -DOSB.coherence.wka1.port=7890
    
Except step 6 is not 100% clear, it should say to put the value into the "arguments" field. See screen shot.

I also adjusted the value for my specific case (by default, my OSB server is "osb_server1"):

-DOSB.coherence.localhost=localhost -DOSB.coherence.localport=7890 -DOSB.coherence.wka1= localhost -DOSB.coherence.wka1.port=7890 -DOSB.coherence.wka2= localhost -DOSB.coherence.wka1.port=7890

After that I restarted OSB server, and it worked.

BTW, you may need to adjust the port#. I think the number should match the config files under your_domain/config/osb/coherence/



Friday, March 23, 2012

OSB: Hooking up Rest Service with XML Payload in Query String


Using OSB to hook up Rest Service is fairly common. There are quite a few articles online talking about how to do it. However, I ran into some particular issues where trying to hook up a Rest Service in OSB. The problem is this service uses query string with XML payload.  I had to jump through many hoops to get it to work. This post shows how I did it.

Assume the example Rest Service URL is “http://myRestServer:7001/sbconsole “ , this service takes a query string variable "information", the payload looks like
<location><searchFlag>Address</searchFlag><streetNumber>200</streetNumber><streetName>Water St</streetName></location>

Test Rest Service Directly


When I use Firefox poster to test the Rest service, it works fine. I can see Firefox sends up:
“GET /sbconsole?information=%3Clocation%3E%3CsearchFlag%3EAddress%3C%2FsearchFlag%3E%3CstreetNumber%3E200%3C%2FstreetNumber%3E%3CstreetName%3EWater%20St%3C%2FstreetName%3E%3C%2Flocation%3E HTTP/1.1
Host: myrestserver:7001”

Please note that the actual query string is URL encoded. As you will see, this will cause a couple of issues with OSB.

Business Service


Proxy Service
If you pay close attention, you will see the only difference is that Firefox encodes “Water St” as “Water%20St”, whereas OSB encodes it as “Water+St”.

To the best of my knowledge, both are supposed to be “correct”. But our test Rest Service runs on IIS, it appears to me that IIS does not filter “+” inside the actual data element.

I couldn’t make OSB to encode space as “%20”. I suspect it goes to the Java API “URLEncoder”. According to the API (http://download.oracle.com/javase/6/docs/api/java/net/URLEncoder.html):
 The space character " " is converted into a plus sign "+".

So I had to ask the Rest Service developer to filter “+” inside the code. That solves this part of the problem.
As a side note: IIS does filter “+” sign between element tags, just not inside the actual element data. I also suspect there may be a way to tweak IIS to filter “+” sign inside the element data. But I don’t know how if it really can work that way.

In order to pass in the query string to Business service, I need to escape the special characters like below:
With proxy service, when I call the Business service, I need to pass in “query-string” in HTTP header. However, if I pass in the payload directly, the Proxy service will encode the query string first. When the business service gets the string, it becomes garbled up, and the call will fail.
In order to pass in th
<http:query-string>information=&lt;location&gt;&lt;searchFlag&gt;{$body/typ:AddressValidatorRequest/typ:location/typ:searchFlag/text()}&lt;/searchFlag&gt;&lt;streetNumber&gt;{$body/typ:AddressValidatorRequest/typ:location/typ:streetNumber/text()}&lt;/streetNumber&gt;&lt;streetName&gt;{$body/typ:AddressValidatorRequest/typ:location/typ:streetName/text()}&lt;/streetName&gt;&lt;/location&gt;</http:query-string>

Conclusion
If there is an option to choose what method to use for the Rest service, my recommendation is to use POST, instead of query string (GET), especially if the Rest Service is expecting an XML payload.
With POST method, data is passed to the server as-is, no URL encoding is involved.
Source code
I don't know how to add attachment, so i'll just post the snippet of the source here:
    <con:pipeline name="PipelinePairNode1_request" type="request" xmlns:con="http://www.bea.com/wli/sb/pipeline/config">
      <con:stage name="stage1">
        <con:context>
          <con1:varNsDecl prefix="typ" namespace="
http://www.lasvegasnevada.gov/GisAddressValidator/types" xmlns:con1="http://www.bea.com/wli/sb/stages/config"/>
        </con:context>
        <con:actions>
          <con:wsCallout xmlns:con="
http://www.bea.com/wli/sb/stages/transform/config">
            <con1:id xmlns:con1="
http://www.bea.com/wli/sb/stages/config">_ActionId-8515072324608930629--ca66017.12fdc6a1a2e.-7fe8</con1:id>
            <con:service ref="myRestTest/restGetBS" xsi:type="ref:BusinessServiceRef" xmlns:ref="
http://www.bea.com/wli/sb/reference"/>
            <con:request>
              <con:payload wrapped="false">$requestBodyContent</con:payload>
            </con:request>
            <con:response>
              <con:payload wrapped="false">responseBodyContent</con:payload>
            </con:response>
            <con:requestTransform>
              <con:transport-headers copy-all="false">
                <con1:id xmlns:con1="
http://www.bea.com/wli/sb/stages/config">_ActionId-8515072324608930629--ca66017.12fdc6a1a2e.-7fe7</con1:id>
                <con:header-set>outbound-request</con:header-set>
              </con:transport-headers>
              <con:insert varName="outbound">
                <con1:id xmlns:con1="
http://www.bea.com/wli/sb/stages/config">_ActionId-8515072324608930629--ca66017.12fdc6a1a2e.-7fe5</con1:id>
                <con:location>
                  <con:xpathText xmlns:con="
http://www.bea.com/wli/sb/stages/config">./ctx:transport/ctx:request</con:xpathText>
                </con:location>
                <con:where>first-child</con:where>
                <con:expr>
                  <con:xqueryText xmlns:con="
http://www.bea.com/wli/sb/stages/config"><![CDATA[<http:query-string>information=&lt;location&gt;&lt;searchFlag&gt;{$body/typ:AddressValidatorRequest/typ:location/typ:searchFlag/text()}&lt;/searchFlag&gt;&lt;streetNumber&gt;{$body/typ:AddressValidatorRequest/typ:location/typ:streetNumber/text()}&lt;/streetNumber&gt;&lt;streetName&gt;{$body/typ:AddressValidatorRequest/typ:location/typ:streetName/text()}&lt;/streetName&gt;&lt;/location&gt;</http:query-string>]]></con:xqueryText>
                </con:expr>
              </con:insert>
            </con:requestTransform>
            <con:responseTransform>
              <con:replace varName="body" contents-only="true">
                <con1:id xmlns:con1="
http://www.bea.com/wli/sb/stages/config">_ActionId-8515072324608930629--ca66017.12fdc6a1a2e.-7fe4</con1:id>
                <con:location>
                  <con:xpathText xmlns:con="
http://www.bea.com/wli/sb/stages/config">.</con:xpathText>
                </con:location>
                <con:expr>
                  <con:xqueryText xmlns:con="
http://www.bea.com/wli/sb/stages/config">$responseBodyContent</con:xqueryText>
                </con:expr>
              </con:replace>
            </con:responseTransform>
          </con:wsCallout>
        </con:actions>
      </con:stage>
    </con:pipeline>
Tcpdump
In case you wonder how I captured my tcp packet, here is my sample command
/usr/sbin/tcpdump src 10.128.8.108 or dst 10.128.8.108 -nnvvXSs 1514 -w dump.cap

Eclipse error: Failed to load the JNI shared library VM.dll

I have managed to install OSB 11.1.1.4 with OEPE 11.1.1.6 (oepe-helios-all-in-one-11.1.1.6.1.201010012100-win32) on Win7 64-bit.

My default JDK is 64-bti. When I try to fire up Eclipse, i am getting "Eclipse error: Failed to load the JNI shared library ... vm.dll".

The solution is to download JDK 32-bit and update eclipse.ini to point to the 32-bit JDK. This is my .ini setting:
-startup
plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.1.R36x_v20100810
-showsplash
org.eclipse.platform
--launcher.defaultAction
openFile
-vm
c:\progra~2\java\jdk1.6.0_27\bin\javaw.exe
-vmargs
-Xms256m
-Xmx768m
-XX:MaxPermSize=256m
-Dsun.lang.ClassLoader.allowArraySyntax=true
-Dweblogic.home=C:\Oracle\Middleware\wlserver_10.3
-Dharvester.home=C:\Oracle\Middleware\Oracle_OSB1\harvester
-Dosb.home=C:\Oracle\Middleware\Oracle_OSB1
-Dosgi.bundlefile.limit=750
-Dosgi.nl=en_US

Tuesday, March 20, 2012

default Oracle database web console URL is https://localhost:1158/em

If you installed Oracle (standard version) locally, the default port and URL for the web console is: https://localhost:1158/em

Remember you need to start the db console servervice

On Windows: default service name is "OracleDBConsoleorcl"
On Linux: emctl start dbconsole , my path is here "/opt/app/oracle/product/11.2.0/dbhome_1/bin/emctl", yours maybe different.

BTW, default Oracle XE web console URL is "http://127.0.0.1:8080/apex"