I have just come up with a example for Spring integration along with OSgi.
I basically have 4 bundles
1. Exchange bundle which has definitions of channels
This bundle is spring integration aware, and hence has channel definitions in it.
Channel definition.
<publish-subscribe-channel id="login"/>
This channl is wrapped around a gateway and exposed as a OSGi service.This is to ensure that the event generating bundle is unaware of spring integration apis
Wrapping channel around gateway
<gateway id="loginProxy" default-request-channel="login"
service-interface="com.pg.exchange.event.IEvent" />
Exposing gateway as OSGi service
<osgi:service id="loginChannel" ref="loginProxy"
interface="com.pg.exchange.event.IEvent" />
Also the channel is directly published as a OSGi service for listener listening to it.
<osgi:service id="loginAnnouncementsChannel" ref="login"
interface="org.springframework.integration.channel.SubscribableChannel" />
2. Login bundle - bundle which generate login event and publishes it using gateway.
Accepting the Gateway from the exchange bundle as a OSgi service
<osgi:reference id="eventPublisher"
interface="com.pg.exchange.event.IEvent"/>
This bundle generates periodic events using a spring timer task as shown below
<bean id="logineventGenerator" class="com.pg.ara.LoginEventGenerator">
<property name="eventPublisher" ref="eventPublisher"></property>
</bean>
<bean id="loginTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="period" value="10000" />
<property name="timerTask" ref="logineventGenerator" />
</bean>
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="loginTask" />
</list>
</property>
</bean>
Timer Task class generating events
public class LoginEventGenerator extends TimerTask {
IEvent eventPublisher;
public void setEventPublisher(IEvent eventPublisher) {
this.eventPublisher = eventPublisher;
}
@Override
public void run() {
System.out.println("login event published");
eventPublisher.login("Logged In");
}
}
3. Pam-proxy bundle is a bundle which listens to the event using OSGi refered pub-sub-channel
When the message is obtained it makes a spring remoting call uisng remoting adaptors
Consumed OSGi service
<osgi:reference id="loginAnnouncementsChannel"
interface="org.springframework.integration.channel.SubscribableChannel"/>
Activator which makes a remoting call when message is put on a channel
<si:service-activator input-channel="loginAnnouncementsChannel"
ref="exampleService"
method="testRemoting"
output-channel="responseChannel"/>
Channel which gets the spring remoting response
<si:channel id="responseChannel" />
Activator listening on the response
<si:service-activator input-channel="responseChannel"
ref="responseHandler"
method="handleResponse" />
ProxyFactory bean for making spring remoting call
<bean id="exampleService"
class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean" >
< property name="serviceUrl" value="http://localhost:8088/test/pamService" />
< property name="serviceInterface" value="com.pam.external.IExampleService" />
</bean>
Response handler for the spring remoting call
<bean id="responseHandler" class="com.pam.proxy.sample.ResponseHandler" />
All the above bean can be avoided and instead we can use http-invoker inbound and outbound adaptors as explained in spring integration reference guide.
But i did not want the spring remoting hosting side to be unaware of spring integration.
Also i did not want to put any java code in the pam-proxy bundle.
4. Pam web bundle publishing a spring remoting service
<bean id="exampleProxy" class="com.pam.ExampleService" />
<bean name="/pamService"
class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="exampleProxy" />
<property name="serviceInterface" value="com.pam.external.IExampleService" />
</bean>
Source Code Location :http://www.4shared.com/dir/18401573/8c9d7e8d/springintosgiremoting.html
I basically have 4 bundles
1. Exchange bundle which has definitions of channels
This bundle is spring integration aware, and hence has channel definitions in it.
Channel definition.
<publish-subscribe-channel id="login"/>
This channl is wrapped around a gateway and exposed as a OSGi service.This is to ensure that the event generating bundle is unaware of spring integration apis
Wrapping channel around gateway
<gateway id="loginProxy" default-request-channel="login"
service-interface="com.pg.exchange.event.IEvent" />
Exposing gateway as OSGi service
<osgi:service id="loginChannel" ref="loginProxy"
interface="com.pg.exchange.event.IEvent" />
Also the channel is directly published as a OSGi service for listener listening to it.
<osgi:service id="loginAnnouncementsChannel" ref="login"
interface="org.springframework.integration.channel.SubscribableChannel" />
2. Login bundle - bundle which generate login event and publishes it using gateway.
Accepting the Gateway from the exchange bundle as a OSgi service
<osgi:reference id="eventPublisher"
interface="com.pg.exchange.event.IEvent"/>
This bundle generates periodic events using a spring timer task as shown below
<bean id="logineventGenerator" class="com.pg.ara.LoginEventGenerator">
<property name="eventPublisher" ref="eventPublisher"></property>
</bean>
<bean id="loginTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="period" value="10000" />
<property name="timerTask" ref="logineventGenerator" />
</bean>
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="loginTask" />
</list>
</property>
</bean>
Timer Task class generating events
public class LoginEventGenerator extends TimerTask {
IEvent eventPublisher;
public void setEventPublisher(IEvent eventPublisher) {
this.eventPublisher = eventPublisher;
}
@Override
public void run() {
System.out.println("login event published");
eventPublisher.login("Logged In");
}
}
3. Pam-proxy bundle is a bundle which listens to the event using OSGi refered pub-sub-channel
When the message is obtained it makes a spring remoting call uisng remoting adaptors
Consumed OSGi service
<osgi:reference id="loginAnnouncementsChannel"
interface="org.springframework.integration.channel.SubscribableChannel"/>
Activator which makes a remoting call when message is put on a channel
<si:service-activator input-channel="loginAnnouncementsChannel"
ref="exampleService"
method="testRemoting"
output-channel="responseChannel"/>
Channel which gets the spring remoting response
<si:channel id="responseChannel" />
Activator listening on the response
<si:service-activator input-channel="responseChannel"
ref="responseHandler"
method="handleResponse" />
ProxyFactory bean for making spring remoting call
<bean id="exampleService"
class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean" >
< property name="serviceUrl" value="http://localhost:8088/test/pamService" />
< property name="serviceInterface" value="com.pam.external.IExampleService" />
</bean>
Response handler for the spring remoting call
<bean id="responseHandler" class="com.pam.proxy.sample.ResponseHandler" />
All the above bean can be avoided and instead we can use http-invoker inbound and outbound adaptors as explained in spring integration reference guide.
But i did not want the spring remoting hosting side to be unaware of spring integration.
Also i did not want to put any java code in the pam-proxy bundle.
4. Pam web bundle publishing a spring remoting service
<bean id="exampleProxy" class="com.pam.ExampleService" />
<bean name="/pamService"
class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="exampleProxy" />
<property name="serviceInterface" value="com.pam.external.IExampleService" />
</bean>
Source Code Location :http://www.4shared.com/dir/18401573/8c9d7e8d/springintosgiremoting.html
No comments:
Post a Comment