首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使MongoDB服务可用?

如何使MongoDB服务可用?
EN

Stack Overflow用户
提问于 2014-07-21 11:24:26
回答 1查看 589关注 0票数 0

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

  1. com.mongodb
  2. org.apache.felix.fileinstal
  3. org.amdatu.mongo
  4. org.apache.felix.configadmin

以及所有依赖项管理器,但在gogo控制台中,我得到以下错误消息:

代码语言:javascript
复制
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中的in命令解决这个问题。但是,我们确实在系统上设置了MongoDB,并在运行时部署了必要的依赖项。尽管如此,MongoDBService还是无法启动。怎么会这样?这是因为MongoDBService需要一些强制配置,以便知道要连接到哪个数据库。Amdatu MongoDB服务使用托管服务工厂模式(参见第4章),为了引导它,我们需要提供一个配置文件。为了提供配置文件,我们需要在议程项目中创建一个新文件夹。创建一个名为load的新文件夹。这是运行库将查找的默认名称,以便发现配置文件。接下来,添加一个空文本文件,并将其命名为org.amdatu.mongo-demo.xml。配置文件至少需要以下信息: dbName=demo

我也应用了这一点,但它仍然不可用。

这是接口:

代码语言:javascript
复制
package agenda.mongo.inter;
import java.io.InputStream;

public interface AgendaMongo {
   public String store_in_db();
   public InputStream getData(Object file_id);
}

这是Mongodb的实现:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

    }
}

接口包是导出的包,实现包是私有的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-22 08:55:25

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24863893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档