Commit 37fdd3af authored by 刘文胜's avatar 刘文胜

1111

parent 3d869da6
......@@ -93,6 +93,11 @@
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>com.hdp.pi</groupId>
<artifactId>hdp-security</artifactId>
<version>0.1.3-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
......@@ -121,4 +126,25 @@
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>release</id>
<name>Internal Releases</name>
<url>http://nexus.wxpai.cn/content/repositories/public/</url>
</repository>
</repositories>
<distributionManagement>
<repository>
<id>release</id>
<name>Internal Releases</name>
<url>http://nexus.wxpai.cn/content/repositories/release/</url>
</repository>
<snapshotRepository>
<id>deployment</id>
<name>Internal Releases</name>
<url>http://nexus.wxpai.cn/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
......@@ -72,6 +72,7 @@ public class APP extends WebMvcAutoConfiguration
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
LOGGER.info("这里可以注册websocket路由~~~~");
//registry.addHandler(imWebSocketEndpoint(), "/im").addInterceptors(new SimpleHandshakeInterceptor()).setAllowedOrigins("*");
}
@Bean
......
......@@ -9,9 +9,11 @@
package com.hdp.customerservice.api;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
......@@ -20,12 +22,15 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.hdp.customerservice.dto.DTO;
import com.hdp.customerservice.model.WorksEntity;
import com.hdp.customerservice.service.WorksService;
import com.hdp.customerservice.websocket.model.Waiter;
import com.hdp.pi.security.controller.JWTSecurityController;
import com.hdp.pi.security.domain.JWT;
@Controller
@RequestMapping("/customerservice/login")
public class LoginController {
public class LoginController extends JWTSecurityController{
@Autowired
/*@Autowired
private WorksService worksService;
Integer entCode = 10001;
......@@ -46,5 +51,29 @@ public class LoginController {
}
dto.data=worker;
return dto.toJson();
}
}*/
/*@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public String getSurvey(HttpServletRequest req){
JWT jwt= super.getToken(req);
DTO dto = DTO.newDTO();
if(jwt!=null && jwt.getEntCode()!=null){
dto.data=true;
Object obj=req.getSession(true).getAttribute("user");
if(obj == null){
Waiter waiter = new Waiter();
waiter.entCode = jwt.getEntCode();
HttpSession s = req.getSession();
req.getSession(true).setAttribute("user", waiter);
s = req.getSession();
System.out.println(s);
}
}else{
dto.errCode=-1;
dto.data=false;
}
return dto.toJson();
}*/
}
......@@ -25,7 +25,7 @@ import com.hdp.customerservice.service.WorksService;
@RequestMapping("/customerservice/signed")
public class UserInfoController {
@Autowired
/*@Autowired
private WorksService worksService;
Integer entCode = 10001;
......@@ -35,5 +35,5 @@ public class UserInfoController {
DTO dto=DTO.newDTO();
dto.data=request.getSession(true).getAttribute("user");
return dto.toJson();
}
}*/
}
......@@ -25,7 +25,7 @@ import com.hdp.customerservice.service.WorksService;
@RequestMapping("/admin/customerservice/worker")
public class WorksController {
@Autowired
/*@Autowired
private WorksService worksService;
Integer entCode = 10001;
......@@ -61,5 +61,5 @@ public class WorksController {
DTO dto = DTO.newDTO();
dto.data=worksService.get(id);
return dto.toJson();
}
}*/
}
......@@ -21,11 +21,11 @@ import org.springframework.stereotype.Component;
@Component
public class CORSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
/*HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "7200");
response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With");
response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With");*/
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
......
......@@ -27,7 +27,7 @@ import com.hdp.customerservice.model.WorksEntity;
@Component
public class NOLoginFilter implements Filter{
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
/*HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession(true);
WorksEntity user = (WorksEntity)session.getAttribute("user");
......@@ -39,7 +39,8 @@ public class NOLoginFilter implements Filter{
chain.doFilter(request, response);
}else{
res.sendRedirect("/login.html");
}
}*/
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
......
......@@ -21,6 +21,8 @@ public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurato
HandshakeResponse response)
{
HttpSession httpSession = (HttpSession)request.getHttpSession();
config.getUserProperties().put(HttpSession.class.getName(),httpSession);
if(httpSession != null){
config.getUserProperties().put(HttpSession.class.getName(),httpSession);
}
}
}
......@@ -29,7 +29,7 @@ public class HistoryHandler {
* @date 2015年6月18日 下午3:35:38
* @version V1.0
*/
private static LinkedBlockingQueue<HistoryEntity> queue = new LinkedBlockingQueue<HistoryEntity>();
/*private static LinkedBlockingQueue<HistoryEntity> queue = new LinkedBlockingQueue<HistoryEntity>();
public static void push(HistoryEntity h){
try {
......@@ -62,5 +62,5 @@ public class HistoryHandler {
}
}
}).start();
}
}*/
}
......@@ -9,135 +9,114 @@
package com.hdp.customerservice.websocket;
import java.io.IOException;
import java.util.Iterator;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import javax.websocket.Session;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.hdp.customerservice.model.HistoryEntity;
import com.hdp.customerservice.websocket.model.Customer;
import com.hdp.customerservice.websocket.model.Waiter;
import com.hdp.pi.wechat.messages.AbstractMessage;
import com.hdp.pi.wechat.messages.NewUserMessage;
public class IMManager {
public final class IMManager {
private static Log log=LogFactory.getLog(IMManager.class);
public static ConcurrentHashMap<String,Waiter>
waiters = new ConcurrentHashMap<String, Waiter>();
private static ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
private static CopyOnWriteArrayList<Waiter> waiters = new CopyOnWriteArrayList<Waiter>();
private static LinkedBlockingQueue<AbstractMessage> queue=new LinkedBlockingQueue<AbstractMessage>();
public static void broadcast(String id,String message){
Iterator<Waiter> ws= waiters.values().iterator();
while(ws.hasNext()){
try{
Waiter w=(Waiter)ws.next();
Session s=w.session;
if(s!=null && s.isOpen() && w.id != id){
s.getBasicRemote().sendText(message);
}
}catch(Throwable e){
}
}
}
private IMManager(){}
public static void pushMessage(AbstractMessage message){
CustomerManager.addUserIfNotExist(message);
try {
queue.put(message);
} catch (InterruptedException e) {
}
try{
addUserIfNotExist(message);
}catch(Throwable e){
}
}
static{//测试用0.0
new Thread(new Runnable() {//消息发射器
public void hand(){
AbstractMessage e=queue.poll();
if(e == null){
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
}
return ;
}
Customer customer=CustomerManager.getUserByOpenId(e.openId);
if(customer == null){
pushMessage(e);
return;
}
Waiter waiter = WaiterManager.getWaiterById(customer.waiterId);
if(waiter == null){
pushMessage(e);
return;
}
Session session= waiter.session;
if(session == null || !session.isOpen()){
pushMessage(e);
return;
}
String message= null;
try {
message = JSONObject.toJSONString(e);
session.getBasicRemote().sendText(message);
} catch (IOException e1) {
pushMessage(e);
return;
}
try{
HistoryEntity h= new HistoryEntity(e.entCode, e.openId, Long.parseLong(waiter.id), message, 1);
HistoryHandler.push(h);
}catch(Throwable e1){
}
}
public static void addUserIfNotExist(AbstractMessage e){
final NewUserMessage newUserMessage=new NewUserMessage();
newUserMessage.appId=e.appId;
newUserMessage.createTime=new Date();
newUserMessage.entCode=e.entCode;
newUserMessage.openId=e.openId;
pool.execute(new Runnable() {
@Override
public void run() {
while(true){
hand();
}
broadcast(newUserMessage);
}
}).start();
new Thread(new Runnable() {//分配客服
public void hand(){
Customer[] cs = CustomerManager.getUsers();
Waiter[] ws=WaiterManager.getWaits();
for (Customer c : cs) {
if(!StringUtils.isEmpty(c.waiterId)){
continue;
}
for(Waiter w : ws){
if(w.customs.size() == 0){
c.waiterId=w.id;
w.customs.add(c.openId);
continue;
});
}
public static void broadcast(AbstractMessage message){
if(waiters.size() == 0){
return;
}
String m = JSONObject.toJSONString(message);
for (Waiter waiter : waiters) {
if(waiter == null ||
message.entCode == null ||
waiter.entCode == null ||
waiter.entCode.intValue() != message.entCode.intValue()){//没有客服
continue;
}
Session session= waiter.session;
if(session == null || !session.isOpen()){
return;
}
try {
session.getBasicRemote().sendText(m);
} catch (IOException e1) {
}
}
}
public static void addWaiter(Waiter w){
waiters.add(w);
}
public static void removeWaiter(Waiter w){
waiters.remove(w);
}
static{
int pross = Runtime.getRuntime().availableProcessors();
for(int i=0;i<pross;i++){
pool.execute(new Runnable() {//消息发射器
public void hand(){
AbstractMessage e=queue.poll();
if(e == null){
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
}
return ;
}
broadcast(e);
}
}
@Override
public void run() {
while(true){
hand();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
@Override
public void run() {
while(true){
try{
hand();
}catch(Throwable e){}
}
}
}
}).start();
});
}
}
}
......@@ -13,36 +13,33 @@ import javax.websocket.server.ServerEndpoint;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.WebSocketHandlerDecorator;
import com.hdp.customerservice.model.WorksEntity;
import com.hdp.customerservice.websocket.model.Waiter;
@ServerEndpoint(value="/im",configurator=GetHttpSessionConfigurator.class)
public class IMWebSocketEndpoint {
@ServerEndpoint(value="/im"/*,configurator=GetHttpSessionConfigurator.class*/)
public class IMWebSocketEndpoint{
private static Log log=LogFactory.getLog(IMWebSocketEndpoint.class);
private HttpSession httpSession;//当前登录用户的http session
private Waiter waiter;//当前客服
private Waiter waiter;
@OnOpen
public void handleConnect(Session session,EndpointConfig config) throws IOException{
this.httpSession = (HttpSession) config.getUserProperties()
.get(HttpSession.class.getName());
WorksEntity worksEntity = (WorksEntity)this.httpSession.getAttribute("user");
waiter = new Waiter();
waiter.entCode=worksEntity.getEntCode();
waiter.id=worksEntity.getId().toString();
waiter.nickName=worksEntity.getNickName();
waiter.headImg=worksEntity.getHeadImg();
waiter.userName=worksEntity.getUserName();
waiter.session = session;
WaiterManager.addWaiter(waiter);//当前所有在线客服
public void handleConnect(Session session/*,EndpointConfig config*/) throws IOException{
this.waiter = new Waiter();
String str=session.getQueryString();
str = str.substring(str.indexOf("ent_code=")+9);
this.waiter.entCode = Integer.parseInt(str);
this.waiter.session = session;
IMManager.addWaiter(waiter);
}
@OnClose
public void handleClose(Session session){
log.info(waiter.nickName + "离线了");
WaiterManager.removeWaiter(waiter.id);
IMManager.removeWaiter(waiter);
}
@OnError
......
/**
* @Title: SimpleHandshakeInterceptor.java
* @Package com.hdp.customerservice.websocket
* @Description: TODO
* @author new12304508_163_com
* @date 2015年6月19日 下午3:00:20
* @version V1.0
*/
package com.hdp.customerservice.websocket;
import java.util.Map;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
public class SimpleHandshakeInterceptor implements HandshakeInterceptor{
@Override
public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Exception exception) {
// TODO Auto-generated method stub
}
/**
* @Title: SimpleHandshakeInterceptor.java
* @Package com.hdp.customerservice.websocket
* @Description: TODO
* @author new12304508_163_com
* @date 2015年6月19日 下午3:00:20
* @version V1.0
*/
}
/**
* @Title: WaiterManager.java
* @Package com.hdp.customerservice.websocket
* @Description: TODO
* @author new12304508_163_com
* @date 2015年6月16日 下午5:15:41
* @version V1.0
*/
package com.hdp.customerservice.websocket;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.util.StringUtils;
import com.hdp.customerservice.websocket.model.Customer;
import com.hdp.customerservice.websocket.model.Waiter;
public class WaiterManager {
private static ConcurrentHashMap<String,Waiter>
waiters = new ConcurrentHashMap<String, Waiter>();
private WaiterManager(){}
public static Waiter getWaiterById(String id){
if(StringUtils.isEmpty(id)){
return null;
}
return waiters.get(id);
}
public static void addWaiter(Waiter waiter){
if(waiter == null || StringUtils.isEmpty(waiter.id)){
return;
}
waiters.put(waiter.id, waiter);
}
public static void removeWaiter(String id){
if(!StringUtils.isEmpty(id)){
waiters.remove(id);
}
}
public static Waiter[] getWaits(){
Waiter[] ws = new Waiter[waiters.size()];
return waiters.values().toArray(ws);
}
}
......@@ -17,7 +17,5 @@ public class Customer {
public String openId;
public String waiterId;
public Date lastTime;//最后活动时间
}
\ No newline at end of file
......@@ -8,9 +8,6 @@
*/
package com.hdp.customerservice.websocket.model;
import java.util.ArrayList;
import java.util.List;
import javax.websocket.Session;
public class Waiter {
......@@ -25,6 +22,4 @@ public class Waiter {
public String headImg;
public Session session;
public List<String> customs= new ArrayList<String>();
}
......@@ -28,7 +28,7 @@ public abstract class MessageHandler {
public final void deCommonInfo(AbstractMessage entity,String message) throws Exception{
Document doc = DocumentHelper.parseText(message);
Calendar calendar=Calendar.getInstance();
calendar.setTimeInMillis(Long.parseLong(getXMLNodeText(doc,"/xml/CreateTime")));
calendar.setTimeInMillis(Long.parseLong(getXMLNodeText(doc,"/xml/CreateTime"))*1000);
entity.openId=getXMLNodeText(doc,"/xml/FromUserName");
entity.createTime=calendar.getTime();
}
......
/**
* @Title: NewUserMessage.java
* @Package com.hdp.pi.wechat.messages
* @Description: TODO
* @author new12304508_163_com
* @date 2015年6月19日 下午12:09:45
* @version V1.0
*/
package com.hdp.pi.wechat.messages;
public class NewUserMessage extends AbstractMessage{
/**
* @Title: NewUserMessage.java
* @Package com.hdp.pi.wechat.messages
* @Description: TODO
* @author new12304508_163_com
* @date 2015年6月19日 下午12:09:45
* @version V1.0
*/
public String msgType = "newUser";
}
......@@ -67,4 +67,13 @@
</bean>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean id="securityFilter" class="com.hdp.pi.security.filter.SecurityFilter">
<property name="debug" value="true"/>
<property name="whiteList">
<list>
<value>.wxpai.cn</value>
</list>
</property>
<property name="maxAge" value="7200" />
</bean>
</beans>
\ No newline at end of file
......@@ -85,9 +85,9 @@ websocketApp.controller('UserListCtrl',
['$scope', '$rootScope', '$location', '$resource', '$stateParams','WebSocketService',
function($scope, $rootScope, $location, $resource, $stateParams,WebSocketService) {
$scope.users = [];//[{nickName:'111111',messages:11}];
$scope.$on('UserList', function(event,data) {
$scope.$on('newUser', function(event,data) {
$scope.$apply(function(){
$scope.users= data.data;
$scope.users.push(data.data.openId);
});
});
}]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment