From 8b6c6dec18e8f63aa3f85c1e55c0185241068d6c Mon Sep 17 00:00:00 2001 From: renxb Date: Thu, 31 Mar 2022 18:34:09 +0800 Subject: [PATCH] fix: try with resource ensure resource close MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 通过 try with resource 语法糖保证资源关闭 2. 修复 ACDAgentService#notifyAgentUserProcessResult 中有问题的空指针判断 --- .../com/chatopera/cc/acd/ACDAgentService.java | 82 +++++----- .../com/chatopera/cc/cache/RedisCommand.java | 5 +- .../cc/config/MessagingServerConfigure.java | 7 +- .../controller/resource/MediaController.java | 11 +- .../cc/persistence/es/UKResultMapper.java | 6 +- .../repository/XiaoEUKResultMapper.java | 6 +- .../com/chatopera/cc/util/HttpClientUtil.java | 140 +++++++----------- 7 files changed, 113 insertions(+), 144 deletions(-) diff --git a/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDAgentService.java b/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDAgentService.java index bea73af5..bd0d32b3 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDAgentService.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDAgentService.java @@ -42,6 +42,7 @@ import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.Objects; @Component public class ACDAgentService { @@ -93,49 +94,48 @@ public class ACDAgentService { * @param ctx */ public void notifyAgentUserProcessResult(final ACDComposeContext ctx) { - if (ctx != null && StringUtils.isNotBlank( - ctx.getMessage())) { - logger.info("[onConnect] find available agent for onlineUser id {}", ctx.getOnlineUserId()); - - /** - * 发送消息给坐席 - * 如果没有AgentService或该AgentService没有坐席或AgentService在排队中,则不发送 - */ - if (ctx.getAgentService() != null && (!ctx.isNoagent()) && !StringUtils.equals( - MainContext.AgentUserStatusEnum.INQUENE.toString(), - ctx.getAgentService().getStatus())) { - // 通知消息到坐席 - MainContext.getPeerSyncIM().send(MainContext.ReceiverType.AGENT, - MainContext.ChannelType.WEBIM, - ctx.getAppid(), - MainContext.MessageType.NEW, - ctx.getAgentService().getAgentno(), - ctx, true); - } - - /** - * 发送消息给访客 - */ - Message outMessage = new Message(); - outMessage.setAgentUser(ctx.getAgentUser()); - outMessage.setMessage(ctx.getMessage()); - outMessage.setMessageType(MainContext.MessageType.MESSAGE.toString()); - outMessage.setCalltype(MainContext.CallType.IN.toString()); - outMessage.setCreatetime(MainUtils.dateFormate.format(new Date())); - outMessage.setNoagent(ctx.isNoagent()); - if (ctx.getAgentService() != null) { - outMessage.setAgentserviceid(ctx.getAgentService().getId()); - } - - MainContext.getPeerSyncIM().send(MainContext.ReceiverType.VISITOR, - MainContext.ChannelType.toValue(ctx.getChannel()), - ctx.getAppid(), - MainContext.MessageType.NEW, ctx.getOnlineUserId(), outMessage, true); - - - } else { + Objects.requireNonNull(ctx,"ctx can not be null"); + if (StringUtils.isBlank(ctx.getMessage())) { logger.info("[onConnect] can not find available agent for user {}", ctx.getOnlineUserId()); + return; } + logger.info("[onConnect] find available agent for onlineUser id {}", ctx.getOnlineUserId()); + + /** + * 发送消息给坐席 + * 如果没有AgentService或该AgentService没有坐席或AgentService在排队中,则不发送 + */ + if (ctx.getAgentService() != null && (!ctx.isNoagent()) && !StringUtils.equals( + MainContext.AgentUserStatusEnum.INQUENE.toString(), + ctx.getAgentService().getStatus())) { + // 通知消息到坐席 + MainContext.getPeerSyncIM().send(MainContext.ReceiverType.AGENT, + MainContext.ChannelType.WEBIM, + ctx.getAppid(), + MainContext.MessageType.NEW, + ctx.getAgentService().getAgentno(), + ctx, true); + } + + /** + * 发送消息给访客 + */ + Message outMessage = new Message(); + outMessage.setAgentUser(ctx.getAgentUser()); + outMessage.setMessage(ctx.getMessage()); + outMessage.setMessageType(MainContext.MessageType.MESSAGE.toString()); + outMessage.setCalltype(MainContext.CallType.IN.toString()); + outMessage.setCreatetime(MainUtils.dateFormate.format(new Date())); + outMessage.setNoagent(ctx.isNoagent()); + if (ctx.getAgentService() != null) { + outMessage.setAgentserviceid(ctx.getAgentService().getId()); + } + + MainContext.getPeerSyncIM().send(MainContext.ReceiverType.VISITOR, + MainContext.ChannelType.toValue(ctx.getChannel()), + ctx.getAppid(), + MainContext.MessageType.NEW, ctx.getOnlineUserId(), outMessage, true); + } /** diff --git a/contact-center/app/src/main/java/com/chatopera/cc/cache/RedisCommand.java b/contact-center/app/src/main/java/com/chatopera/cc/cache/RedisCommand.java index c6e650dc..ba122b2d 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/cache/RedisCommand.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/cache/RedisCommand.java @@ -302,11 +302,10 @@ public class RedisCommand { public List getSet(final String key) { Set s = redisSetOps.members(key); - if (s != null & s.size() > 0) { - return new ArrayList<>(s); - } else { + if (CollectionUtils.isEmpty(s)) { return new ArrayList<>(); } + return new ArrayList<>(s); } } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/config/MessagingServerConfigure.java b/contact-center/app/src/main/java/com/chatopera/cc/config/MessagingServerConfigure.java index 9246d3d9..e39f6224 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/config/MessagingServerConfigure.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/config/MessagingServerConfigure.java @@ -82,9 +82,10 @@ public class MessagingServerConfigure { File sslFile = new File(path, "ssl/https.properties"); if (sslFile.exists()) { Properties sslProperties = new Properties(); - FileInputStream in = new FileInputStream(sslFile); - sslProperties.load(in); - in.close(); + + try (FileInputStream in = new FileInputStream(sslFile)) { + sslProperties.load(in); + } if (StringUtils.isNotBlank(sslProperties.getProperty("key-store")) && StringUtils.isNotBlank( sslProperties.getProperty("key-store-password"))) { config.setKeyStorePassword(MainUtils.decryption(sslProperties.getProperty("key-store-password"))); diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/resource/MediaController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/resource/MediaController.java index ec3d1f0f..7d31610a 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/controller/resource/MediaController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/resource/MediaController.java @@ -22,12 +22,10 @@ import com.chatopera.cc.controller.Handler; import com.chatopera.cc.controller.api.request.RestUtils; import com.chatopera.cc.model.AttachmentFile; import com.chatopera.cc.model.StreamingFile; -import com.chatopera.cc.model.UploadStatus; import com.chatopera.cc.persistence.blob.JpaBlobHelper; import com.chatopera.cc.persistence.repository.AttachmentRepository; import com.chatopera.cc.persistence.repository.StreamingFileRepository; import com.chatopera.cc.util.Menu; -import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.tomcat.util.http.fileupload.IOUtils; import org.slf4j.Logger; @@ -42,7 +40,6 @@ import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -100,16 +97,18 @@ public class MediaController extends Handler { @RequestMapping("/url") @Menu(type = "resouce", subtype = "image", access = true) public void url(HttpServletResponse response, @Valid String url) throws IOException { + if (StringUtils.isBlank(url)) { + return; + } byte[] data = new byte[1024]; int length = 0; OutputStream out = response.getOutputStream(); - if (StringUtils.isNotBlank(url)) { - InputStream input = new URL(url).openStream(); + try (InputStream input = new URL(url).openStream()) { while ((length = input.read(data)) > 0) { out.write(data, 0, length); } - input.close(); } + } @RequestMapping("/image/upload") diff --git a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/UKResultMapper.java b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/UKResultMapper.java index 192869e0..314f4183 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/UKResultMapper.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/UKResultMapper.java @@ -147,9 +147,9 @@ public class UKResultMapper extends AbstractResultMapper { private String buildJSONFromFields(Collection values) { JsonFactory nodeFactory = new JsonFactory(); - try { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - JsonGenerator generator = nodeFactory.createGenerator(stream, JsonEncoding.UTF8); + try (ByteArrayOutputStream stream = new ByteArrayOutputStream(); + JsonGenerator generator = nodeFactory.createGenerator(stream, JsonEncoding.UTF8);) { + generator.writeStartObject(); for (SearchHitField value : values) { if (value.getValues().size() > 1) { diff --git a/contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/XiaoEUKResultMapper.java b/contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/XiaoEUKResultMapper.java index fcf01780..b37ff9fe 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/XiaoEUKResultMapper.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/XiaoEUKResultMapper.java @@ -147,9 +147,9 @@ public class XiaoEUKResultMapper extends AbstractResultMapper { private String buildJSONFromFields(Collection values) { JsonFactory nodeFactory = new JsonFactory(); - try { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - JsonGenerator generator = nodeFactory.createGenerator(stream, JsonEncoding.UTF8); + try (ByteArrayOutputStream stream = new ByteArrayOutputStream(); + JsonGenerator generator = nodeFactory.createGenerator(stream, JsonEncoding.UTF8);) { + generator.writeStartObject(); for (SearchHitField value : values) { if (value.getValues().size() > 1) { diff --git a/contact-center/app/src/main/java/com/chatopera/cc/util/HttpClientUtil.java b/contact-center/app/src/main/java/com/chatopera/cc/util/HttpClientUtil.java index 7afdbbbc..b0a3ad2b 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/util/HttpClientUtil.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/util/HttpClientUtil.java @@ -18,7 +18,6 @@ package com.chatopera.cc.util; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; @@ -44,6 +43,7 @@ import javax.net.ssl.SSLSocket; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; @@ -99,39 +99,31 @@ public class HttpClientUtil { * @param params * @return * @throws IOException - */ - public static String doGet(String url, Map params) throws IOException { - String apiUrl = url; - StringBuffer param = new StringBuffer(); - int i = 0; - for (String key : params.keySet()) { - if (i == 0) - param.append("?"); - else - param.append("&"); - param.append(key).append("=").append(params.get(key)); - i++; - } - apiUrl += param; - String result = null; - CloseableHttpClient httpclient = HttpClients.createDefault(); - try { - HttpGet httpPost = new HttpGet(apiUrl); - HttpResponse response = httpclient.execute(httpPost); - - HttpEntity entity = response.getEntity(); - if (entity != null) { - InputStream instream = entity.getContent(); - result = IOUtils.toString(instream, "UTF-8"); - } - } catch (IOException e) { - e.printStackTrace(); - }finally { - if(httpclient!=null) { - httpclient.close(); - } + */ + public static String doGet(String url, Map params) throws IOException { + String apiUrl = url; + StringBuffer param = new StringBuffer(); + int i = 0; + for (String key : params.keySet()) { + if (i == 0) + param.append("?"); + else + param.append("&"); + param.append(key).append("=").append(params.get(key)); + i++; } - return result; + apiUrl += param; + String result = null; + + HttpGet httpPost = new HttpGet(apiUrl); + try (CloseableHttpClient httpclient = HttpClients.createDefault(); + CloseableHttpResponse response = httpclient.execute(httpPost); + InputStream inputStream = response.getEntity().getContent();) { + result = IOUtils.toString(inputStream, StandardCharsets.UTF_8); + } catch (IOException e) { + e.printStackTrace(); + } + return result; } /** @@ -141,33 +133,24 @@ public class HttpClientUtil { * @return */ public static String doPost(String apiUrl, Map params) { - CloseableHttpClient httpClient = HttpClients.createDefault(); - String httpStr = null; - HttpPost httpPost = new HttpPost(apiUrl); - CloseableHttpResponse response = null; - try { - httpPost.setConfig(requestConfig); - List pairList = new ArrayList<>(params.size()); - for (Map.Entry entry : params.entrySet()) { - NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry - .getValue().toString()); - pairList.add(pair); - } - httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8"))); - response = httpClient.execute(httpPost); + HttpPost httpPost = new HttpPost(apiUrl); + httpPost.setConfig(requestConfig); + List pairList = new ArrayList<>(params.size()); + for (Map.Entry entry : params.entrySet()) { + NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry + .getValue().toString()); + pairList.add(pair); + } + httpPost.setEntity(new UrlEncodedFormEntity(pairList, StandardCharsets.UTF_8)); + String httpStr = null; + try (CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = httpClient.execute(httpPost);) { + HttpEntity entity = response.getEntity(); httpStr = EntityUtils.toString(entity, "UTF-8"); } catch (IOException e) { e.printStackTrace(); - } finally { - if (response != null) { - try { - EntityUtils.consume(response.getEntity()); - } catch (IOException e) { - e.printStackTrace(); - } - } } return httpStr; } @@ -179,37 +162,24 @@ public class HttpClientUtil { * @return * @throws IOException */ - public static String doPost(String apiUrl, String json) throws IOException { - CloseableHttpClient httpClient = HttpClients.createDefault(); - String httpStr = null; - HttpPost httpPost = new HttpPost(apiUrl); - CloseableHttpResponse response = null; - - try { + public static String doPost(String apiUrl, String json) throws IOException { - httpPost.setConfig(requestConfig); - StringEntity stringEntity = new StringEntity(json,"UTF-8");//解决中文乱码问题 - stringEntity.setContentEncoding("UTF-8"); - stringEntity.setContentType("application/json"); - httpPost.setEntity(stringEntity); - response = httpClient.execute(httpPost); - HttpEntity entity = response.getEntity(); - httpStr = EntityUtils.toString(entity, "UTF-8"); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (response != null) { - try { - EntityUtils.consume(response.getEntity()); - } catch (IOException e) { - e.printStackTrace(); - } - } - if(httpClient!=null) { - httpClient.close(); - } - } - return httpStr; + HttpPost httpPost = new HttpPost(apiUrl); + httpPost.setConfig(requestConfig); + StringEntity stringEntity = new StringEntity(json, "UTF-8");//解决中文乱码问题 + stringEntity.setContentEncoding("UTF-8"); + stringEntity.setContentType("application/json"); + httpPost.setEntity(stringEntity); + + try (CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = httpClient.execute(httpPost);) { + + HttpEntity entity = response.getEntity(); + return EntityUtils.toString(entity, "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + return null; + } } /**