OSGi - 从不同的捆绑包注册服务

时间:2014-12-29 10:19:19

标签: java osgi blueprint-osgi

我最近开始学习OSGi。在尝试使用Apache Aries和OSGi蓝图时,我创建了以下设置: 捆绑A:

public interface IMessageSender {
    String send(String message);
    String getServiceName();
}

public interface IMessageSenderFactory {
    String name();
    IMessageSender create();
}

捆绑包B(SMSSenderFactory作为服务导出):

public class SMSSender implements IMessageSender {

    public String send(String message) {
        return "Sent by SMS : "+message;
    }

    public String getServiceName() {
        return "SMS";
    }
}

public class SMSSenderFactory implements IMessageSenderFactory {

    public String name() {
        return "SMS";
    }

    public IMessageSender create() {
        return new SMSSender();
    }

}

捆绑C:

public class BundleManagerImpl implements BundleManager{

    BundleContext bundleContext;

    Map<IMessageSenderFactory, List<ServiceRegistration>> senders = new HashMap<IMessageSenderFactory, List<ServiceRegistration>>();


    public void setBundleContext(BundleContext bundleContext) {
        this.bundleContext = bundleContext;
    }
    //reference listener method
    public void addSenderFactory(IMessageSenderFactory senderFactory) {
        this.senders.put(senderFactory, new ArrayList<ServiceRegistration>());
    }
    //reference listener method
    public void removeSenderFactory(IMessageSenderFactory senderFactory){
        List<ServiceRegistration> registeredSenders = this.senders.get(senderFactory);
        if (registeredSenders != null){
            for (ServiceRegistration serviceRegistration : registeredSenders) {
                serviceRegistration.unregister();
            }
        }
        this.senders.remove(senderFactory);
    }

    @Override
    public List<String> listFactories(){
        List<String> list = new ArrayList<String>();
        for (IMessageSenderFactory senderFactory : senders.keySet()) {
            list.add(senderFactory.name());
        }
        return list;
    }

    @Override
    public void createSenderServiceInstance(String type){
        IMessageSender sender = null;
        for (IMessageSenderFactory senderFactory : senders.keySet()) {
            if (senderFactory.name().equals(type)){
                sender = senderFactory.create();
                ServiceRegistration registration = bundleContext.registerService(IMessageSender.class.getName(), sender, null);
                this.senders.get(senderFactory).add(registration);
            }
        }               
    }
}

捆绑D:

public class MessageServiceImpl implements MessageService {

    List<IMessageSender> senders = new ArrayList<IMessageSender>();
    //reference listener method
    public void addSender(IMessageSender sender) {
        this.senders.add(sender);
    }
    //reference listener method
    public void removeSender(IMessageSender sender){
        this.senders.remove(sender);
    }

    public List<String> send(String message) {
        List<String> list = new ArrayList<String>();
        for (IMessageSender sender : this.senders) {
            String response = sender.send(message);
            list.add(MessageFormat.format("Sent by : {0}; Response : {1}", sender.getServiceName(), response));
        }
        return list;
    }
}

目标是允许创建多个可变数量的SMSSender服务实例。 所以我的问题是:

1 - 这种方法有什么问题吗?我正在捆绑包B中创建一个SMSSender实例,并将其注册为捆绑包C中的服务。这是否会导致任何问题或者是否违反任何OSGi规则?

2 - 是否还有其他方法可以达到同一目标?

编辑:

捆绑E(稍后添加,将EmailSenderFactory导出为服务)

public class EmailSender implements IMessageSender {

    public String send(String message) {
        return "Sent by Email : "+message;
    }

    public String getServiceName() {
        return "Email";
    }
}

public class EmailSenderFactory implements IMessageSenderFactory {

    public String name() {
        return "Email";
    }

    public IMessageSender create() {
        return new EmailSender();
    }

}

0 个答案:

没有答案