2014-07-21 14 views
0

我開發OSGi包的MongoDB我還增加了以下依存如何讓MongoDB服務可用?

  1. com.mongodb
  2. org.apache.felix.fileinstal
  3. org.amdatu.mongo
  4. 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 

    } 
} 

界面包是一個導出包和實現包是私有的。

回答

2

配置文件應該有一個.cfg擴展名(不是.xml)。

+0

我試過但沒有影響:( – Root

+0

所以,一步一步,你需要調試它。這是文件安裝應該採取的。所以第一步是確保它確實。配置是否在Configuration Admin中結束?如果以編程方式將該配置放置在那裏,它是否工作?你在正確的道路上,但沒有分享你的實際代碼/項目,很難繼續猜測。 :) –

+0

好吧,我添加我的代碼:) – Root