Scenario: Java client calls SOA Suite composite to process an order as part of a global transaction. The SOA composite is expose as an EJB service. The composite contains 1 BPEL process that itself calls an EJB service to update our Orders DB.
I'm using SCOTT's schema and have already created a datasource on WLS for it.
name: scottDS
jndi: jdbc/scottDS
Step 1. Create DB Table - test Create table test (id number(2), quantity number(2));
Step 2. Create a stateless session EJB to update this tablecreate a new application/project in JDev and include a statelsss session EJB 2.1
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQI1M1grs6jr5wi-jw-Ha4Sfqley3LXGAy9PfcFERgWSp1akAvrZlcwch1yUN_0S3gmW79fWC_Mo5L1iVIKUdvG4w2xAh8O_iuY6gOPLo6YZR5LwfYw9lmqrwxe5IyV7eeJI8swLZ1f5c/s400/1.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNYBp28usGr5PsAKVMfhp7fpMmJ7J-e89BKyS1v0Xl75g_gTfwt05id_yxyZwWfzvisG1FlqVClj8R4Pcw0TI4A-62vbqAtY9MrQ8re2UrF7cQFGnXHIwRmwyFu4hesKggqiejzlrIfVw/s400/2.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfZ43FYFg-L1bXAa0pZdiP4MdI6o-NxzZeeBazNeNozPRF09td2OpJTT-Is2nmKnb76ulJ_gECtWPVfIbOLvQ22RgH5JFWe-M24Y9yi9My3oJLbF7YXAw6nuvpBqhyDCaT4kHB1QA0-GA/s400/3.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidPJSO0PDcwlxWl5FZCgBwuv3Fy40ooRSYJAsR8oDbm4gQYNne9KfacsCPFGh9BmpiPGQGofByF4slWb1aQlRkQBsGOMggw0gRHQ5a1iOBAUNi0EGgldJIJfhE5L8d-aYb07a8_-bbv2w/s400/4.GIF)
Step 2.1 - Add the following business methodpublic String callDB(int id, int quantity) {
Connection connection = null;
DataSource dataSource = null;
try
{
/*
* 1. Create an InitialContext.
* 2. From the initial context, lookup the logical datasource reference
that is in the deployment descriptor.
*/
InitialContext initialcontext = new InitialContext();
dataSource = (DataSource)initialcontext.lookup("jdbc.scottDS");
System.out.println("***** Got Datasource...");
// Check to see if the datasource is valid
if(dataSource==null)
{
System.err.println("*** DataSource retrieved is null, did you add the code?");
throw new ServletException("DataSource retrieved is null");
}
connection = dataSource.getConnection();
Statement stmt = connection.createStatement();
String insert = "insert into test values(" + id + "," + quantity + ")";
System.out.println("INSERT = " + insert);
stmt.executeUpdate(insert);
ResultSet rset = stmt.executeQuery("Select to_char(sysdate) from dual");
while (rset.next())
{
System.out.println("*** Date = " + rset.getString(1));
}
}
catch (Exception e)
{
System.err.println("*** init() Exception, " + e.getMessage());
System.err.println(e);
}
return "Ok";
}
Step 3 - Deploy and view the JNDI tree specify jndi name before deploying -
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9o7QvEL3d7vVhjCRb3cHcS8UfIVRA9s_ItFJgXTHejfzfIbcKjRr0es97XzRBzqLEoVVYG5Ugp_0YgTkpTg7sH1AMv3TCZ9Kycj3IgzM0XgT4_0Zy5f5TGrSVQ0HttdROyYZm8c31xLs/s400/6.GIF)
Step 4 - Create a new SOA App in JdeveloperCreate a SOA Composite app
Add the ejb jar from the previous project to the apps classpath.
(We really only need the interface!)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0L1UwDdDEK_sb29CCbUSy34m2UDW-0LkuicHMk4DDRED3hYG1hrbe6q5DupUXOTnwluQfEoUlCALEISItCYYGeEqNmbplEGMgwrFVrD_ACVCja5PwHOBEMPo1FztR50D_NOr_N4Zurbg/s400/2.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN-SUqqs3FqkW1vS_WAp7J8tZE-1U8AE0uOxjzi_uCfJ_AktrIhXBnlnfHvBst92CKF2qL6j-566bVLBIo3LXR8Sw511J9H_2vQVNi0Jb1OHb4M7yhXZTc-RwHeeEC9rU01domlEJQ97Y/s400/1.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_RaELff8zJVj1tovqdIekzq1rC_6hcg1eKoamf2VuTGQ4iQSt-QSQY-l9apQK8xg2cWQ-1sHSYPhOGxhhCkEccb8V7Z8U0f37y8LXka31NDfzY4MK3pRaXjHACkokMX9DjDp-eai_xt0/s400/2.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpQ5koWPdPVrpz1IhalaedbAlVVsabfKUtORk9rmaoif0mff4xoye_Z4LPZSXvMdk_GWh-69MVysT30HdYgS9CsYHBR2efjIhNLThHx1FHkl_U7wxGjXHW-kQruDvaLlblSn36HFU7XwY/s400/3.GIF)
Create the following input xsd
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnJVANj_z4LuaNP4-UHFiMIskVi7RCVRnNkKL_YztjT9xn0camxphDjwsoscSHx41FYIH1zwZXM71kP-5zKamGbh-xylMRpP8f456cryfhLOA2F13Bnwmb-kQeV1peEguT7kdhBa8MmP0/s400/4.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYAYeK9DfBRV7LLO8vM0UkAEVDpGqbReZENzTBvF_uGzv6SN_NGkGul9n45VNfpZOlbLtSsNMFRWjtPn7pWRnmeQc1KjQHxq8Ym_YRNVnH4lICi5OnxErVTCw2rhm5DtZ7ThAFJp-L_Oo/s400/5.GIF)
Create a synchronous BPEL process
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoYZyLs4QAz_eu5zQsH5FiR-Adx0LC_IS0c0GFR-eq-VeKpTxnxgKO0cyTwn94ZV6Q3UGnzuxgvuw0FS3OdpK8vJZHleKvLuMPnYQSWptP42eVySxXxQIPRJkMDfoj6mBGALBHAL0qdBU/s400/1.GIF)
Create an EJB reference
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmvi2wbVZIFV3M64HEnspc7OBdbqGwMCJLNfk7EBHiItKDEcwHdj4rAGcMFCYyWxJ1sFGWMO8fe_kwxqC55v-Z2ClH9DChEHHqO_OzPJtmj_1NEEqJe_2t9Em6gzNDQNnKMjBr3HM35hs/s400/6.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjok9gemim0G7dlrw1EvBMoStLo1f_v15ko27ZqITZI6B3wVQUIASZ3nUHtMu58VRqRHakZbK3MVgwOUQ3rIlbLhWLqotW6ln8zAOMhG6vazZfiZkex4t91Q8wWKJTqnpbVWX5hJfcGGqo/s400/4.GIF)
Wire up
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGiD84kgWw1tPntB2_-XhZwiC4k5kYrr1AbJiiZJ0CQ0CknoraaxKG8d1M_9ZmtWfxiwpnahT9ZFKcwmy1nLfmp8JCmPClTJYrdYBqnDUFMKAxj4RuKx8bZ5_-J2rvnaDLphgqQeKcgRk/s400/5.GIF)
Add the Invoke to the BPEL process
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeefzhxcDoEUaXVlSUdOWJ3TJveyA557KrDq1hjPTb847B-kAfNl_-iWrg9pQ-j7XU-e_oTQsUYYarBw0j6BssPmp_4aNQA1Om5k5UIRK8hS4Xi3HfXqIzROwUnGeY7_sM8nP0wmGuaJ4/s400/1.GIF)
Add the required Assigns, before and after
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglQpWcSTungCx5CzQWhcDcqtLKSHlePEJ0nhGVrO3Fj_sgV0R9-m1rYjW2XXHz_dTVOXRTMHCtoRQ6mQBdbE_Wy9x1MMNXXrhY53K_utYgJiE9ZYEqVWvncgh-7mMMSZUE_7P-pBhLdoc/s400/2.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSXkSPDfXDsPZYjGOmAv22NMc3Umv2ZHqcH5s7fmSZY7X7L_7QXlpSqDNbbfHFYne1xj9cKkm42Jwk78asowiSRe7Io3cGY8if49oliGb4vxwSo0D16xm2namSianaLjCphBUocrk6pBU/s400/3.GIF)
Step 5 - Expose the composite as an EJB Service![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7KZNSpHtuCbLFG3mKMVabkbJu7Pol3ZpQ4qAPItbKUsR3jDh9bQnf3fmsw0-EmPniX3hEQZEeS-k32S7Je5oXJPZcGfzMB0TS3fohDl7502GcWhNAN5xZjp2o_TGO_dMY9VAIjHRe_zw/s400/1.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7RDuYqCdjcXjtXF8EVrZ3RDsMCyIPNHg1ULkq029ofZY0CH6J9wDCaawG7eTkcPsNP3t7t6V3eDoj91eGdX1zrZwAwaTRVVHARnBqFsQezqN_9yoapJRk3sWTPjktwAEaZ_Ly98aAjaQ/s400/2.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqQSZ-9TQR7SsSYWunOGBN_b3SJGnAlhzfFsUC2lo1t4PtsR9Tkayoix0tHsQmk3epaTs96WnJvBkDUheVmS0lAsxrk8Ch73xta-PcThDIfoU8XniaiDjngKMIuqYapt51_e1RgcnHqe8/s400/3.GIF)
Make InputOrder and OrderType serializable
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXsujLrr8sP7OOO9RkIsAPVVSzKrdn5TOPhBwcGGFRb4bn0yAQ7a4BC_FkLFpTwNq2fFhGtAxJxLivdHIH4Q38d65aw7APlgDA0dspahk65CAqZ9-dATd1cPlDjqbW2MbdmWtZAqUuUQA/s400/4.GIF)
Deploy and view in JNDI tree
Step 6 Create the EJB client in the SOA projectpackage demoejbtxsoa;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import processorder.demo_ejb_tx_soa.demo_ejb_tx_soa_app.com.oracle.xmlns.InputOrder;
import processorder.demo_ejb_tx_soa.demo_ejb_tx_soa_app.com.oracle.xmlns.OrderType;
import processorder.demo_ejb_tx_soa.demo_ejb_tx_soa_app.com.oracle.xmlns.ProcessOrder;
import processorder.demo_ejb_tx_soa.demo_ejb_tx_soa_app.com.oracle.xmlns.ProcessResponse;
public class MyEJBClient {
public static void main(String [] args) throws Throwable {
try {
final Context context = getInitialContext();
Proxy proxy = (Proxy)context.lookup("ejb/SOAEJBService");
// preparing the method to be called on the remote EJB
Method method =
ProcessOrder.class.getDeclaredMethod("process", new Class[] {InputOrder.class});
InputOrder id = new InputOrder();
id.setId(23);
id.setCustName("NiallC");
id.setQuantity(7);
OrderType ot = new OrderType();
ot.setComments("Good Customer");
ot.setProduct("Oracle SOA Suite 11g");
ot.setProductGroup("FMW");
ot.setProductKey(new Long(12345));
id.setOrder(ot);
InvocationHandler handler = Proxy.getInvocationHandler(proxy);
ProcessResponse response = (ProcessResponse)handler.invoke(proxy, method, new Object[] { id });
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static Context getInitialContext() throws NamingException {
Hashtable env = new Hashtable();
// WebLogic Server 10.x connection details
env.put( Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory" );
env.put(Context.PROVIDER_URL, "t3://127.0.0.1:7001");
env.put(Context.SECURITY_PRINCIPAL, "weblogic");
env.put(Context.SECURITY_CREDENTIALS, "welcome1");
return new InitialContext( env );
}
}
Run the client -
Check the DB
Step 7 JTA enable...Add the following code to the EJB Client -
import javax.transaction.UserTransaction;
public final static String JTA_USER_XACT = "javax.transaction.UserTransaction";
UserTransaction ut = (UserTransaction)context.lookup(JTA_USER_XACT);
ut.begin();
//ut.rollback();
ut.commit();
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQiNpL_NP_7XDlNrN224HqEBNku9wEqZYC3PdvUfQSboIsOlYmrRJ3qhRhPa-ubgAZeAXzfnEHqjE1o1844HwbjchpzffSBDIe8dXznjErgy12b0tA0vEXcQrTBnUyDG_mlmIRHUcNHhY/s400/1.GIF)
Define BPEL to participate in the global TX.
Add this property to BPEL specification in composite.xml
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguXn8wXWuJdECB5pxRjJDl4HWCeaVKQ_5mI9iMF8VNO1bhbuVWvZqm85iN0R6G7OTZ103BAsX3w3C8WOngWS029Y2aoFiMsyPfgtms4UEE_xs3Lcr6ugo47jLvvTacMZlXv0ewhBmw2lU/s400/8.GIF)
Testcommit()
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL0Uafo81lWAboP84P5Ldtk0eA2EQUeK4uYII-14XD122qfuDLCH80Azh0B6V_jlj4igDW5f-Hui6PFOqbOx5-eBAyUsMrkcBV0yf5sxeYqKP1zk71zcTY9p1UdGnDDvgX1034fr7DJwg/s400/3.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm1PnPXSxWHiEeCad53uUjPMrOP8H9zkgM5oh9d7R-KvTljmArc7u-kWQ-RDo9ouP5v2s6wRgMdPrhmgoZ6_sqX9U4rs3FcCHP_oxazienC7Rt9WwnNuOMqb1Z0pZffDmunHZUYntCVQY/s400/4.GIF)
rollback()
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNGUOJpOFJBEDNXHqac7Gu-p9tVcgLl5tqAbYTVS6eV1OsJWuLnyh7_O5R1frjYpv7iOOWzBUTCluMf_uhhyXuNbijfqxkrPx7vaTKeQDUieoHUL-hEJy23q0oUTZEJKEjYErLOKom3hk/s400/5.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5o7MYeH-XZOnukNGYzozJ1_QNb-PY1-SrOy0Lv5mPtgXgC6z-qhITXNOuwfk-bqTyO5WH5sfbwuzGCXg2_ME4y5bKayWxC5MvGKMkwqU8uJgIGjXGhR1TNTrJZOGUvDgqCwz0d12Vjco/s400/6.GIF)