{anchor:extended-service}
As EasyVIPER is an extensible engine, it is possible to add specific services, thanks to the {{com.ebmwebsourcing.easyviper.core.api.engine.thread.service.Service}} interface.
To create a new extended service, the basic thing is to develop a class implementing this interface, and then to add the service to a core instance of EasyVIPER.
A good way to perform this task follows these steps:
* Create an interface that extends Service with specific operations
{code:title=MyExtendedService.java|borderStyle=solid}
import com.ebmwebsourcing.easyviper.core.api.engine.thread.service.Service;
public interface MyExtendedService extends Service {
// Some specific stuff
}
{code}
* Create the class implementing {{MyExtendedService}} and extending the utility abstract class {{AbstractServiceImpl}}:
{code:title=MyExtendedServiceImpl.java|borderStyle=solid}
import com.ebmwebsourcing.easyviper.core.api.engine.thread.service.AbstractServiceImpl;
import mypackage.MyExtendedService;
public class MyExtendedServiceImpl extends AbstractServiceImpl implements
MyExtendedService {
public MyExtendedServiceImpl(Engine engine) {
super(engine);
// Some specific stuff
}
@Override
public void run() {
try {
Thread.sleep(this.getRefreshFrequency());
// Some specific stuff
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
{code}
The method {{run()}} can be filled as in the example for a by default behaviour.
Once done the new {{MyExtendedServiceImpl}} service can be added to EasyVIPER core with the following code:
{code}
...
import com.ebmwebsourcing.easyviper.core.api.engine.configuration.ConfigurationEngine;
import com.ebmwebsourcing.easyviper.core.impl.engine.configuration.ConfigurationEngineImpl;
import com.ebmwebsourcing.easyviper.core.api.soa.message.MessageConverter;
import java.util.logging.Logger;
...
ConfigurationEngine conf = new ConfigurationEngineImpl();
/** Add extended service **/
conf.getAdditionnalServices().add(MyExtendedServiceImpl.class);
...
MessageConverter converter = new ...
Logger logger = new ...
...
Core core = BPELFactoryImpl.getInstance().newBPELEngine(conf, converter, 10,
MyReceiverImpl.class, 10, MySenderImpl.class, logger);
{code}
In order to call methods of the extended service you can use the following code:
{code}
MyExtendedService myService = core.getEngine().getServiceManager().getService(MyExtendedServiceImpl.class);
myService.callMyOperation();
{code}
Finally a good way to conceive an extended service is to start from a formal description of its interface, with a WSDL definition for example.
Then, the corresponding Java interface can be generated thanks to CXF wsdl2java facilities. The interface of {{MyExtendedService}} is then extending the EasyVIPER service and the description interface:
{code:title=MyExtendedService.java|borderStyle=solid}
import com.ebmwebsourcing.easyviper.core.api.engine.thread.service.Service;
import generated.mypackage.MyServiceDescription;
public interface MyExtendedService extends MyServiceDescription, Service {
// Some specific stuff
}
{code}
The implementation class development is then led by the formal description.
As EasyVIPER is an extensible engine, it is possible to add specific services, thanks to the {{com.ebmwebsourcing.easyviper.core.api.engine.thread.service.Service}} interface.
To create a new extended service, the basic thing is to develop a class implementing this interface, and then to add the service to a core instance of EasyVIPER.
A good way to perform this task follows these steps:
* Create an interface that extends Service with specific operations
{code:title=MyExtendedService.java|borderStyle=solid}
import com.ebmwebsourcing.easyviper.core.api.engine.thread.service.Service;
public interface MyExtendedService extends Service {
// Some specific stuff
}
{code}
* Create the class implementing {{MyExtendedService}} and extending the utility abstract class {{AbstractServiceImpl}}:
{code:title=MyExtendedServiceImpl.java|borderStyle=solid}
import com.ebmwebsourcing.easyviper.core.api.engine.thread.service.AbstractServiceImpl;
import mypackage.MyExtendedService;
public class MyExtendedServiceImpl extends AbstractServiceImpl implements
MyExtendedService {
public MyExtendedServiceImpl(Engine engine) {
super(engine);
// Some specific stuff
}
@Override
public void run() {
try {
Thread.sleep(this.getRefreshFrequency());
// Some specific stuff
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
{code}
The method {{run()}} can be filled as in the example for a by default behaviour.
Once done the new {{MyExtendedServiceImpl}} service can be added to EasyVIPER core with the following code:
{code}
...
import com.ebmwebsourcing.easyviper.core.api.engine.configuration.ConfigurationEngine;
import com.ebmwebsourcing.easyviper.core.impl.engine.configuration.ConfigurationEngineImpl;
import com.ebmwebsourcing.easyviper.core.api.soa.message.MessageConverter;
import java.util.logging.Logger;
...
ConfigurationEngine conf = new ConfigurationEngineImpl();
/** Add extended service **/
conf.getAdditionnalServices().add(MyExtendedServiceImpl.class);
...
MessageConverter converter = new ...
Logger logger = new ...
...
Core core = BPELFactoryImpl.getInstance().newBPELEngine(conf, converter, 10,
MyReceiverImpl.class, 10, MySenderImpl.class, logger);
{code}
In order to call methods of the extended service you can use the following code:
{code}
MyExtendedService myService = core.getEngine().getServiceManager().getService(MyExtendedServiceImpl.class);
myService.callMyOperation();
{code}
Finally a good way to conceive an extended service is to start from a formal description of its interface, with a WSDL definition for example.
Then, the corresponding Java interface can be generated thanks to CXF wsdl2java facilities. The interface of {{MyExtendedService}} is then extending the EasyVIPER service and the description interface:
{code:title=MyExtendedService.java|borderStyle=solid}
import com.ebmwebsourcing.easyviper.core.api.engine.thread.service.Service;
import generated.mypackage.MyServiceDescription;
public interface MyExtendedService extends MyServiceDescription, Service {
// Some specific stuff
}
{code}
The implementation class development is then led by the formal description.