作者 crossoverJie

:sparkles: Introducing new features.异步写入聊天记录

... ... @@ -2,6 +2,7 @@ package com.crossoverjie.cim.client.scanner;
import com.crossoverjie.cim.client.config.AppConfiguration;
import com.crossoverjie.cim.client.service.MsgHandle;
import com.crossoverjie.cim.client.service.MsgLogger;
import com.crossoverjie.cim.client.util.SpringBeanFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ... @@ -26,9 +27,12 @@ public class Scan implements Runnable {
private MsgHandle msgHandle ;
private MsgLogger msgLogger ;
public Scan() {
this.configuration = SpringBeanFactory.getBean(AppConfiguration.class);
this.msgHandle = SpringBeanFactory.getBean(MsgHandle.class) ;
this.msgLogger = SpringBeanFactory.getBean(MsgLogger.class) ;
}
@Override
... ... @@ -50,6 +54,8 @@ public class Scan implements Runnable {
//真正的发送消息
msgHandle.sendMsg(msg) ;
//写入聊天记录
msgLogger.log(msg) ;
LOGGER.info("{}:【{}】", configuration.getUserName(), msg);
}
... ...
package com.crossoverjie.cim.client.service;
/**
* Function:
*
* @author crossoverJie
* Date: 2019/1/6 15:23
* @since JDK 1.8
*/
public interface MsgLogger {
/**
* 异步写入消息
* @param msg
*/
void log(String msg) ;
/**
* 停止写入
*/
void stop() ;
}
... ...
package com.crossoverjie.cim.client.service.impl;
import com.crossoverjie.cim.client.service.MsgLogger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* Function:
*
* @author crossoverJie
* Date: 2019/1/6 15:26
* @since JDK 1.8
*/
@Service
public class AsyncMsgLogger implements MsgLogger {
private final static Logger LOGGER = LoggerFactory.getLogger(AsyncMsgLogger.class);
/**
* The default buffer size.
*/
private static final int DEFAULT_QUEUE_SIZE = 16;
private BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<String>(DEFAULT_QUEUE_SIZE);
private volatile boolean started = false ;
private Worker worker = new Worker() ;
@Override
public void log(String msg) {
//开始消费
startMsgLogger();
try {
blockingQueue.put(msg);
} catch (InterruptedException e) {
LOGGER.error("InterruptedException", e);
}
}
private class Worker extends Thread {
@Override
public void run() {
while (started) {
try {
String msg = blockingQueue.take();
LOGGER.info("写入聊天记录={}", msg);
} catch (InterruptedException e) {
break;
}
}
}
}
/**
* 开始工作
*/
private void startMsgLogger(){
if (started){
return ;
}
worker.setDaemon(true);
worker.setName("AsyncMsgLogger-Worker");
started = true ;
worker.start();
}
@Override
public void stop() {
started = false ;
worker.interrupt();
}
}
... ...
... ... @@ -3,6 +3,7 @@ package com.crossoverjie.cim.client.service.impl;
import com.crossoverjie.cim.client.client.CIMClient;
import com.crossoverjie.cim.client.config.AppConfiguration;
import com.crossoverjie.cim.client.service.MsgHandle;
import com.crossoverjie.cim.client.service.MsgLogger;
import com.crossoverjie.cim.client.service.RouteRequest;
import com.crossoverjie.cim.client.vo.req.GroupReqVO;
import com.crossoverjie.cim.client.vo.req.P2PReqVO;
... ... @@ -41,6 +42,9 @@ public class MsgHandler implements MsgHandle {
@Autowired
private CIMClient cimClient ;
@Autowired
private MsgLogger msgLogger ;
@Override
public void sendMsg(String msg) {
String[] totalMsg = msg.split(";;");
... ... @@ -140,6 +144,7 @@ public class MsgHandler implements MsgHandle {
*/
private void shutdown() {
LOGGER.info("系统关闭中。。。。");
msgLogger.stop();
executor.shutdown();
try {
while (!executor.awaitTermination(1, TimeUnit.SECONDS)) {
... ...
... ... @@ -60,4 +60,92 @@ public class CommonTest {
}
LOGGER.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
@Test
public void searchMsg(){
StringBuilder sb = new StringBuilder() ;
String allMsg = "于是在之前的基础上我完善了一些内容,先来看看这个项目的介绍吧:\n" +
"\n" +
"CIM(CROSS-IM) 一款面向开发者的 IM(即时通讯)系统;同时提供了一些组件帮助开发者构建一款属于自己可水平扩展的 IM 。\n" +
"\n" +
"借助 CIM 你可以实现以下需求:" ;
String key = "IM" ;
String[] split = allMsg.split("\n");
for (String msg : split) {
if (msg.trim().contains(key)){
sb.append(msg).append("\n") ;
}
}
int pos = 0;
String result = sb.toString();
int count = 1 ;
int multiple = 2 ;
while((pos = result.indexOf(key, pos)) >= 0) {
LOGGER.info("{},{}",pos, pos + key.length());
if (count == 1){
sb.insert(pos,"**");
}else {
Double pow = Math.pow(multiple, count);
sb.insert(pos +pow.intValue(),"**");
}
pos += key.length();
if (count == 1){
sb.insert(pos +2,"**");
}else {
Double pow = Math.pow(multiple, count);
sb.insert((pos +2) + pow.intValue(),"**");
}
count ++ ;
}
System.out.println(sb);
}
@Test
public void searchMsg2(){
StringBuilder sb = new StringBuilder() ;
String allMsg = "于是在之前的基础上我完善了一些内容,先来看看这个项目的介绍吧:\n" +
"\n" +
"CIM(CROSS-IM) 一款面向开发者的 IM(即时通讯)系统;同时提供了一些组件帮助开发者构建一款属于自己可水平扩展的 IM 。\n" +
"\n" +
"借助 CIM 你可以实现以下需求:" ;
String key = "IM" ;
String[] split = allMsg.split("\n");
for (String msg : split) {
if (msg.trim().contains(key)){
sb.append(msg).append("\n") ;
}
}
int pos = 0;
String result = sb.toString();
int count = 1 ;
int multiple = 2 ;
while((pos = result.indexOf(key, pos)) >= 0) {
LOGGER.info("{},{}",pos, pos + key.length());
pos += key.length();
count ++ ;
}
System.out.println(sb.toString().replace(key,"**" + key+"**"));
}
}
... ...