Статьи

Гессенский декларативный расширитель в SCA

Перед обучением 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 и объединил два расширителя по многим причинам:

  1. Старый гессианский сервис все еще работает.
  2. DHE может быть обновлен до SCA Extender для прослушивания различных сервисов и регистрации их в соответствии с целевым экстендером.
  3. ОН может быть модернизирован независимо.

Вывод :

OSGI 4.2 представляет RFC 119 — Распределенная реализация OSGi и Apache CXF. Я думаю добавить JAX-WS в список расширителей как гессиан и иметь эту архитектуру?