如何使MongoDB服务可用?

时间:2014-07-21 11:24:26

标签: java mongodb osgi-bundle bndtools amdatu

我正在开发OSGi Mongodb软件包我还添加了以下依赖项

  1. com.mongodb
  2. org.apache.felix.fileinstal
  3. org.amdatu.mongo
  4. org.apache.felix.configadmin
  5. 和所有依赖项管理器但在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 Service使用托管服务工厂模式   (见第4章),为了引导它,我们需要提供一个   配置文件。为了提供配置文件,我们需要   在我们的agendaproject中创建一个新文件夹。新建一个文件夹   叫负载。这是运行时将查找的默认名称   为了发现配置文件。接下来,添加一个空文本文件和   称之为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());
        }
    
    
    }
    

    这里我只是试图获取数据库名称,因为之后可以完成所有事情,但是因为MongoDBService不可用而我返回NULL。

    这是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
    
        }
    }
    

    Interface包是一个导出的包,实现包是私有的。

1 个答案:

答案 0 :(得分:2)

配置文件应该有.cfg扩展名(不是.xml)。