Pages

Tuesday, July 21, 2009

MDS repository for ADF 11G

With Fusion Middleware 11G the MDS repository plays a important role for ADF customizations and SOA shared objects. In this blog I explain how you can create a MDS database repository, deploy customizations to this MDS database and what you can do with MDS in the Enterprise manager website.

First we need to download the RCU repository creation utility and install a MDS repository in a Oracle Database.
Use a sysdba account

We only have to select the Metadata Services and provide a prefix

Next we need to install Weblogic with the Soa, Webcenter or Application development runtime extension. This extension gives us the Enterprise Manager website where we can configure the MDS repository. Select your Weblogic domain and select the MDS menu option.

Register the just created MDS repository. In my case I will call this repository adf

The EM website automatically create a datasource which we can use later.

If we have an ADF application with customizations and we deploy this to the Weblogic Server then JDeveloper detects the MDS repository

JDeveloper automatically creates a new MDS partition and uses your ear deployment name as partition name. It also uses the just created datasource to fill the MDS database. Just press deploy

When we go back to the EM website we can see the just created MDS partition.

The EM website also provides MBeans with some MDS operations.


For example we can query the partitions of a MDS repository.
When we select our just deployed ADF application and go to the MDS menu option, we can administer the MDS partition of this application.


We can export the MDS customization and import this to a different Weblogic server which has the same ADF application.
At last we can take a look at the MDS repository, here we can see that all the customizations entries are registered in the database. But the customizations xml are still located on the server, a bit strange I would suspect that with a MDS repository in the database that everything is loaded in the database.

Saturday, July 18, 2009

Using an EJB Service / Reference in Soa Suite 11G

With Oracle Soa Suite 11G ( FMW11G R1 ) we can finally use the EJB adapter. This adapter can be used as a service or reference. This means we can start a BPEL process by calling a EJB session method or use an EJB to lookup or change data. Using an EJB as service or reference is very cool because it is fast ( RMI ) and we can use the same EJB's ( Multi Tier ) for your Java Web applications and your composites ( Who needs the Database Adapter now?)
Here is a picture of the composite application with an EJB adapter as Service and Reference.

In this blog I will explain you first, how the SDO EJB is created and then how we use this as a Reference and as a Service

Create SDO Eclipse EJB
First step is to create an EJB entity with Eclipselink as persistence provider. For this example I used the Employees table of the HR schema. Next step is to create an EJB Session Bean.
Here is an overview of my EJB model project.

Select the Session Bean and generate a service interface on this

Now it goes totally wrong with the JDeveloper wizard 11G R1.

First step is fix the packages names of the SDO and SDOImpl classes, then we can refactor these classes and move it to the entities package. With this as result.

Select the session bean again and generate for the second time the service interface. Now we will get the WSDL.

Move the EJB WSDL and XSD to the Session bean package. With this as result.

Open the Entity XSD and change the target namespace and xmlns namespace to the same name as the package name in my case /nl/whitehorses/hr/ejb/entities/.
before

after

Open the XSD of the WSDL and import the entity schema and fix the namespace.
Change /nl.whitehorses.hr.ejb.services/ to /nl/whitehorses/hr/ejb/services/ in every java, XSD or WSDL file

Create a Datasource to the HR schema in Weblogic and make sure you are using the XA Oracle Driver and target this Datasource to the Soa suite server.

Deploy the EJB to the Soa Suite instance.

Using the SDO Ejb as a reference in Soa Suite 11g
Open the composite application and drag the EJB adapter on the reference part of the composite.

Fill in the JNDI of the EJB on soa suite server , select the EJB jar and provide the Remote EJB interface class name.
Select the WSDL , Go the classes folder of the EJB model project and select the Session bean WSDL. This will copy the WSDL and the XSD to the local project folders and also import the jar. That's all , now you can invoke this in a BPEL process.

Using the SDO Eclipselink Ejb as a Service in Soa Suite 11g
We can use the same EJB as starting point of our composite application. This time Soa Suite only uses the interface and does nothing with the Session Bean methods.
Drag the EJB adapter to the Services side of the composite overview.

The Service ID is very important because we need this name in serviceFactory.createService, The rest is the same as in the reference part. Use this EJB Service in a BPEL process.

Now we only have to make a simple java class where we call this EJB composite service.




package nl.whitehorses.soa.ejb.service;

import commonj.sdo.helper.DataFactory;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;

import nl.whitehorses.hr.ejb.entities.EmployeesSDO;
import nl.whitehorses.hr.ejb.services.HrEmployeeEJB;

import oracle.integration.platform.blocks.sdox.ejb.api.SOAServiceFactory;
import oracle.integration.platform.blocks.sdox.ejb.api.SOAServiceInvokerBean;

import oracle.jbo.common.sdo.SDOHelper;


public class callejb {
public callejb() {
super();
}

public static void main(String[] args) {
try {
// very important to load every schema you use in the EJB
try {
SDOHelper.INSTANCE.defineSchema("nl/whitehorses/hr/ejb/entities/", "EmployeesSDO.xsd");
SDOHelper.INSTANCE.defineSchema("nl/whitehorses/hr/ejb/services/", "HrEmployeeEJBBeanWS.xsd");


} catch (Exception ex) {
ex.printStackTrace();
}

Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");

// soa suite server
props.put(Context.PROVIDER_URL, "t3://localhost:8001");
InitialContext ctx = new InitialContext(props);
SOAServiceInvokerBean invoker = (SOAServiceInvokerBean)ctx.lookup("SOAServiceInvokerBean#oracle.integration.platform.blocks.sdox.ejb.api.SOAServiceInvokerBean");

//-- Create a SOAServiceFactory instance
SOAServiceFactory serviceFactory = SOAServiceFactory.newInstance(invoker);

// use the Service Id in the EJB service adapter
HrEmployeeEJB hrEmployeeEJB = serviceFactory.createService("EmployeeService", HrEmployeeEJB.class);



EmployeesSDO employeesSDO = ( EmployeesSDO )DataFactory.INSTANCE.create(EmployeesSDO.class);
employeesSDO.setDepartmentId(1L);
employeesSDO.setEmail("aaa@aa.nl");
employeesSDO.setEmployeeId(1L);
employeesSDO.setFirstName("edwin");
employeesSDO.setJobId("aa");
employeesSDO.setLastName("biemond");
employeesSDO.setPhoneNumber("123");
employeesSDO.setSalary(1000);

EmployeesSDO resultEmployeesSDO = hrEmployeeEJB.persistEmployeesSDO(employeesSDO);

} catch (Exception ex) {
ex.printStackTrace();
}
}


}



Here is the result of a EJB service instance.

Here the link to official EJB adapter documentation. ( This can be a lot better )
Download here the EJB project I used and here the Soa Suite project.

Monday, July 13, 2009

Using AQ ( JMS Text message ) in WLS 10.3.1

In Oracle Application Server 10.1.3 ( OC4J) you can use OJMS to expose AQ with JMS (text) Message as type and use it as a normal JMS Queue or Topic in Soa Suite or a Message driven Bean. See my previous blog for more details. With the release of Weblogic 10.3.1 ( WLS FMW11g ) we can do the same with a Foreign JMS Server. Before 10.3.1 we had to make a startup class to achieve this.
First create a Queue and Queue table with SYS.AQ$_JMS_MESSAGE as payload type in your Oracle Database and make sure you enable enqueue /dequeue on this Queue.
In Weblogic we have to create a JMS server and a JMS module.
Create a new JDBC datasource with a schema user which can enqueue or dequeue the just created queue. Use the XA JDBC driver, with this driver you can use global and local transactions. with NON-XA driver you can only use local transactions, this can be problem when you want to use this Queue in Soa Suite.
Select your JMS module in the WLS Console and create a new Foreign Server.
Open the Foreign Server so we can configure this AQ server.
Change JNDI Initial Context Factory to oracle.jms.AQjmsInitialContextFactory and we have to provide the jndi datasource name in the JNDI Properties field, For Example datasource=jdbc/scottDS

Create a JMS connection factory
As local JNDI name you can choose what you like. For Remote you have to choose one of these values. QueueConnectionFactory, TopicConnectionFactory, ConnectionFactory, XAQueueConnectionFactory, XATopicConnectionFactory or XAConnectionFactory

Now we can create a new Destination.
As Local JNDI name you can choose any name but as Remote JNDI it needs to start with Queues or Topics after that add a / with the database queue or topic name.

We are ready to use this AQ Queue in a Soa Suite Composite application. Where we will use the JMS adapter.
Select Oracle Advanced Queuing as OEMS

and select the Foreign Server Destination.

For more Weblogic AQ JMS details see the official documentation.