我正在开发 OSGi Mongodb 包我还添加了以下依赖项
- com.mongodb
- org.apache.felix.fileinstal
- org.amdatu.mongo
- org.apache.felix.configadmin
和所有依赖管理器,但在 gogo 控制台中,我收到以下错误消息
org.amdatu.mongo
org.osgi.service.cm.ManagedServiceFactory(service.pid=org.amdatu.mongo) registered
org.osgi.service.log.LogService service optional unavailable
[11] agenda.mongodb.mongo_gfs
agenda.mongo.inter.AgendaMongo() unregistered
org.amdatu.mongo.MongoDBService service required unavailable
主要问题是MongoDBService不可用我必须需要这个服务来解决这个问题我已经按照他们阅读了这本书
从开发的角度来看,一切似乎都很好,但是当你运行应用程序时,它会抱怨 MongoDBService 不可用。您可以使用 shell 中的 dm 命令解决此问题。然而,我们确实在我们的系统上设置了 MongoDB,并在我们的运行时部署了必要的依赖项。尽管如此,MongoDBService 还是无法启动。怎么来的?这是因为 MongoDBService 需要一些强制配置才能知道要连接到哪个数据库。Amdatu MongoDB 服务使用托管服务工厂模式(参见第 4 章),为了引导它,我们需要提供一个配置文件。为了提供配置文件,我们需要在我们的议程项目中创建一个新文件夹。创建一个名为 load 的新文件夹。这是运行时为了发现配置文件而查找的默认名称。接下来,添加一个空文本文件并将其命名为 org.amdatu.mongo-demo.xml。配置文件至少需要以下信息:dbName=demo
我也应用了这个,但它仍然不可用。
这是界面:
package agenda.mongo.inter;
import java.io.InputStream;
public interface AgendaMongo {
public String store_in_db();
public InputStream getData(Object file_id);
}
这是MongoDB的实现:
package agenda.mongodb.gridfs;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.UnknownHostException;
import org.amdatu.mongo.MongoDBService;
import org.bson.types.ObjectId;
import agenda.mongo.inter.AgendaMongo;
import com.mongodb.DB;
import com.mongodb.DBCursor;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
public class Gridfs_Mongodb implements AgendaMongo{
GridFSInputFile gfsinput=null;
private volatile MongoDBService mongoservice;
public String store_in_db() {
/*try {
GridFS gfsHandler;
gfsHandler = new GridFS(mongoservice.getDB(), "rest_data");// database
File uri = new File("f:\\get1.jpg"); // name and
gfsinput = gfsHandler.createFile(uri);
gfsinput.saveChunks(1000);
gfsinput.setFilename("new file");
gfsinput.save();
//System.out.println(gfsinput.getId());
//save_filepath("file",gfsinput.getId());
Object get_id = gfsinput.getId();//get_filename();
//System.out.println(getData(get_id));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
//System.out.println("Exception");
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
//System.out.println("Exception");
e.printStackTrace();
}*/
System.out.println("DB:" + mongoservice.getDB());
return mongoservice.getDB()+"";
}
/*
* Retrieving the file
*/
public InputStream getData(Object file_id) {
GridFS gfsPhoto = new GridFS(mongoservice.getDB(), "rest_data");
GridFSDBFile dataOutput = gfsPhoto.findOne((ObjectId) file_id);
DBCursor cursor = gfsPhoto.getFileList();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
System.out.println(dataOutput);
return dataOutput.getInputStream();
}
void start(){
System.out.println("hello");
System.out.println(store_in_db());
}
}
在这里,我只是想获取数据库名称,因为在那之后可以完成所有事情,但是我返回 NULL,因为MongoDBService
它不可用。
在这Activator
上课
package agenda.mongodb.gridfs;
import org.amdatu.mongo.MongoDBService;
import org.apache.felix.dm.DependencyActivatorBase;
import org.apache.felix.dm.DependencyManager;
import org.osgi.framework.BundleContext;
import agenda.mongo.inter.AgendaMongo;
public class Activator extends DependencyActivatorBase {
@Override
public void init(BundleContext arg0, DependencyManager manager)
throws Exception {
manager.add(createComponent()
.setInterface(AgendaMongo.class.getName(), null)
.setImplementation(Gridfs_Mongodb.class)
.add(createServiceDependency()
.setService(MongoDBService.class)
.setRequired(true)));
}
@Override
public void destroy(BundleContext arg0, DependencyManager arg1)
throws Exception {
// TODO Auto-generated method stub
}
}
接口包是导出包,实现包是私有的。