All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.frameworkset.nosql.mongodb.MongoDB Maven / Gradle / Ivy

Go to download

support session share between application cluster nodes and cross domain application nodes.support good application session monitor and session data statitic module.demo site http://session.bbossgroups.com/

There is a newer version: 6.2.8
Show newest version
package org.frameworkset.nosql.mongodb;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.frameworkset.util.StringUtil;
import com.mongodb.Bytes;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientOptions.Builder;
import com.mongodb.MongoCredential;
import com.mongodb.ReadPreference;
import com.mongodb.ServerAddress;
import com.mongodb.WriteConcern;
import com.mongodb.WriteConcernException;
import com.mongodb.WriteResult;


public class MongoDB {
	private static Method autoConnectRetryMethod;
	static{
		try {
			autoConnectRetryMethod = Builder.class.getMethod("autoConnectRetry", boolean.class);
		} catch (NoSuchMethodException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
		} catch (SecurityException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
		}
	}
	private static Logger log = Logger.getLogger(MongoDB.class);
	private String serverAddresses;
	private String option;
	private String writeConcern;
	private String readPreference;
	private Mongo mongoclient;
	private String mode = null;
	private boolean autoConnectRetry = true;
	private int connectionsPerHost = 500;
	private int maxWaitTime = 120000;
	private int socketTimeout = 0;
	private int connectTimeout = 15000;
	private int threadsAllowedToBlockForConnectionMultiplier = 50;
	private boolean socketKeepAlive = true;
	private List credentials;
	private List mongoCredentials;
	public Mongo getMongoClient()
	{
	
//		try {
//			Mongo mongoClient = new Mongo(Arrays.asList(new ServerAddress("10.0.15.134", 27017),
//					new ServerAddress("10.0.15.134", 27018),
//			                                      new ServerAddress("10.0.15.38", 27017),new ServerAddress("10.0.15.39", 27017)
//			                                      ));
//			mongoClient.addOption( Bytes.QUERYOPTION_SLAVEOK );
//			mongoClient.setWriteConcern(WriteConcern.JOURNAL_SAFE);
////	ReadPreference.secondaryPreferred();
//			mongoClient.setReadPreference(ReadPreference.nearest());
////			mongoClient.setReadPreference(ReadPreference.primaryPreferred());
//			return mongoClient;
//		} catch (Exception e) {
//			throw new java.lang.RuntimeException(e);
//		} 
		return mongoclient;
	}
	
	private List parserAddress() throws NumberFormatException, UnknownHostException
	{
		if(StringUtil.isEmpty(serverAddresses))
			return null;
		
		serverAddresses = serverAddresses.trim();
		List trueaddresses = new ArrayList();
		if(mode != null && mode.equals("simple"))
		{
			String info[] = serverAddresses.split(":");
			ServerAddress ad = new ServerAddress(info[0].trim(),Integer.parseInt(info[1].trim()));
			trueaddresses.add(ad);
			return trueaddresses;
		}
		
		String[] addresses = this.serverAddresses.split("\n");
		for(String address:addresses)
		{
			address = address.trim();
			String info[] = address.split(":");
			ServerAddress ad = new ServerAddress(info[0].trim(),Integer.parseInt(info[1].trim()));
			trueaddresses.add(ad);
		}
		return trueaddresses;
	}
	
	private int[] parserOption() throws NumberFormatException, UnknownHostException
	{
		if(StringUtil.isEmpty(this.option))
			return null;
		option = option.trim();
		String[] options = this.option.split("\r\n");
		int[] ret = new int[options.length];
		int i = 0;
		for(String op:options)
		{
			op = op.trim();
			ret[i] = _getOption( op);
			i ++;
		}
		return ret;
	}
	
	private int _getOption(String op)
	{
		if(op.equals("QUERYOPTION_TAILABLE"))
			return Bytes.QUERYOPTION_TAILABLE;
		else if(op.equals("QUERYOPTION_SLAVEOK"))
			return Bytes.QUERYOPTION_SLAVEOK;
		else if(op.equals("QUERYOPTION_OPLOGREPLAY"))
			return Bytes.QUERYOPTION_OPLOGREPLAY;
		else if(op.equals("QUERYOPTION_NOTIMEOUT"))
			return Bytes.QUERYOPTION_NOTIMEOUT;
		
		else if(op.equals("QUERYOPTION_AWAITDATA"))
			return Bytes.QUERYOPTION_AWAITDATA;
		
		else if(op.equals("QUERYOPTION_EXHAUST"))
			return Bytes.QUERYOPTION_EXHAUST;
		
		else if(op.equals("QUERYOPTION_PARTIAL"))
			return Bytes.QUERYOPTION_PARTIAL;
		
		else if(op.equals("RESULTFLAG_CURSORNOTFOUND"))
			return Bytes.RESULTFLAG_CURSORNOTFOUND;
		else if(op.equals("RESULTFLAG_ERRSET"))
			return Bytes.RESULTFLAG_ERRSET;
		
		else if(op.equals("RESULTFLAG_SHARDCONFIGSTALE"))
			return Bytes.RESULTFLAG_SHARDCONFIGSTALE;
		else if(op.equals("RESULTFLAG_AWAITCAPABLE"))
			return Bytes.RESULTFLAG_AWAITCAPABLE;
		throw new RuntimeException("未知的option:"+op);

	 
	}
	public static void main(String[] args)
	{
		String aa = "REPLICA_ACKNOWLEDGED(10)";
		int idx = aa.indexOf("(") ;
		String n = aa.substring(idx + 1,aa.length() - 1); 
		System.out.println(n);
	}
	private WriteConcern  _getWriteConcern()
	{
		if(StringUtil.isEmpty(this.writeConcern))
			return null;
		writeConcern=writeConcern.trim();
		if(this.writeConcern.equals("NONE"))
			return WriteConcern.UNACKNOWLEDGED;
		else if(this.writeConcern.equals("NORMAL"))
			return WriteConcern.NORMAL;
		else if(this.writeConcern.equals("SAFE"))
			return WriteConcern.SAFE;
		else if(this.writeConcern.equals("MAJORITY"))
			return WriteConcern.MAJORITY;
		else if(this.writeConcern.equals("FSYNC_SAFE"))
			return WriteConcern.FSYNC_SAFE;
		else if(this.writeConcern.equals("JOURNAL_SAFE"))
			return WriteConcern.JOURNAL_SAFE;
		else if(this.writeConcern.equals("REPLICAS_SAFE"))
			return WriteConcern.REPLICAS_SAFE;
		else if(this.writeConcern.startsWith("REPLICA_ACKNOWLEDGED"))
		{
			int idx = writeConcern.indexOf("(") ;
			if(idx < 0)
			{
				return WriteConcern.REPLICA_ACKNOWLEDGED;
			}
			else
			{
				String n = this.writeConcern.substring(idx + 1,writeConcern.length() - 1); 
				try {
					if(n.indexOf(",") < 0)
					{
						int N = Integer.parseInt(n);
						return new WriteConcern(N);
					}
					else
					{
						String[] p = n.split(",");
					    n = p[0];
					    String _wtimeout = p[1];
					    int N = Integer.parseInt(n);
					    int wtimeout = Integer.parseInt(_wtimeout);
					    return new WriteConcern(N,wtimeout,false);
					}
				} catch (NumberFormatException e) {
					return WriteConcern.REPLICA_ACKNOWLEDGED;
				}
			}
		}
		else if(this.writeConcern.equals("ACKNOWLEDGED"))
			return WriteConcern.ACKNOWLEDGED;
		else if(this.writeConcern.equals("UNACKNOWLEDGED"))
			return WriteConcern.UNACKNOWLEDGED;
		else if(this.writeConcern.equals("FSYNCED"))
			return WriteConcern.FSYNCED;
		else if(this.writeConcern.equals("JOURNALED"))
			return WriteConcern.JOURNALED;
		else if(this.writeConcern.equals("ERRORS_IGNORED"))
			return WriteConcern.UNACKNOWLEDGED;
		
		throw new RuntimeException("未知的WriteConcern:"+writeConcern);
	}
	
	private ReadPreference _getReadPreference()
	{
		if(StringUtil.isEmpty(this.readPreference))
			return null;
		if(readPreference.equals("PRIMARY"))
			return ReadPreference.primary();
		else if(readPreference.equals("SECONDARY"))
			return ReadPreference.secondary();
		else if(readPreference.equals("SECONDARY_PREFERRED"))
			return ReadPreference.secondaryPreferred();
		else if(readPreference.equals("PRIMARY_PREFERRED"))
			return ReadPreference.primaryPreferred();
		else if(readPreference.equals("NEAREST"))
			return ReadPreference.nearest();
		throw new RuntimeException("未知的ReadPreference:"+readPreference);
	}
	private void buildCredentials()
	{
		if(this.credentials != null && this.credentials.size() > 0)
		{
			this.mongoCredentials = new ArrayList();
			for(ClientMongoCredential clientMongoCredential:this.credentials)
			{
				if(StringUtil.isEmpty(clientMongoCredential.getMechanism()) 
						||clientMongoCredential.getMechanism().equals(MongoCredential.MONGODB_CR_MECHANISM))
				{
					mongoCredentials.add(MongoCredential.createMongoCRCredential(clientMongoCredential.getUserName(), clientMongoCredential.getDatabase(),clientMongoCredential.getPassword().toCharArray()));
				}
				else if(clientMongoCredential.getMechanism().equals(MongoCredential.PLAIN_MECHANISM))
				{
					mongoCredentials.add(MongoCredential.createPlainCredential(clientMongoCredential.getUserName(), clientMongoCredential.getDatabase(),clientMongoCredential.getPassword().toCharArray()));
				}
				else if(clientMongoCredential.getMechanism().equals(MongoCredential.MONGODB_X509_MECHANISM))
				{
					mongoCredentials.add(MongoCredential.createMongoX509Credential(clientMongoCredential.getUserName()));
				}
				else if(clientMongoCredential.getMechanism().equals(MongoCredential.GSSAPI_MECHANISM))
				{
					mongoCredentials.add(MongoCredential.createGSSAPICredential(clientMongoCredential.getUserName()));
				}
			}
		}
	}
	public void init()
	{
		try {
			buildCredentials();
			if(mode != null && mode.equals("simple"))
			{
				this.initsimple();
			}
			else
			{
				
				
//				options.autoConnectRetry = autoConnectRetry;
//				options.connectionsPerHost = connectionsPerHost;
//				options.maxWaitTime = maxWaitTime;
//	            options.socketTimeout = socketTimeout;
//	            options.connectTimeout = connectTimeout;
//	            options.threadsAllowedToBlockForConnectionMultiplier = threadsAllowedToBlockForConnectionMultiplier;
//	            options.socketKeepAlive=socketKeepAlive;
				Builder builder = MongoClientOptions.builder();
//				builder.autoConnectRetry( autoConnectRetry);
				_autoConnectRetry( builder, autoConnectRetry);
				builder.connectionsPerHost( connectionsPerHost);
				builder.maxWaitTime( maxWaitTime);
				builder.socketTimeout( socketTimeout);
				builder.connectTimeout( connectTimeout);
				builder.threadsAllowedToBlockForConnectionMultiplier( threadsAllowedToBlockForConnectionMultiplier);
				builder.socketKeepAlive(socketKeepAlive);
	            MongoClientOptions options = builder.build();//new MongoClientOptions();
	            MongoClient mongoClient = null;
	            List servers = parserAddress();
	            if(mongoCredentials == null || mongoCredentials.size() == 0)
	            {
	            	if(servers.size() > 1)
	            		mongoClient = new MongoClient(servers,options);
	            	else
	            		mongoClient = new MongoClient(servers.get(0),options);
	            }
	            else
	            {
	            	if(servers.size() > 1)
	            		mongoClient = new MongoClient(servers,mongoCredentials,options);
	            	else
	            		mongoClient = new MongoClient(servers.get(0),mongoCredentials,options);
	            }
				int[] ops = parserOption();
				for(int i = 0; ops != null && i < ops.length; i ++)
					mongoClient.addOption( ops[i] );
				WriteConcern wc = this._getWriteConcern();
				if(wc != null)
					mongoClient.setWriteConcern(wc);
		//ReadPreference.secondaryPreferred();
//				if(servers.size() > 1)
				{
					ReadPreference rf = _getReadPreference();
					if(rf != null)
						mongoClient.setReadPreference(ReadPreference.nearest());
				}
		//		mongoClient.setReadPreference(ReadPreference.primaryPreferred());
				this.mongoclient = mongoClient;
			}
		} catch (RuntimeException e) {
			log.error("初始化mongodb client failed.", e);
			throw e;
			
		} 
		catch (Exception e) {
			log.error("初始化mongodb client failed.", e);
			throw new RuntimeException(e);
			
		} 
	}
	
	private void _autoConnectRetry(Builder builder,boolean autoConnectRetry)
	{
		if(autoConnectRetryMethod != null)
			try {
				autoConnectRetryMethod.invoke(builder, autoConnectRetry);
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
	public void initsimple() throws Exception
	{
		try {
//			MongoOptions options = new MongoOptions();
//            options.autoConnectRetry = autoConnectRetry;
//            options.connectionsPerHost = connectionsPerHost;
//            options.maxWaitTime = maxWaitTime;
//            options.socketTimeout = socketTimeout;
//            options.connectTimeout = connectTimeout;
//            options.threadsAllowedToBlockForConnectionMultiplier = threadsAllowedToBlockForConnectionMultiplier;
//            options.socketKeepAlive=socketKeepAlive;
//			Mongo mongoClient = new Mongo(parserAddress().get(0),options);
			Builder builder = MongoClientOptions.builder();
//			builder.autoConnectRetry( autoConnectRetry);
			_autoConnectRetry( builder, autoConnectRetry);
			builder.connectionsPerHost( connectionsPerHost);
			builder.maxWaitTime( maxWaitTime);
			builder.socketTimeout( socketTimeout);
			builder.connectTimeout( connectTimeout);
			builder.threadsAllowedToBlockForConnectionMultiplier( threadsAllowedToBlockForConnectionMultiplier);
			builder.socketKeepAlive(socketKeepAlive);
            MongoClientOptions options = builder.build();//new MongoClientOptions();
            MongoClient mongoClient = null;
            if(mongoCredentials == null || mongoCredentials.size() == 0)
            {
            	mongoClient = new MongoClient(parserAddress().get(0),options);
            }
            else
            {
            	mongoClient = new MongoClient(parserAddress().get(0),mongoCredentials,options);
            }
			
			int[] ops = parserOption();
			for(int i = 0; ops != null && i < ops.length; i ++)
				mongoClient.addOption( ops[i] );
			WriteConcern wc = this._getWriteConcern();
			if(wc != null)
				mongoClient.setWriteConcern(wc);
	//ReadPreference.secondaryPreferred();
			
	//		mongoClient.setReadPreference(ReadPreference.primaryPreferred());
			this.mongoclient = mongoClient;
		} catch (RuntimeException e) {
			throw e;
			
		} 
		catch (Exception e) {
			throw e;
			
		} 
	}
	
	public void close()
	{
		if(this.mongoclient != null)
			this.mongoclient.close();
	}
	
	 public static WriteResult update(DBCollection collection, DBObject q , DBObject o )
	 {
		 try
			{
				WriteResult wr = collection.update(q, o);
				
				return wr;
			}
			catch(WriteConcernException e)
			{
				log.debug("update:",e);
				return null;
			}
	 }
	 
	 public static WriteResult update(DBCollection collection, DBObject q , DBObject o , WriteConcern concern)
	 {
		
				WriteResult wr = collection.update(q, o, false , false,concern );
				
				return wr;
			
	 }
	 public static DBObject findAndModify( DBCollection collection,DBObject query , DBObject update )
	 {
		 try
			{
				 DBObject object = collection.findAndModify(query,update);
				 return object;
			}
		    catch(WriteConcernException e)
			{
				log.debug("findAndModify:",e);
				return null;
			}
	 }
	 public static DBObject findAndRemove(DBCollection collection, DBObject query )
	 {
		 try
			{
				 DBObject object = collection.findAndRemove(query);
				 return object;
			}
		    catch(WriteConcernException e)
			{
				log.debug("findAndRemove:",e);
				return null;
			}
	 }
	 
	  public static WriteResult insert(DBCollection collection,DBObject ... arr)
	  {
		  
		  try
			{
			  return collection.insert(arr);
			}
		    catch(WriteConcernException e)
			{
				log.debug("insert:",e);
				return null;
			}
	  }
	  
	  public static WriteResult insert(WriteConcern concern ,DBCollection collection,DBObject ... arr)
	  {
		  
			return collection.insert(arr,concern);
			
	  }
	  
	  public static WriteResult remove(DBCollection collection, DBObject o )
	  {
		  try
			{
			  return collection.remove(o);
			}
		    catch(WriteConcernException e)
			{
				log.debug("remove:",e);
				return null;
			}
	  }
	  
	  public static WriteResult remove(DBCollection collection, DBObject o , WriteConcern concern ){
		  return collection.remove(o,concern);
	    }
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy