gpt4 book ai didi

java - maven-osgi 项目中的 EventAdmin 为空

转载 作者:行者123 更新时间:2023-12-02 06:19:56 25 4
gpt4 key购买 nike

我创建了一个 maven-osgi 项目,其中激活器应该发送 osgi 事件,但由于某种原因 EventAdmin 始终为空。

这是我的java类

package com.example.eventhandler;

import java.util.Dictionary;
import java.util.Hashtable;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;

public class App implements BundleActivator {
public void start(BundleContext context) throws Exception {
ServiceReference ref = context.getServiceReference(EventAdmin.class.getName());
if (ref != null) {
EventAdmin eventAdmin = (EventAdmin) context.getService(ref);
Dictionary properties = new Hashtable();

eventAdmin.sendEvent(new Event("com/acme/reportgenerator/GENERATED", properties));
} else {
System.out.println("Ref is null!!");
}
System.out.println("Hello World!!");
}

public void stop(BundleContext context) throws Exception {
System.out.println("Goodbye World!!");
}
}

这是我的 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>eventhandler</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>eventhandler</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<bundle.symbolicName>com.example</bundle.symbolicName>
<bundle.namespace>com.example</bundle.namespace>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.osgi</groupId>
<artifactId>org.eclipse.osgi</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.osgi.compendium</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<id>bundle-manifest</id>
<phase>process-classes</phase>
<goals>
<goal>manifest</goal>
</goals>
</execution>
</executions>
<configuration>
<manifestLocation>META-INF</manifestLocation>
<instructions>
<Bundle-SymbolicName>${bundle.symbolicName}</Bundle-SymbolicName>
<Bundle-Version>${pom.version}</Bundle-Version>
<Bundle-Activator>${bundle.namespace}.eventhandler.App</Bundle-Activator>
<Import-Package>
org.osgi.framework,
org.osgi.service.event
</Import-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>

EventAdmin 为空的原因可能是什么?

最佳答案

您在 OSGi 中实现了一个经典的反模式:您假设 EventAdmin 服务在您的 bundle 启动时就已经可用。这是一个本质上不安全的假设,因为您的 bundle 实际上可能在提供 EventAdmin 服务的 bundle 之前启动。

解决这个问题有错误的方法和正确的方法。错误的方法是坚持您的 bundle 必须在 EventAdmin 之后启动。这种方式会导致启动顺序依赖性和极度脆弱性。请参阅:http://wiki.osgi.org/wiki/Avoid_Start_Order_Dependencies

正确的方法是使用诸如声明性服务 (DS) 之类的框架来声明引用 EventAdmin 服务的 bundle 内的组件。然后 DS 将激活您的组件,并在 EventAdmin 实例可用时将其注入(inject)。请参阅:http://wiki.osgi.org/wiki/Declarative_Services

关于java - maven-osgi 项目中的 EventAdmin 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21100900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com