@Slf4j
@Component
public class SocketServer {
public void start() throws IOException {
ExecutorService newCacheThreadPool = new ThreadPoolExecutor(
10,
100,
3,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(1000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy()
);
Integer prot = Integer.parseInt(AppConfigUtil.getProperty("aaa.org.socket.prot"));
ServerSocket server = new ServerSocket(prot);
log.info("socket服务端启动....端口:{}", prot);
while (true) {
final Socket socket = server.accept();
log.info("开始处理请求");
newCacheThreadPool.execute(() -> {
try {
handler(socket);
} catch (Exception e) {
log.error("socket异常");
e.printStackTrace();
}
});
}
}
private void handler(Socket socket) throws Exception {
MDC.put(RequestListener.LOG_ID, UuidUtil.millisIdStr());
//输入流接收数据
InputStream inputStream = socket.getInputStream();
//输出流发送数据
OutputStream outputStream = socket.getOutputStream();
try {
while (true) {
byte[] buf = new byte[10240];
int len = inputStream.read(buf);
StringBuilder sb = new StringBuilder();
if ( len > 0) {
// 注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
sb.append(new String(buf, 0, len, StandardCharsets.UTF_8));
log.info("hl7消息数据:{}",sb.toString());
if (sb != null) {
String result = sb.toString().replaceAll("\n", "\r")
.replaceAll("\u000B", "").replaceAll("amp;", "").replaceAll("\u001c", "").replaceAll("\ufffd", "");
new HL7Convert().hl7Text2Obj(result, inputStream, outputStream);
}
}else {
log.info("Socket没有数据");
break;
}
}
} catch (IOException e) {
e.printStackTrace();
log.error("socket异常");
} finally {
log.info("socket关闭");
try {
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
log.error("关闭socket异常");
}
}
}
}
使用该代码接收socket数据时,本地测试是没有问题的,但是部署到正式环境上就不行了,部署到正式环境上面可能是数据发送方发送的数据太多了或者连接的socket连接数太多了,导致后面再发送数据的时候,只会打印”开始处理请求“日志,而没有打印“hl7消息数据”日志,希望帮忙看下