Перед обучением SCA я обсуждал с одним из моих коллег информацию о расширителе Hessian . Мы должны экспортировать наши сервисы OSGI вне контейнера в стиле SCA, без необходимости создавать явный прокси. С помощью расширителя Hessian нам нужно расширить HessainServlet, который не является чистым решением, где реализация службы должна ссылаться на пакет Hessian как импорт.
Цель этой статьи — включить декларативный экспорт сервиса Hessian, добавив еще один расширитель.
Расширитель Hessian имеет следующее описание:
S: реализация службы и расширяет com.caucho.hessian.server.HessianServlet
HE: расширитель Hessian расширяет HessianServlet до сервлета
SE: расширитель сервлета публикует зарегистрированный сервлет
C: клиент службы не OSGi.
Я предлагаю добавить третий расширитель следующим образом:
S: служба подразумевает и реализует IService без отношения к HessianServlet.
DHE: декларативный расширитель, чтобы включить декларативную моду услуги SCA для
других пакетов: все тот же.
Вернуться к нашему сервису:
package com.jtunisie.osgi.hessain.sca.service;
import com.jtunisie.osgi.hessian.IService;
import com.jtunisie.osgi.hessian.exceptions.ServiceException;
public class Service implements IService {
@Override
public String execute() throws ServiceException {
return "jTunisie";
}
}
Чтобы зарегистрировать этот сервис (используя Spring DM), мы добавляем, что наш сервис будет опубликован вне контейнера с использованием Hessian с использованием свойства сервиса OSGi:
<osgi:service interface="com.jtunisie.osgi.hessian.IService" ref="service">
<osgi:service-properties>
<entry key="url" value="/jtunisie"/>
<entry key="publish" value="hessian"/>
</osgi:service-properties>
</osgi:service>
DHE будет прослушивать сервисы со свойством publish = Hessian и в качестве расширителя создаст сервлет Hessian для публикации и регистрации расширителем Hessian.
Проект реализации:
import com.caucho.hessian.server.HessianServlet;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Dictionary;
import java.util.Properties;
import java.util.Set;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
/**
*
* @author slim
*/
public class SCAServiceListner implements BundleActivator, ServiceListener {
@Override
public void serviceChanged(ServiceEvent serviceEvent) {
System.out.println("SERVICE CHANGED");
String[] objectClass = (String[]) serviceEvent.getServiceReference().getProperty("objectClass");
if (serviceEvent.getType() == ServiceEvent.REGISTERED) {
System.out.println(
"Service of type " + objectClass[0] + " registered.");
ServiceReference serviceReference = serviceEvent.getServiceReference();
Object service = bundleContext.getService(serviceReference);
HessianServlet hessianServlet = new SCAHessianServlet(service.getClass(), service);
String url = (String) serviceReference.getProperty("url");
Dictionary p = new Properties();
p.put("url", url);
bundleContext.registerService("com.caucho.hessian.server.HessianServlet", hessianServlet, p);
} else if (serviceEvent.getType() == ServiceEvent.UNREGISTERING) {
System.out.println(
"Ex1: Service of type " + objectClass[0] + " unregistered.");
} else if (serviceEvent.getType() == ServiceEvent.MODIFIED) {
System.out.println(
"Ex1: Service of type " + objectClass[0] + " modified.");
}
}
BundleContext bundleContext;
@Override
public void start(BundleContext bundleContext) throws Exception {
bundleContext.addServiceListener(this, "(publish=hessian)");
this.bundleContext = bundleContext;
System.out.println("SERVICE STARTED");
}
@Override
public void stop(BundleContext bundleContext) throws Exception {
bundleContext.removeServiceListener(this);
}
class SCAHessianServlet extends HessianServlet {
private static final long serialVersionUID = 3332768885321918511L;
private final Object object;
public SCAHessianServlet(Class clazz, Object object) {
this.object = object;
this.setAPIClass(clazz);
this.setService(object);
}
}
}
Таким образом, Hessian не нужен в качестве зависимости для нашего сервиса, так как DHE сделает это для нас. Я не удалил расширитель Hessian и объединил два расширителя по многим причинам:
- Старый гессианский сервис все еще работает.
- DHE может быть обновлен до SCA Extender для прослушивания различных сервисов и регистрации их в соответствии с целевым экстендером.
- ОН может быть модернизирован независимо.
Вывод :
OSGI 4.2 представляет RFC 119 — Распределенная реализация OSGi и Apache CXF. Я думаю добавить JAX-WS в список расширителей как гессиан и иметь эту архитектуру?