1、Maven依赖
(需要注意的是,按照MongoDB官方的说法,mongDB3.0的JAVA驱动至少得选择2.13以上版本,下面是以spring-data-mongodb的1.6.2.RELEASE作为依赖,必须要exclusion排除mongo-java-driver,spring-data-mongodb该版本的mongoDB java 驱动不能正确的运行在MongoDB3.0上):
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.core</artifactId>
<version>${springframwork.croe.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.6.2.RELEASE</version>
<!-- MongoDB3.0驱动需要单独配置 -->
<exclusions>
<exclusion>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.13.0-rc2</version>
</dependency>
2、mongodb.properties,文件放置到conf/mongo目录下
im.hs.server.mongo.replicaSet=192.168.62.154:17018,192.168.62.153:17018,192.168.62.152:17018
im.hs.server.mongo.dbName=hezx
im.hs.server.mongo.username=admin
im.hs.server.mongo.password=admin123
3、spring-mongo.xml,文件放置到conf/mongo目录下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ss="http://www.springframework.org/schema/security"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- Spring自动将该包目录下标记为@Service的所有类作为spring的Bean -->
<context:component-scan base-package="com.gaojiasoft.test.mongo.service" />
<!-- <aop:aspectj-autoproxy proxy-target-class="true"/> -->
<bean id="mongodbPropertyConfig"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="1" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:conf/mongo/mongodb.properties</value>
</list>
</property>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>
<mongo:mongo id="mongo" replica-set="${im.hs.server.mongo.replicaSet}">
<mongo:options connections-per-host="400"
threads-allowed-to-block-for-connection-multiplier="100"
connect-timeout="10000" max-wait-time="15000" auto-connect-retry="true"
socket-keep-alive="true" socket-timeout="15000" slave-ok="true"
write-number="0" write-timeout="0" write-fsync="true" />
</mongo:mongo>
<!-- message数据库连接池配置开始 -->
<!-- 连接工厂 指定db名 -->
<mongo:db-factory id="mongoDbFactory" dbname="${im.hs.server.mongo.dbName}"
mongo-ref="mongo" username="${im.hs.server.mongo.username}" password="${im.hs.server.mongo.password}" />
<!-- 对象映射成mongodb的一个collection的 -->
<mongo:mapping-converter id="mongoDbconverter"
db-factory-ref="mongoDbFactory" />
<!-- mongodb的操作对象 -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongoDbFactory" />
<constructor-arg ref="mongoDbconverter" />
</bean>
</beans>
4、Message.java(消息实体Bean,将消息存储到mongoDB的Message Collection中)
package com.gaojiasoft.test.mongo.bean;
import java.io.Serializable;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
/**
*
* @ClassName: Message
* @Description: 消息实体Bean,从MessagePacket转换而成,是TCP协议经过JSON解析后的消息实体Bean。
* @author 何志雄 001
* @company 南京高嘉软件技术有限公司
* @date 2015年3月16日 下午4:48:19
*/
//指定使用mongodb的Message集合,spring操作该对象的时候知道存取哪个集合
@Document(collection = "Message")
public class Message implements Serializable, Comparable<Message> {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 1L;
/**
* 文档id
*/
@Id
private String id;
/**
* 消息id
*/
private String messageId;
/**
* 发送者id
*/
private String from;
/**
* 接收者id
*/
private String to;
/**
* 发送时间
*/
private Long sendate;
/**
* 消息内容
*/
private String content;
/**
* 消息类型
*/
private int genre;
/**
* 发送者暱称
*/
private String sender;
/**
* 序列号
*/
private Long sequence;
/**
* at列表
*/
private String remind;
/**
* header_id
*/
private String header_id;
/**
* header_from
*/
private String header_from;
/**
* header_to
*/
private String header_to;
/**
* header_opCode
*/
private String header_opCode;
/**
* version
*/
private String version;
/**
* protocol
*/
private String protocol;
/**
* body
*/
private String body;
/**
* org
*/
private String org;
/**
* createTime
*/
private Long createTime;
/**
* 状态
*/
private int status;
/**
* userid,domain,resource
*/
private String from_fulljid;
private String to_fulljid;
/**
* @return the id
*/
public String getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(String id) {
this.id = id;
}
/**
* @return the content
*/
public String getContent() {
return content;
}
/**
* @param content the content to set
*/
public void setContent(String content) {
this.content = content;
}
/**
* @return the messageId
*/
public String getMessageId() {
return messageId;
}
/**
* @param messageId the messageId to set
*/
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public Long getSendate() {
return sendate;
}
public void setSendate(Long sendate) {
this.sendate = sendate;
}
public int getGenre() {
return genre;
}
public void setGenre(int genre) {
this.genre = genre;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getRemind() {
return remind;
}
public void setRemind(String remind) {
this.remind = remind;
}
public String getHeader_id() {
return header_id;
}
public void setHeader_id(String header_id) {
this.header_id = header_id;
}
public String getHeader_from() {
return header_from;
}
public void setHeader_from(String header_from) {
this.header_from = header_from;
}
public String getHeader_to() {
return header_to;
}
public void setHeader_to(String header_to) {
this.header_to = header_to;
}
public String getHeader_opCode() {
return header_opCode;
}
public void setHeader_opCode(String header_opCode) {
this.header_opCode = header_opCode;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getOrg() {
return org;
}
public void setOrg(String org) {
this.org = org;
}
public Long getSequence() {
return sequence;
}
public void setSequence(Long sequence) {
this.sequence = sequence;
}
public Long getCreateTime() {
return createTime;
}
public void setCreateTime(Long createTime) {
this.createTime = createTime;
}
@Override
public int compareTo(Message o) {
if (o.sequence < this.sequence)
return 1;
else if (o.sequence > this.sequence)
return -1;
else
return 0;
}
//此处影响性能
@Override
public String toString(){
return this.messageId + "|" + this.from + "|" + this.to + "|"+this.sendate+"|"
+(this.content!=null?this.content.replaceAll("\n", ""):"")+"|"+this.genre+"|"+this.sender+"|"+this.sequence+"|"
+ this.header_from+"|"+this.header_opCode+"|" +this.remind+"|"+(this.body!=null?this.body.replaceAll("\n", ""):"");
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getFrom_fulljid() {
return from_fulljid;
}
public void setFrom_fulljid(String from_fulljid) {
this.from_fulljid = from_fulljid;
}
public String getTo_fulljid() {
return to_fulljid;
}
public void setTo_fulljid(String to_fulljid) {
this.to_fulljid = to_fulljid;
}
}
5、MessageServiceImpl.java(MongDB业务操作Bean)
package com.gaojiasoft.test.mongo.service;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import org.springframework.data.mongodb.core.query.Query;
import com.gaojiasoft.test.mongo.bean.Message;
//声明作为Spring的Bean,Bean的名称是messageService
@Service("messageService")
public class MessageServiceImpl{
private Logger logger = LoggerFactory.getLogger("MessageServiceImpl");
@Autowired
private MongoTemplate mongoTemplate;
public void messageStore(String json) {
Message message = new Message();
// protocol
message.setProtocol("protocol");
// version
message.setVersion("version");
// header_from
message.setHeader_from("header/from");
// Header_to
message.setHeader_to("header/to");
// Header_id header/id
message.setHeader_id("header/id");
message.setHeader_opCode("opCode");
message.setFrom_fulljid("fromFullJid");
// barejid
message.setFrom("from");
// body_to
message.setTo_fulljid("toFullJid");
// barejid
message.setTo("toBareID");
message.setSendate(new Date().getTime());
message.setMessageId("messageId");
message.setGenre(1);
// body_sender
message.setSender("sender");
// body_content
message.setContent("content");
// body_remind
message.setRemind("remind");
// body
message.setBody("this is chat message");
// sequence
message.setSequence(new Date().getTime());
// org
message.setOrg("org");
// createTime
message.setCreateTime(new Date().getTime());
// log
logger.info(message.toString());
// save
logger.debug("begin save to mongo!");
try {
mongoTemplate.save(message);
Query query = new Query();
logger.debug("Message count:"
+ mongoTemplate.count(query, "Message"));
} catch (Exception e) {
e.printStackTrace();
}
logger.debug("end save to mongo!");
}
}
6、MongoTest.java(Junit测试程序,每秒钟插入1条数据,并查询集合中的数据数量)
package com.gaojiasoft.test.mongo;
import org.junit.Test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.gaojiasoft.test.mongo.service.MessageServiceImpl;
public class MongoTest {
private static ConfigurableApplicationContext context;
MessageServiceImpl service;
@Test
public void testSayHello() throws InterruptedException {
context = new ClassPathXmlApplicationContext(
"classpath:conf/mongo/spring-mongo.xml");
service = (MessageServiceImpl) context.getBean("messageService");
while(true)
{
service.messageStore(null);
Thread.sleep(1000);
}
}
}