Thursday, 26 November 2015

oracle olite, old bpel and SOA and the database that would not shrink

wow, this was a beauty.

I've been fighting it for some time now.

I have an old oracle lite database that houses the internals for a BPEL install.  the database is orabpel.odb and exists in D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite.

This was used for an integration project that uses EXCEL to call BSSV WS via BPEL PM.  Pretty cool hey.  BPEL PM might have been over kill, but it was nice and neat!  This has been working for about 5 years, and the client called me and told me it was broken...  Oh dear...

The orabpel database was 4GB!

I cannot do anything with it.

I learned how to connect to the database, this is all done through the magic of polite.ini and
[All Databases]
DatabaseID=1735
DataDirectory=D:\product\10.1.3.1\OracleAS_1\Mobile\Sdk\OLDB40
NLS_LOCALE=ENGLISH
NLS_LANGUAGE=ENGLISH
MessageFile=D:\product\10.1.3.1\OracleAS_1\Mobile\Sdk\BIN\olite40.msb
DB_CHAR_ENCODING=UTF8
DATABASE_ID=503
#DATA_DIRECTORY=D:\temp\10.1.3.1\OraBPEL_4\Mobile\Sdk\oldb40
#MESSAGE_FILE=D:\temp\10.1.3.1\OraBPEL_4\Mobile\Sdk\BIN\OLITE40.MSB

And odbc.ini (of course)
[ODBC 32 bit Data Sources]
orabpel=Oracle Lite 40 ODBC Driver (32 bit)
WEBTOGO=Oracle Lite 40 ODBC Driver (32 bit)
POLITE=Oracle Lite 40 ODBC Driver (32 bit)
oraesb=Oracle Lite 40 ODBC Driver (32 bit)
orawsm=Oracle Lite 40 ODBC Driver (32 bit)
shannon=Oracle Lite 40 ODBC Driver (Client) (32 bit)
[POLITE]
Driver32=D:\temp\10.1.3.1\OraBPEL_4\Mobile\Sdk\BIN\olod2040.dll
Description=Oracle Lite 40 Data Source
DataDirectory=D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite
Database=POLITE
IsolationLevel=Read Committed
Autocommit=Off
CursorType=Static
[WEBTOGO]
Driver32=D:\temp\10.1.3.1\OraBPEL_4\Mobile\Sdk\BIN\olod2040.dll
Description=Oracle Lite 40 Data Source
DataDirectory=D:\temp\10.1.3.1\OraBPEL_4\Mobile\Sdk\oldb40
Database=WEBTOGO
IsolationLevel=Read Committed
Autocommit=Off
CursorType=Static
[oraesb]
Driver32=D:\product\10.1.3.1\OracleAS_1\Mobile\Sdk\BIN\olod2040.dll
Description=Oracle Lite 40 Data Source
IsolationLevel=Read Committed
Database=oraesb
Autocommit=Off
CursorType=Static
DataDirectory=D:\product\10.1.3.1\OracleAS_1\Mobile\Sdk\OLDB40
[orabpel]
Driver32=D:\temp\10.1.3.1\OraBPEL_4\Mobile\Sdk\bin\olod2040.dll
Description=Oracle Lite 40 Data Source
DataDirectory=D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite
Database=orabpel
IsolationLevel=Repeatable Read
Autocommit=Off
CursorType=Static
[orawsm]
Driver32=D:/product/10.1.3.1/OracleAS_1/Mobile/Sdk/BIN/olod2040.dll
Description=Oracle Lite 40 Data Source
DataDirectory=D:/product/10.1.3.1/OracleAS_1/Mobile/Sdk/OLDB40
Database=orawsm
IsolationLevel=Read Committed
Autocommit=Off
CursorType=Static
[shannon]
Driver32=D:\product\10.1.3.1\OracleAS_1\Mobile\Sdk\BIN\olcl2040.dll
Description=shannon
ServerHostName=localhost
ServerPortNumber=1531
ServerDSN=
DataDirectory=D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite
Database=orabpel.odb
IsolationLevel=Read Committed
Autocommit=Off
CursorType=Forward Only


These two files contain the pointers that BPEL is going to talk to when looking for the internal configuration.

Querying the data was difficult, but finally I used:

Yes, that is the password out of the box, you do not get an option to set it on the standard install.

Cool, we can log in and see that there is 72 tables, 3 are huge, actually about 5.  WORK_ITEM is the worst, but CUBE_SCOPE and CUBE_INSTANCE are terrible.

I cannot drop and of the tables...  I get "out of memory"
[POL-2000] can't allocate more memory

I cannot alter table drop column.
[POL-2000] can't allocate more memory

I cannot truncate.
[POL-2000] can't allocate more memory

I can delete rows, but he commit takes about 1 hour.

I have to create "create table" statements from describe results if I want to create the tables again.

Wow, I'm in a pickle.

I installed another BPEL server with the same software and got a copy of the tables empty - this was very helpful.  Note that when BPEL started, this is when it seemed to create all of the tables - weird.

I then used a series of commands to move data from valid tables (like SUITCASE_BIN) to the empty copy of orabpel.odb.

WFROUTINGSLIP olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFROUTINGSLIP  > d:\temp\WFROUTINGSLIP.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFROUTINGSLIP  < d:\temp\WFROUTINGSLIP.dmp
WFNOTIFICATION olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFNOTIFICATION  > d:\temp\WFNOTIFICATION.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFNOTIFICATION  < d:\temp\WFNOTIFICATION.dmp
WFATTRIBUTELABELUSAGE olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFATTRIBUTELABELUSAGE  > d:\temp\WFATTRIBUTELABELUSAGE.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFATTRIBUTELABELUSAGE  < d:\temp\WFATTRIBUTELABELUSAGE.dmp
WFUSERVACATION olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFUSERVACATION  > d:\temp\WFUSERVACATION.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFUSERVACATION  < d:\temp\WFUSERVACATION.dmp
WFUSERTASKVIEW olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFUSERTASKVIEW  > d:\temp\WFUSERTASKVIEW.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFUSERTASKVIEW  < d:\temp\WFUSERTASKVIEW.dmp
WFUSERTASKVIEWGRANT olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFUSERTASKVIEWGRANT  > d:\temp\WFUSERTASKVIEWGRANT.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFUSERTASKVIEWGRANT  < d:\temp\WFUSERTASKVIEWGRANT.dmp
WFUSERPREFERENCE olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFUSERPREFERENCE  > d:\temp\WFUSERPREFERENCE.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFUSERPREFERENCE  < d:\temp\WFUSERPREFERENCE.dmp
VERSION olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb VERSION  > d:\temp\VERSION.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb VERSION  < d:\temp\VERSION.dmp
WFTASKMETADATA olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFTASKMETADATA  > d:\temp\WFTASKMETADATA.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFTASKMETADATA  < d:\temp\WFTASKMETADATA.dmp
WFTASKDISPLAY olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFTASKDISPLAY  > d:\temp\WFTASKDISPLAY.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFTASKDISPLAY  < d:\temp\WFTASKDISPLAY.dmp
WFTASKTIMER olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFTASKTIMER  > d:\temp\WFTASKTIMER.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFTASKTIMER  < d:\temp\WFTASKTIMER.dmp
WFNOTIFICATIONMESSAGES olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WFNOTIFICATIONMESSAGES  > d:\temp\WFNOTIFICATIONMESSAGES.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WFNOTIFICATIONMESSAGES  < d:\temp\WFNOTIFICATIONMESSAGES.dmp
CI_INDEXES olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb CI_INDEXES  > d:\temp\CI_INDEXES.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb CI_INDEXES  < d:\temp\CI_INDEXES.dmp
SCOPE_ACTIVATION olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb SCOPE_ACTIVATION  > d:\temp\SCOPE_ACTIVATION.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb SCOPE_ACTIVATION  < d:\temp\SCOPE_ACTIVATION.dmp
WI_EXCEPTION olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb WI_EXCEPTION  > d:\temp\WI_EXCEPTION.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb WI_EXCEPTION  < d:\temp\WI_EXCEPTION.dmp
XML_DOCUMENT olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb XML_DOCUMENT  > d:\temp\XML_DOCUMENT.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb XML_DOCUMENT  < d:\temp\XML_DOCUMENT.dmp
SYNC_TRAIL olload -dump D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel.odb SYNC_TRAIL  > d:\temp\SYNC_TRAIL.dmp olload -load D:\product\10.1.3.1\OracleAS_1\bpel\system\database\olite\orabpel_works.odb SYNC_TRAIL  < d:\temp\SYNC_TRAIL.dmp

Above are the dump and load commands for each of the tables, I generated these with a excel formula and pasted them into the command window.  this gave me a base copy with my BPEL processes, but not the instance history.

Note that I was unable to delete the history too, as the DB would not process this from the BPEL console.

I tried about 10000 other things before I got this to work.  I had the defragdb.exe fail every time, so this would not get me any space back.  
The following error has occurred:
DBException: [POL-2403] value too large for column


The following error has occurred:
DBException: [POL-3261] there are too many transactions




Note that it was failing for all of the above, which was also painful.  I actually think that changing the odbc.ini to IsolationLevel=Repeatable Read for orabpel fixed the error below:

The following error has occured:
DBException: [POL-3261] there are too many transactions

but it then still failed at the end with:
DBException: [POL-2403] value too large for column

my orabpel database is now 2MB, not 4,191,736MB



AIS based coolness

You are probably aware that we've done quite a bit of bespoke development in the enterprise mobility space.  I've banged on about it enough.  We have a work orders application that does GPS tracking, generic file attachments, powerful search functionality and offline caching...  do I need to say more.  This app would probably cook you breakfast if you set the PO's correctly.

But... I had to demo this app to another client and they were on 9.1.3.1 - fair enough, but the stinko AIS was only released in 9.1.4.3 - we have a problem!

I was not about to install / upgrade their environment just for my demo - they wanted their data on the app - which is also appropriate.  So, I decided to install an AIS server and 9.1.5.7 and a HTML server at 9.1.5.7 and see how it went.  of course I was also going to use the JDBJ bootstrap data source to point to different serialised objects, because I think that different tools serialisation might cause me some problems down the track with the existing PY environment.

A very small amount of hacking had me up and going on the latest tools release (well 9.1.5.7) and using AIS against a 9.1.3.1 enterprise server.  I know you are all going - but but butt...  BUT - it works and it saves me a lot of time.  I've not contaminated the standard environment at all.  I've not had to put on a single ESU - coz all I want is the extra AIS power!

I would recommend this approach to anyone spending time developing in AIS, as the newer tools releases expose a lot more functionality.  Create a little "Island of AIS" [you can use that] so that your developers are not going to need to create depreciated code from the start.

Sunday, 15 November 2015

weblogic 12.1.3.0.0 and IP address for weblogic.management.server

All of my blog posts are generally created out of need, this one is another example.  I was helping out a client with a DR test of their JD Edwards and it was all looking great until the automatic start of the JD Edwards weblogic instances did not work.  They went from starting to stopped in server manager.  What!!!  The start procedure has been tested 100 times and is solid as a rock, we use nmstart commands in a startup script.  All nice and neat.

on further analysis of the individual JVM logs, I see the following (amongst the errors)

weblogic.home = D:\oracle\Middleware\Oracle_Home\wlserver\server
weblogic.management.server = http://10.38.144.11:7001

in the servername.out file in domainname\servers\servername\logs dir


It’s trying to use an IP address for the weblogic.management.server setting.  Tidy darts, I’ll just use windows find to locate where the IP address is specified (surely just an xml file… no, maybe .config, no – maybe .cmd… no… .properties file…  nothing say’s windows find).  Needless to say windows find is the most useless tool that has every been put on the face of this planet.  This is 2012R2 also…


Using the trusty

D:\oracle\Middleware>findstr /S /C:"10.38.144.11" *.* | findstr /V /C:".log" |findstr /V /C:".out"

…  I find the following file (of course, not one of the extensions that I’d been expecting…  proprietary binary format)

Oracle_Home\user_projects\domains\E1_Apps\servers\AdminServer\data\store\default

\_WLS_ADMINSERVER000000.DAT:loadFactorI         thresholdxp?@     ♀ ► ♀t ♦sn

mpt ▬snmp://10.38.144.11:96t ☻t3t ¶t3://10.38.144.11:96t ♣httpst ¶t3://10.38.144

.11:96t ↑cluster-broadcast-securet ¶t3://10.38.144.11:96t ♦ldapt ▬ldap://10.38.1

44.11:96t ◄cluster-broadcastt ¶t3://10.38.144.11:96t ♦httpt ▬http://10.38.144.11

:96t ♣admint ¶t3://10.38.144.11:96t ♦iiopt ▬iiop://10.38.144.11:96t ♣ldapst ¶t3:

//10.38.144.11:96t ♥t3st ¶t3://10.38.144.11:96t ♣iiopst ¶t3://10.38.144.11:96xsq


What, this is a persistent filestore under the adminserver which is caching the IP address of the server before DR.  This is painful!  This is the ONLY location it’s specified anywhere.

Hmm, a bit of googling later leaves me quite sure that I cannot do anything with this in a rush, it looks complex.  The one thing that I can do in a rush is to delete the file and restart the machine, see if my scripts work.

So, after taking down the adminServer (it locks the file hard) I backed up the file and removed it. 

clip_image002

My server then started perfectly – but of course, the funny thing?  Look at what it uses now in the persistent store:

weblogic.home = D:\oracle\Middleware\Oracle_Home\wlserver\server
weblogic.management.server = http://10.38.16.12:7001
weblogic.nmservice.RotationEnabled = true

The IP address of the DR machine!! haha.  Monkey see, monkey do.


This must be some sort of bug in the adminserver which is caching the IP address not the hostname of the machine that the server is starting on.  I’m considering raising an SR for this, we’ll see.


Remember, if you are using nmstart and changing IP addresses of your server, you probably want to delete the admin server persistent cache.

32 vs 64 bit app determination and windows which–two bugbears of mine (what’s a bugbear?)

 

I’ve struggled for this for a while too, in this modern day of transition from 32 to 64 bit, why is not HEAPS easier to tell if a file is 64 bit?  Give me the unix file command any day of the week.  While I’m on a rant, the other thing I dislike about windows is that there is no where command.  If I’m running sqlplus – I want to know which one in the path is being called – not just guess.  This is a common problem on deployment servers where you have e1local that is 64 bit and then you have the 32 bit client component.

Note that one of my prayers have been answered:  which is a command that I use on linux all of the time.  Handy to know what version of sqlplus is being used and therefore what tnsnames to change.  modern windows you can now use where!

C:\Oracle\E1Local\BIN>where sqlplus
C:\Oracle\E1Local\BIN\sqlplus.exe
D:\oracle\product\11.2.0\client_1\BIN\sqlplus.exe

It seems that the consensus online us using dumpbin, this is crap.  No everyone has visual studio just lying around for this purpose.  We don’t want to download noddy little tools to do this stuff.

Wait, both rants might be over.  Thanks to this post:  http://superuser.com/questions/358434/how-to-check-if-a-binary-is-32-or-64-bit-on-windows

clip_image002

64bit

clip_image004

32bit

This is really cool, so I can use the tools that are installed on my machine to determine 64 and 32 bit applications by a simple notepad interrogation.

Note that you can also use findstr if you don’t want to involve notepad:

C:\Oracle\E1Local\BIN>findstr /C:"PE" D:\oracle\product\11.2.0\client_1\BIN\sqlplus.exe |more

clip_image006

See the PE then L in the 2nd page of the results.  Remember that the L means 32 bit

Note that after considering the wikipedia definition of bugbear, I might stop using the word.  It does not seem to make a lot of sense the way I use it…  unless you look right to the end of the actual definition In a modern context, the term bugbear may also mean pet peeve

Wednesday, 11 November 2015

JD Edwards and IOT

Exciting

This is a pretty exciting enhancement, it’s exciting for a number of reasons.  Although to be honest, technically – it’s not that exciting.  It’s the change of thinking that is truly exciting.  Can I write the word exciting anymore, let’s see.

Why do I say that technically it’s not exciting, well most of the cool stuff has already been released in AIS, so the generic ability to call E1 functionality via rest based calls is totally awesome.  This must be the way you choose to integrate anything with JD Edwards moving forward.  It seems to be lighter and easier to develop in than BSSV, error handling is better and more forgiving, especially for a human based interface (mobile, website etc).  Don’t get me wrong, BSSV has it’s place – but it’s no longer that cool.

The technology that is doing the rules based filtering is nice, but fairly rudimentary at this stage, lets wait for some graphical tool to assist us.  Something nice with flows and drag and drop parameters  that’d be nice.  Don’t stop with the flow and the rules either, how about making AIS development graphical – come on – there is a challenge.  I’d like some nice tool to drop 3 XML documents into the associated directories and allow me to call them!  True, I’m getting old.  Although let’s be honest – who calls writing a well formed XML document “cutting code”?

Change of thinking, business opportunity:

So this is where I think that the true value is, I don’t think that you need to look too hard for a use case either – especially if you take inputs from anything and enter them into JD Edwards,

JD Edwards is not going to be a great data warehouse, it’s not going to store 100000’s of rows of asset location data well, of course it will – but it’ll slow everything else down.  You need to design your inputs so that they are meaningful in JD Edwards.  Don’t misinterpret what I’m saying, SAVE ALL DATA – you’ll never know what it’s actually worth.  I’m just saying that saving it into your production JD Edwards database might not not be the most efficient place.  Save the triggering event, raise the work order when the temperature device reads too high….  But don’t save the normal 1 minute trend data for the last year in JD Edwards.  Save this in a data warehouse and show it with CAFE1 if you really need to see it in JD Edwards.  Choose the right place for your data.

Remember, IOT is going to create a lot of data…  More sensors, more data.  keep your data and save your data for a rainy and strategic day for the use case that you cannot visualise today.

I think some fantastic opportunities for this is:

  • weighbridge interfaces
  • quality readings from products – steel / food etc
  • RFID for shipping and identification
  • anything PLC related
  • temperature, moisture (agri business), location, angle, speed, noise,

I think there are fantastic opportunities with CAM and with HS&E, this data could be vital when trying to predict incidents that cause harm and report over them.  Remember you’ll get true data from IOT, no mistakes, always entered on time – accurately.

We’re prototyping some IOT for clients at the moment, if you think that you’ve got a winning use case – we have a winning team that might be able to implement the solution for you at the right price. 

Here are a couple of learning's from my recent adventures in IOT.

image

The general section of your AIS server needs to point to quite a specific directory – this one:

/U01/jde_home1/sampleOrchestrations/SampleOrchestrations/JDE_IOT_Orchestrator_XML

For me, it’s above.  But I want to give you some context.  This is from downloading the ORCHESTRATION SAMPLES file from MOS


image


Note the one that is 0.03MB is the one that you want.


Lay this bad boy out on your AIS server.  rename the par.zip, or just unzip the par…  Note that you might have to yum install unzip


You need to make sure that you point this AIS configuration about to the right DIR, it as the following folders in it:

CrossReferences
Orchestrations
Rules
ServiceRequests
WhiteLists

Okay, so you have the right DIR.


Note that if like me you get the following error when you try and log into the orchestrator client;  (Authentication error)


http://e1webv3:9221/jderest/client 


You turn on all logging and get the following in the server logs for the AIS server:

09 Nov 2015 12:36:19,224[DEBUG][AIS]AISClientServlet session Exception
http://e1webv3:9221 com.oracle.e1.aisclient.JDERestServiceException: 401 Verifiy WLS Server Basic Authorization Header configuration in domain config.xml, enforce-valid-basic-auth-credentials must be false:
09 Nov 2015 12:41:18,581[DEBUG][AIS]AISClientServlet public
09 Nov 2015 12:41:18,582[DEBUG][AIS]AISClientServlet service method POST
09 Nov 2015 12:41:18,582[DEBUG][AIS]AISClientServlet doPost
09 Nov 2015 12:41:18,583[DEBUG][AIS]AISClientServlet params JDE-JPY920-*ALL-e1webv3:9221-Z1bp4u58flboTpjN-lD1DbZ3t2BH-UH2Li-UnQBYnIzxFhqr2A9P!-488571965
09 Nov 2015 12:41:18,584[DEBUG][AIS]AISClientServlet doPost aisServerhttp://e1webv3:9221
09 Nov 2015 12:41:18,584[DEBUG][AIS]AISClientServlet login path
09 Nov 2015 12:41:18,591[DEBUG][AIS]E1ResUtils getAISVersion buffer
09 Nov 2015 12:41:18,592[DEBUG][AIS]E1ResUtils getAISVersion in java.io.BufferedReader@6e293511
09 Nov 2015 12:41:18,593[DEBUG][AIS]E1ResUtils getAISVersion inputLine EnterpriseOne
09 Nov 2015 12:41:18,619[DEBUG][AIS]Successfully registered the runtime_config Runtime Metric for com.oracle.e1.jdemf.DefaultConfig@2a6547af Using null
09 Nov 2015 12:41:18,619[DEBUG][AIS]Successfully registered runtime_config Mbean com.oracle.e1.jdemf.DefaultConfig@2a6547af
09 Nov 2015 12:41:18,621[DEBUG][AIS]Required Capability List IN: null
You’ll find that this will make your eye’s roll  https://support.oracle.com/epmos/faces/DocContentDisplay?id=2040956.1

Note that the fix is to go to your config.xml for the domain that the AIS server is installed in:

/U01/Oracle/Middleware/user_projects/domains/E1_Apps/config

And edit the config.xml file – probably make a backup (or not if you are feeling like rebel)

  <name>E1_Apps</name>
<domain-version>12.1.3.0.0</domain-version>
<security-configuration>
<name>E1_Apps</name>
<enforce-valid-basic-auth-credentials>false</enforce-valid-basic-auth-credentials>
<realm>

See above, look for the realm entry and paste above that for your domain.  I did it in the wrong place initially and nothing worked.  Restart the AIS server instance from SM and you’ll be able to login.


image


Cool!  We are in:


image


Like I said a fairly simple interface for choosing an existing item from the list: (or dir)


image


Be able to enter the inputs


image


Add some values and hit go, you’ll see some cools things:

{
"inputs" : [ {
"name" : "SensorID",
"value" : "123"
}, {
"name" : "Date",
"value" : "101015"
}, {
"name" : "Time",
"value" : "01:35"
}, {
"name" : "VibrationReading",
"value" : "5435"
}, {
"name" : "TemperatureReading",
"value" : "5534"
}, {
"name" : "ShannonsTest",
"value" : "Hello World"
} ]
}

Nice, json input format, which we can test


And, even nicer, using chrome debug tools, you can get a cURL command

curl "http://e1webv3:9221/jderest/clientservice/orchestrator" -H "Origin: http://e1webv3:9221" -H "Accept-Encoding: gzip, deflate" -H "Accept-Language: en-US,en;q=0.8" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Accept: */*" -H "Referer: http://e1webv3:9221/jderest/client/orchestrator.html" -H "Cookie: JSESSIONID=b5D14vor1wgZXx7MrUXPu4xnC_e_rxMQE0fyaAI32wA9U7To9wLj!1811286266; SMCONSOLE_SSID=jYj12SvLtf_HhobsFJGGXn2X-4ZdGG27K2O-3rI6tpxVkhkAb8-p!-1147834967" -H "Connection: keep-alive" --data "orchname=JDE_ORCH_Sample_AddConditionBasedAlert&generic=false&useJson=true&jsonString={"^
" ""inputs"" : [ {"^
" ""name"" : ""SensorID"","^
" ""value"" : ""123"""^
" }, {"^
" ""name"" : ""Date"","^
" ""value"" : ""101015"""^
" }, {"^
" ""name"" : ""Time"","^
" ""value"" : ""01:35"""^
" }, {"^
" ""name"" : ""VibrationReading"","^
" ""value"" : ""5435"""^
" }, {"^
" ""name"" : ""TemperatureReading"","^
" ""value"" : ""5534"""^
" }, {"^
" ""name"" : ""ShannonsTest"","^
" ""value"" : ""Hello World"""^
" } ]"^
"}&name_0=SensorID&value_0=123&name_1=Date&value_1=101015&name_2=Time&value_2=01:35&name_3=VibrationReading&value_3=5435&name_4=TemperatureReading&value_4=5534&name_5=ShannonsTest&value_5=Hello World" --compressed

 


Of course, this won’t help you – coz the cookie will be dead by the time I post this and this server in not on the internet, but you get the gist of what is being done.


What do you need to do to get this working?

<?xml version="1.0" encoding="UTF-8" ?>
<Orchestration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="JDE_Orchestration.xsd">
<inputTypes>
<inputTypes type="String">
<name>SensorID</name>
</inputTypes>
<inputTypes type="Date" dateFormat="Milliseconds">
<name>Date</name>
</inputTypes>
<inputTypes type="String">
<name>Time</name>
</inputTypes>
<inputTypes type="Numeric">
<name>VibrationReading</name>
</inputTypes>
<inputTypes type="Numeric">
<name>TemperatureReading</name>
</inputTypes>
</inputTypes>
<orchestrationSteps>
<orchestrationSteps type="CrossReference">
<name>JDE_XREF_Sample_SensorLocation</name>
</orchestrationSteps>
<orchestrationSteps type="CrossReference">
<name>JDE_XREF_Sample_AlertNotificationRecipients</name>
</orchestrationSteps>
<orchestrationSteps type="Rule">
<name>JDE_RULE_Sample_CBMAlarm_1</name>
<trueActions>
<orchestrationSteps type="ServiceRequest">
<name>JDE_SREQ_Sample_AddCBAlert_Alarm</name>
</orchestrationSteps>
</trueActions>
<falseActions>
<orchestrationSteps type="Rule">
<name>JDE_RULE_Sample_CBMAlarm_2</name>
<trueActions>
<orchestrationSteps type="ServiceRequest">
<name>JDE_SREQ_Sample_AddCBAlert_Alarm</name>
</orchestrationSteps>
</trueActions>
<falseActions>
<orchestrationSteps type="Rule">
<name>JDE_RULE_Sample_CBMAlarm_3</name>
<trueActions>
<orchestrationSteps type="ServiceRequest">
<name>JDE_SREQ_Sample_AddCBAlert_Alarm</name>
</orchestrationSteps>
</trueActions>
<falseActions>
<orchestrationSteps type="Rule">
<name>JDE_RULE_Sample_CBMWarning</name>
<trueActions>
<orchestrationSteps type="ServiceRequest">
<name>JDE_SREQ_Sample_AddCBAlert_Warning</name>
</orchestrationSteps>
</trueActions>
</orchestrationSteps>
</falseActions>
</orchestrationSteps>
</falseActions>
</orchestrationSteps>
</falseActions>
</orchestrationSteps>
</orchestrationSteps>
</Orchestration>

So we can see from the above document, how the various components are being called (cross reference etc)


P952000 will show you the maps that can be maintained in JDE for cross reference etc:


image


Note that I get the following error, because I need to load the cross reference data into my F952000 tables

{
"exception" : "java.lang.Exception",
"timeStamp" : "2015-11-11:20.59.05",
"message" : "Orchestration Aborted: Cross Reference Failure"
}

Extending JDE to generative AI