我開發OSGi包的MongoDB我還增加了以下依存如何讓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中的dmcommand來解決這個問題。 但是我們在我們的系統上設置了MongoDB,並在我們的運行時部署了必要的 依賴關係。儘管如此,MongoDBService仍然無法啓動 。怎麼來的?這是因爲MongoDBService需要一些 強制配置才能知道要連接哪個數據庫 。 Amdatu MongoDB服務使用託管服務工廠模式 (請參閱第4章),爲了引導它,我們需要提供一個 配置文件。爲了提供配置文件,我們需要 在我們的agendaproject中創建一個新文件夾。創建一個名爲load的新文件夾 。這是運行時將查找 以查找配置文件的默認名稱。接下來,添加一個空文本文件並將其稱爲org.amdatu.mongo-demo.xml。配置 文件至少需要以下信息:DBNAME =演示
我也將此但它仍然無法使用。
這是界面:
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());
}
}
在這裏,我只是想獲取數據庫的名字,因爲每一件事情可以以後做,但我T爲返回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
}
}
界面包是一個導出包和實現包是私有的。
我試過但沒有影響:( – Root
所以,一步一步,你需要調試它。這是文件安裝應該採取的。所以第一步是確保它確實。配置是否在Configuration Admin中結束?如果以編程方式將該配置放置在那裏,它是否工作?你在正確的道路上,但沒有分享你的實際代碼/項目,很難繼續猜測。 :) –
好吧,我添加我的代碼:) – Root