...
Include Page | |||
---|---|---|---|
|
|
...
Wiki Markup |
---|
{html}
<div class="content">
{html} |
...
Using
...
Distributed
...
Services
...
with
...
iPOJO
...
Distributed
...
Service
...
defines
...
how
...
to
...
deal
...
with
...
remote
...
services
...
in
...
OSGi.
...
This
...
page
...
describes
...
the
...
CXF
...
Distributed
...
OSGi
...
with
...
iPOJO
...
demo.This
...
demo
...
uses
...
iPOJO
...
to
...
create
...
a
...
remote
...
OSGi
...
service
...
from
...
an
...
iPOJO
...
component.
...
The
...
consumer
...
side
...
also
...
uses
...
iPOJO
...
to
...
create
...
a
...
component
...
that
...
consumes
...
the
...
remote
...
OSGi
...
service.
...
By
...
using
...
iPOJO,
...
you
...
don't
...
need
...
to
...
write
...
code
...
to
...
interact
...
with
...
the
...
OSGi
...
Service
...
Registry
...
at
...
all.
...
That's
...
all
...
handled
...
through
...
injection,
...
which
...
hugely
...
simplifies
...
the
...
code.
...
Moreover
...
thanks
...
to
...
iPOJO's
...
advanced
...
features
...
such
...
as
...
property
...
propagation,
...
the
...
service
...
is
...
exported
...
without
...
any
...
impact
...
on
...
its
...
implementation.
...
In
...
this
...
demo,
...
you
...
will
...
show
...
how
...
to
...
use
...
iPOJO:
...
- to
...
- expose
...
- a
...
- service
...
- to
...
- propagate
...
- properties
...
- to
...
- make
...
- the
...
- service
...
- remotely
...
- accessible
...
- to
...
- use
...
- a
...
- "remote"
...
- service
...
This
...
demo
...
can
...
be
...
used
...
with
...
any
...
DOSGi
...
distribution,
...
in
...
this
...
document
...
the
...
single-bundle
...
distribution
...
(1.1)
...
is
...
used
...
with
...
iPOJO
...
1.6.0
...
and
...
Felix
...
(2.0.5)
Wiki Markup |
---|
{div:class=toc} {toc:maxLevel=4|minLevel=2} {div} h2. |
Demo
...
design
...
This
...
demo
...
is
...
quite
...
similar
...
to
...
the
...
DS
...
demo
...
of
...
DOSGi
...
demo
...
in
...
structure.
...
It
...
consists
...
of
...
5
...
bundles:
...
- An
...
- interface
...
- bundle
...
- defining
...
- the
...
- Adder
...
- Service
...
- interface.
...
- This
...
- bundle
...
- is
...
- deployed
...
- on
...
- both
...
- sides.
...
- An
...
- Adder
...
- Service
...
- implementation
...
- bundle.
...
- (The
...
- service
...
- will
...
- be
...
- exported)
...
- An
...
- Adder
...
- Service
...
- importer
...
- bundle
...
- containing
...
- the
...
- remote-service
...
- file
...
- explaining
...
- to
...
- DOSGi
...
- how
...
- to
...
- import
...
- and
...
- from
...
- where
...
- to
...
- import
...
- the
...
- Adder
...
- service.
...
- An
...
- Adder
...
- Service
...
- consumer
...
- bundle.
The service implementation and consumer bundle are built using iPOJO.
The Adder Service interface is as follows:
Code Block |
---|
!design.png! The service implementation and consumer bundle are built using iPOJO. The Adder Service interface is as follows: {code} public interface AdderService { int add(int a,int b); } {code} h2. Sources The sources and a |
Sources
The sources and a pre-configured
...
version
...
of
...
Felix
...
are
...
available
...
in
...
the
...
...
...
.
...
Once
...
downloaded
...
unzip
...
the
...
archive.
...
To
...
compile,
...
run
...
from
...
the
...
root
...
:
...
mvn
...
clean
...
install
...
.
...
To
...
run
...
the
...
application.
...
go
...
to
...
the
...
felix
...
directory
...
containing
...
a
...
pre-configured
...
Felix.
...
The
...
Adder
...
Service
...
Implementation
...
The
...
service
...
implementation
...
is
...
a
...
simplistic
...
implementation
...
of
...
the
...
Adder
...
service,
...
which
...
is
...
instantiated
...
as
...
an
...
iPOJO
...
component.
...
This
...
implementation
...
uses
...
annotations
...
to
...
define
...
its
...
component
...
type.
...
The
...
@provides
...
annotation
...
just
...
says
...
that
...
it
...
provides
...
a
...
service.
...
Moreover,
...
the
...
propagation=true
...
attribute
...
enables
...
property
...
propagation.
...
In
...
the
...
...
file,
...
an
...
instance
...
of
...
the
...
component
...
type
...
is
...
declared.
...
Note
...
that
...
this
...
instance
...
declaration
...
defines
...
three
...
properties
...
used
...
by
...
DOSGi
...
to
...
exports
...
the
...
service.
...
These
...
properties
...
instruct
...
Distributed
...
OSGi
...
into
...
making
...
the
...
service
...
available
...
on
...
...
Those
...
properties
...
are
...
not
...
declared
...
in
...
the
...
component
...
type
...
itself.
...
Indeed,
...
the
...
component
...
type
...
enables
...
property
...
propagation;
...
so
...
all
...
defined
...
properties
...
will
...
be
...
published
...
on
...
exported
...
services.
...
This
...
propagation
...
also
...
works
...
with
...
the
...
configuration
...
admin.
...
This
...
feature
...
is
...
pretty
...
nice,
...
as
...
it
...
does
...
not
...
impact
...
the
...
component
...
implementation
...
and
...
its
...
description.
Code Block | ||||
---|---|---|---|---|
| ||||
{code:xml} <instance component="org.apache.felix.ipojo.remote.adder.impl.AdderServiceImpl"> <property name="osgi.remote.interfaces"value="*"/> <property name="osgi.remote.configuration.type"value="pojo"/> <property name="osgi.remote.configuration.pojo.address"value="http://localhost:9090/adder"/> </instance> {code} |
So
...
let's
...
install
...
the
...
server
...
side
...
in
...
Felix.
...
Launch
...
Felix
...
from
...
the
...
felix
...
directory
...
with:
Wiki Markup |
---|
{div:class=shell} java -jar bin/felix.jar server {div} |
Once
...
the
...
shell
...
prompt
...
appears,
...
execute
...
the
...
following
...
command
...
in
...
the
...
shell:
Wiki Markup |
---|
{div:class=shell} start file:../AdderServiceInterface/target/AdderServiceInterface-0.0.1-SNAPSHOT.jar start file:../AdderServiceProvider/target/AdderServiceProvider-0.0.1-SNAPSHOT.jar {div} |
At
...
this
...
point,
...
the
...
service
...
should
...
be
...
available
...
remotely
...
(wait
...
until
...
the
...
console
...
stops
...
printing
...
stuff),
...
you
...
can
...
check
...
this
...
by
...
obtaining
...
the
...
WSDL:
...
http://localhost:9090/adder?wsdl
The Adder Service Consumer
The service consumer is also created using iPOJO. Thanks to DOSGi, iPOJO can inject the service as any regular OSGi service. So, the code is pretty simple:
Code Block | ||||
---|---|---|---|---|
| ||||
] !wsdl.png|width=600px! h2. The Adder Service Consumer The service consumer is also created using iPOJO. Thanks to DOSGi, iPOJO can inject the service as any regular OSGi service. So, the code is pretty simple: {code:java} @Component public class AdderConsumer { @Requires private AdderService adder; public AdderConsumer() { System.out.println("Using adder service: 1 + 1 = "+ adder.add(1, 1)); } } {code} |
This
...
implementation
...
use
...
iPOJO
...
field
...
injection
...
to
...
receive
...
the
...
AdderService.
...
Then,
...
it
...
uses
...
it
...
as
...
a
...
regular
...
field.
...
This
...
bundle
...
also
...
contains
...
a
...
...
file
...
declaring
...
an
...
instance
...
of
...
this
...
type
...
without
...
any
...
special
...
configuration:
Code Block | ||||
---|---|---|---|---|
| ||||
{code:xml} <instance component="org.apache.felix.ipojo.remote.consumer.AdderConsumer"/> {code} |
However,
...
now
...
we
...
have
...
to
...
tell
...
to
...
DOSGi
...
to
...
import
...
our
...
Adder
...
service.
...
To
...
achieve
...
that,
...
we
...
create
...
a
...
very
...
simple
...
bundle
...
that
...
just
...
contains
...
the
...
...
file.
...
This
...
file
...
is
...
analyzed
...
by
...
CXF
...
in
...
order
...
to
...
import
...
the
...
service.
Code Block | ||||
---|---|---|---|---|
| ||||
{code:xml} <service-descriptions xmlns="http://www.osgi.org/xmlns/sd/v1.0.0"> <service-description> <provide interface="org.apache.cxf.dosgi.samples.ds.AdderService"/> <property name="osgi.remote.interfaces">*</property> <property name="osgi.remote.configuration.type">pojo</property> <property name="osgi.remote.configuration.pojo.address">http://localhost:9090/adder</property> </service-description> </service-descriptions> {code} |
Now,
...
let's
...
start
...
another
...
instance
...
of
...
Felix:
Wiki Markup |
---|
{div:class=shell} java -jar bin/felix.jar client {div} |
Then,
...
execute
...
the
...
following
...
command
...
in
...
the
...
shell:
Wiki Markup |
---|
{div:class=shell} start file:../AdderServiceInterface/target/AdderServiceInterface-0.0.1-SNAPSHOT.jar start file:../AdderServiceConsumer/target/AdderServiceConsumer-0.0.1-SNAPSHOT.jar start file:../AdderServiceImporter/target/AdderServiceImporter-0.0.1-SNAPSHOT.jar ... log messages may appear, after a little while the following message appears: Using adder service: 1 + 1 = 2 {div} |
The
...
remote
...
adder
...
service
...
has
...
now
...
been
...
invoked.
...
You
...
will
...
see
...
the
...
following
...
line
...
on
...
the
...
server
...
side
...
window:
Code Block |
---|
} Adder service invoked: 1 + 1 = 2 {code} |
That's
...
it
...
!
...
Conclusion
This tutorial has illustrated how to easily create remote services and consume them with iPOJO. Subscribe to the Felix users mailing list by sending a message to users-subscribe@felix.apache.org
...
;
...
after
...
subscribing,
...
...
questions
...
or
...
feedback
...
to
...
...
.
Include Page | ||||
---|---|---|---|---|
|
...