From 053ca2c023b1d06aa11150b68f623d2bcedcce20 Mon Sep 17 00:00:00 2001 From: wangwei <305939031@qq.com> Date: Fri, 29 Sep 2023 15:26:22 +0800 Subject: [PATCH] =?UTF-8?q?ffmpeg=E5=B7=A5=E5=85=B7=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- loadCmd.properties | 19 +- loadFFmpeg.properties | 2 +- .../ffch/handler/DefaultOutHandlerMethod.java | 5 + .../ffch/handler/KeepAliveHandler.java | 5 +- .../consumer/MqttConsumerCallBack.java | 2 +- .../mqttService/send/MqttProviderConfig.java | 7 +- .../spring/service/FFrtmpServer.java | 2 +- .../spring/service/MqttLiveHandle.java | 58 ++++-- .../spring/service/RtmpLiveService.java | 191 ++++++++++++++---- 9 files changed, 223 insertions(+), 68 deletions(-) diff --git a/loadCmd.properties b/loadCmd.properties index 730203c..7e668b0 100644 --- a/loadCmd.properties +++ b/loadCmd.properties @@ -1,13 +1,18 @@ #推流地址(eg:阿里云地址) -pushUrl=rtmp://192.168.10.101:19350/rlive/stream_12?sign=LeL5Wchx -#多路推流 -pushUrlMap=tee "[f=flv]rtmp://192.168.10.101:19350/rlive/stream_12?sign=LeL5Wchx | [f=flv]rtmp://192.168.10.101:19350/rlive/stream_17?sign=64FIaU8X" -pushUrl2=rtmp://192.168.10.101:19350/rlive/stream_17?sign=64FIaU8X +pushUrl=rtmp://192.168.10.101:19350/rlive/stream_11?sign=rHtBg3sz #拉流地址(eg:吊舱拉流的地址) -playUrl=http://192.168.10.101:18000/flv/live/34020000001110000001_34020000001320000099_0200000099.flv +#playUrl=http://192.168.10.101:18000/flv/live/34020000001110000001_34020000001320000099_0200000099.flv +playUrl=http://192.168.10.101:18000/flv/live/stream_176.flv #固定通道 1 获取通道 2 多线程双路 3 单线程多路 4 type=4 mqttUrl=tcp://106.15.120.154 -mqttTopic=/v1/123987/rtmp/live -time=60000 \ No newline at end of file +#主题 12345替换对应机场编号 004替换控制板id +mqttTopic=/v1/12345/rtmp/live,v1/004/confirm/DroneBMS + +#推流时长(毫秒)1000表示1秒 +time=600000 + +#多路推流(选配) +pushUrlMap=tee "[f=flv]rtmp://221.226.114.142:19350/rlive/stream_9?sign=f8a15b6n | [f=flv]rtmp://221.226.114.142:19350/rlive/stream_11?sign=rHtBg3sz" +pushUrl2=rtmp://192.168.10.101:19350/rlive/stream_17?sign=64FIaU8X \ No newline at end of file diff --git a/loadFFmpeg.properties b/loadFFmpeg.properties index e2dbd79..0e89a9a 100644 --- a/loadFFmpeg.properties +++ b/loadFFmpeg.properties @@ -8,6 +8,6 @@ callback=http://127.0.0.1/callback timeout=300 #寮鍚繚娲荤嚎绋 -keepalive=false +keepalive=true #鏄惁杈撳嚭debug娑堟伅 debug=true \ No newline at end of file diff --git a/src/main/java/com/github/bluesbruce/ffch/handler/DefaultOutHandlerMethod.java b/src/main/java/com/github/bluesbruce/ffch/handler/DefaultOutHandlerMethod.java index b55d1ea..33a4aa7 100644 --- a/src/main/java/com/github/bluesbruce/ffch/handler/DefaultOutHandlerMethod.java +++ b/src/main/java/com/github/bluesbruce/ffch/handler/DefaultOutHandlerMethod.java @@ -18,6 +18,7 @@ public class DefaultOutHandlerMethod implements OutHandlerMethod{ @Override public void parse(String id,String msg) { + long begin = System.currentTimeMillis(); //杩囨护娑堟伅 if (msg.indexOf("fail") != -1) { log.info(id + "浠诲姟鍙兘鍙戠敓鏁呴殰锛" + msg); @@ -31,6 +32,10 @@ public class DefaultOutHandlerMethod implements OutHandlerMethod{ log.info(id + "浠诲姟鍙兘鍙戠敓涓㈠寘10054锛" + msg); log.info("澶辫触锛岃缃腑鏂姸鎬"); isBroken=false; + }else if(msg.indexOf("Invalid")!= -1) { + log.info(id + "浠诲姟鍙兘鍙戠敓闈炴硶鍝嶅簲锛" + msg); + log.info("澶辫触锛岃缃腑鏂姸鎬"); + isBroken=true; }else { isBroken=false; log.info(id + "娑堟伅锛" + msg); diff --git a/src/main/java/com/github/bluesbruce/ffch/handler/KeepAliveHandler.java b/src/main/java/com/github/bluesbruce/ffch/handler/KeepAliveHandler.java index ddc4ec4..b86b061 100644 --- a/src/main/java/com/github/bluesbruce/ffch/handler/KeepAliveHandler.java +++ b/src/main/java/com/github/bluesbruce/ffch/handler/KeepAliveHandler.java @@ -3,6 +3,7 @@ package com.github.bluesbruce.ffch.handler; import com.github.bluesbruce.ffch.data.CommandTasker; import com.github.bluesbruce.ffch.data.TaskDao; import com.github.bluesbruce.ffch.util.ExecUtil; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import java.io.IOException; @@ -46,6 +47,7 @@ public class KeepAliveHandler extends Thread{ return false; } + @SneakyThrows @Override public void run() { for(;stop_index==0;) { @@ -54,7 +56,8 @@ public class KeepAliveHandler extends Thread{ } String id=null; CommandTasker task=null; - + Thread.sleep(2000); + //log.info("褰撳墠浠诲姟{}",queue); try { while(queue.peek() != null) { log.info("鍑嗗閲嶅惎浠诲姟锛"+queue); diff --git a/src/main/java/com/github/bluesbruce/spring/mqttService/consumer/MqttConsumerCallBack.java b/src/main/java/com/github/bluesbruce/spring/mqttService/consumer/MqttConsumerCallBack.java index 99ea6db..9d1e01b 100644 --- a/src/main/java/com/github/bluesbruce/spring/mqttService/consumer/MqttConsumerCallBack.java +++ b/src/main/java/com/github/bluesbruce/spring/mqttService/consumer/MqttConsumerCallBack.java @@ -46,7 +46,7 @@ public class MqttConsumerCallBack implements MqttCallback { log.info(String.format("鎺ユ敹娑堟伅Qos : %d", message.getQos())); log.info(String.format("鎺ユ敹娑堟伅鍐呭 : %s", new String(message.getPayload()))); log.info(String.format("鎺ユ敹娑堟伅retained : %b", message.isRetained())); - if (topic.contains("/rtmp/live")){ + if (topic.contains("/rtmp/live")||topic.contains("/data/DroneBMS")){ if (ObjectUtils.isEmpty(mqttLiveHandle)){ mqttLiveHandle = SpringUtil.getBean(MqttLiveHandle.class); } diff --git a/src/main/java/com/github/bluesbruce/spring/mqttService/send/MqttProviderConfig.java b/src/main/java/com/github/bluesbruce/spring/mqttService/send/MqttProviderConfig.java index 4bb2ab4..820ad00 100644 --- a/src/main/java/com/github/bluesbruce/spring/mqttService/send/MqttProviderConfig.java +++ b/src/main/java/com/github/bluesbruce/spring/mqttService/send/MqttProviderConfig.java @@ -62,7 +62,12 @@ public class MqttProviderConfig { //璁剧疆鍥炶皟 client.setCallback(new MqttConsumerCallBack()); client.connect(options); - client.subscribe(cmdParam.getMqttTopic(),0); + + String[] topics= cmdParam.getMqttTopic().split(","); + for (String topic :topics) { + client.subscribe(topic,0); + } + } catch(MqttException e){ e.printStackTrace(); } diff --git a/src/main/java/com/github/bluesbruce/spring/service/FFrtmpServer.java b/src/main/java/com/github/bluesbruce/spring/service/FFrtmpServer.java index 428fccc..3571fbf 100644 --- a/src/main/java/com/github/bluesbruce/spring/service/FFrtmpServer.java +++ b/src/main/java/com/github/bluesbruce/spring/service/FFrtmpServer.java @@ -22,7 +22,7 @@ public class FFrtmpServer implements ApplicationRunner { @Override public void run(ApplicationArguments args) { try { - /*CommandManager manager = new CommandManagerImpl(); + /* CommandManager manager = new CommandManagerImpl(); // -rtsp_transport tcp //娴嬭瘯澶氫釜浠讳綍鍚屾椂鎵ц鍜屽仠姝㈡儏鍐 //false琛ㄧず浣跨敤閰嶇疆鏂囦欢涓殑ffmpeg璺緞锛宼rue琛ㄧず鏈潯鍛戒护宸茬粡鍖呭惈ffmpeg鎵鍦ㄧ殑瀹屾暣璺緞 diff --git a/src/main/java/com/github/bluesbruce/spring/service/MqttLiveHandle.java b/src/main/java/com/github/bluesbruce/spring/service/MqttLiveHandle.java index 3ad3b6c..84c7282 100644 --- a/src/main/java/com/github/bluesbruce/spring/service/MqttLiveHandle.java +++ b/src/main/java/com/github/bluesbruce/spring/service/MqttLiveHandle.java @@ -1,12 +1,15 @@ package com.github.bluesbruce.spring.service; import com.alibaba.fastjson.JSONObject; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; @Component +@Slf4j public class MqttLiveHandle { @Autowired private RtmpLiveService rtmpLiveService; @@ -14,18 +17,49 @@ public class MqttLiveHandle { public void handleLive(final String topic, MqttMessage message){ String objmsg = new String(message.getPayload()); final JSONObject jsonObject = JSONObject.parseObject(objmsg); - if (!ObjectUtils.isEmpty(jsonObject.get("command"))){ - String cmdoperat = jsonObject.get("command").toString(); - if (cmdoperat.equals("start")){ - Thread thread = new Thread(new Runnable() { - String code= jsonObject.get("code")==null?topic.split("/")[2]:jsonObject.get("code").toString(); - public void run() { - rtmpLiveService.pushServer(code); - } - }); - thread.start(); - }else if (cmdoperat.equals("stop")){ - rtmpLiveService.stopRtmp(); + if (topic.contains("rtmp/live")) { + if (!ObjectUtils.isEmpty(jsonObject.get("command"))) { + String cmdoperat = jsonObject.get("command").toString(); + if (cmdoperat.equals("start")) { + Thread thread = new Thread(new Runnable() { + String code = jsonObject.get("code") == null ? topic.split("/")[2] : jsonObject.get("code").toString(); + + public void run() { + try { + rtmpLiveService.pushServer(code); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); + thread.start(); + } else if (cmdoperat.equals("stop")) { + rtmpLiveService.stopRtmp(); + } + } + }else if(topic.contains("/data/DroneBMS")){ + log.info("鑾峰彇object锛",jsonObject); + if (!ObjectUtils.isEmpty(jsonObject.get("parm"))) { + log.info("鑾峰彇param锛",jsonObject.get("parm")); + JSONObject cmdoperat = jsonObject.getJSONObject("parm"); + String boolbms = cmdoperat.getString("Power"); + log.info("boolbms锛",jsonObject.get("Power")); + if (boolbms.equals("on")) { + Thread thread = new Thread(new Runnable() { + String code = jsonObject.get("code") == null ? topic.split("/")[2] : jsonObject.get("code").toString(); + public void run() { + try { + rtmpLiveService.pushServer(code); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); + thread.start(); + } else if (boolbms.equals("off")) { + log.info("鍏抽棴娴"); + rtmpLiveService.stopRtmp(); + } } } } diff --git a/src/main/java/com/github/bluesbruce/spring/service/RtmpLiveService.java b/src/main/java/com/github/bluesbruce/spring/service/RtmpLiveService.java index 705fc87..969d09c 100644 --- a/src/main/java/com/github/bluesbruce/spring/service/RtmpLiveService.java +++ b/src/main/java/com/github/bluesbruce/spring/service/RtmpLiveService.java @@ -25,59 +25,156 @@ public class RtmpLiveService { /** * 鍔犺浇閰嶇疆鏂囦欢鐨勬帹鎷夋祦鍦板潃 */ - public static final CmdParam cmdParam=load("/loadCmd.properties", CmdParam.class); + public static final CmdParam cmdParam = load("/loadCmd.properties", CmdParam.class); @Autowired private MqttProviderConfig mqttProviderConfig; public static final CommandManager manager = new CommandManagerImpl(); + /** * h鑾峰彇閫氶亾骞舵帹閫 */ - public void pushServer(String code){ + public void pushServer(String code) throws InterruptedException { //CommandManager manager = new CommandManagerImpl(); - String reTopic = cmdParam.getMqttTopic().replace("live","result"); + String reTopic = cmdParam.getMqttTopic().replace("live", "result"); JSONObject jsonObject = new JSONObject(); Collection infoList = manager.queryAll(); log.info(infoList.toString()); - if (infoList.size()>0){ - jsonObject.put("code", -1); + if (infoList.size() > 0) { + //manager.stopAll(); + //manager.destory(); + //Thread.sleep(3000); + /*jsonObject.put("code", -1); jsonObject.put("msg", "鎺ㄦ祦鏈嶅姟宸插惎鍔紝璇峰嬁閲嶅鍚姩"); //鎺ㄦ祦澶辫触 - mqttProviderConfig.publish(2,false,reTopic,jsonObject.toJSONString()); + mqttProviderConfig.publish(2,false,reTopic,jsonObject.toJSONString());*/ + log.info("浠诲姟杩愯涓"); return; } - String pushUrl=""; - if (cmdParam.getType()==2){ + String pushUrl = ""; + if (cmdParam.getType() == 2) { log.info("鑾峰彇娴佸獟浣撻氶亾"); //TODO 鑾峰彇閫氶亾鏈嶅姟鎺ㄦ媺娴佸湴鍧 JSONObject object = getChenl(); - if (!ObjectUtils.isEmpty(object)){ + if (!ObjectUtils.isEmpty(object)) { code = object.get("code").toString(); object.put("code", 0); object.put("msg", "鑾峰彇閫氶亾鎴愬姛"); - mqttProviderConfig.publish(2,false,reTopic,object.toJSONString()); - }else{ + mqttProviderConfig.publish(2, false, reTopic, object.toJSONString()); + } else { log.info("鑾峰彇閫氶亾澶辫触"); object.put("code", -1); object.put("msg", "鑾峰彇閫氶亾澶辫触"); - mqttProviderConfig.publish(2,false,reTopic,object.toJSONString()); + mqttProviderConfig.publish(2, false, reTopic, object.toJSONString()); return; } + runRtmp(pushUrl, cmdParam.getPlayUrl(), code); //TODO end - }else{ + } else if (cmdParam.getType() == 1) { log.info("浣跨敤鍥哄畾娴佸獟浣撻氶亾"); - pushUrl= cmdParam.getPushUrl(); + pushUrl = cmdParam.getPushUrl(); + runRtmp(pushUrl, cmdParam.getPlayUrl(), code); + } else if (cmdParam.getType() == 3) { + runRtmp2to2(cmdParam.getPlayUrl()); + } else if (cmdParam.getType() == 4) { + runRtmp1to2(cmdParam.getPlayUrl()); } - runRtmp(pushUrl,cmdParam.getPlayUrl(),code); + + } + + private void runRtmp2to2(String playUrl) throws InterruptedException { + try { + String reTopic = cmdParam.getMqttTopic().replace("live", "result"); + String taskId = manager.start("test1", CommandBuidlerFactory.createBuidler() + .add("ffmpeg").add("-i", playUrl) + .add("-rtsp_transport", "tcp") + .add("-vcodec", "copy") + .add("-acodec", "copy") + .add("-f", "flv") + .add("-b:v", "2M") + .add("-maxrate", "2M") + .add("-bufsize", "1M") + .add("-y").add(cmdParam.getPushUrl())); + Thread.sleep(3000); + String taskId2 = manager.start("test2", CommandBuidlerFactory.createBuidler() + .add("ffmpeg").add("-i", playUrl) + .add("-rtsp_transport", "tcp") + .add("-vcodec", "copy") + .add("-acodec", "copy") + .add("-f", "flv") + .add("-b:v", "2M") + .add("-maxrate", "2M") + .add("-bufsize", "1M") + .add("-y").add(cmdParam.getPushUrl2())); + JSONObject jsonObject = new JSONObject(); + if (StringUtils.isNullOrEmpty(taskId) && StringUtils.isNullOrEmpty(taskId2)) { + jsonObject.put("code", -1); + jsonObject.put("msg", "鎺ㄦ祦鏈嶅姟澶辫触"); //鎺ㄦ祦澶辫触 + mqttProviderConfig.publish(2, false, reTopic, jsonObject.toJSONString()); + // 鍋滄鍏ㄩ儴浠诲姟 + manager.stopAll(); + return; + } else { + jsonObject.put("code", 0); + jsonObject.put("msg", "鎺ㄦ祦鏈嶅姟鍚姩鎴愬姛"); + mqttProviderConfig.publish(2, false, reTopic, jsonObject.toJSONString()); + } + Thread.sleep(cmdParam.getTime()); + log.info(manager.queryAll().toString()); + // 鍋滄鍏ㄩ儴浠诲姟 + manager.stopAll(); + manager.destory(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void runRtmp1to2(String playUrl) { + try { + //鍗曡繘绋 澶氳矾 + String reTopic = cmdParam.getMqttTopic().replace("live", "result"); + String taskId = manager.start("test4", CommandBuidlerFactory.createBuidler() + .add("ffmpeg").add("-i", playUrl) + .add("-rtsp_transport", "tcp") + .add("-vcodec", "copy") + .add("-acodec", "copy") + .add("-b:v", "2M") + .add("-maxrate", "2M") + .add("-bufsize", "1M") + //澶氳矾鎺ㄦ祦娴嬭瘯 + .add("-map", "0") + .add("-f").add(cmdParam.getPushUrlMap())); + JSONObject jsonObject = new JSONObject(); + if (StringUtils.isNullOrEmpty(taskId)) { + jsonObject.put("code", -1); + jsonObject.put("msg", "鎺ㄦ祦鏈嶅姟澶辫触"); //鎺ㄦ祦澶辫触 + mqttProviderConfig.publish(2, false, reTopic, jsonObject.toJSONString()); + // 鍋滄鍏ㄩ儴浠诲姟 + manager.stopAll(); + return; + } else { + jsonObject.put("code", 0); + jsonObject.put("msg", "鎺ㄦ祦鏈嶅姟鍚姩鎴愬姛"); + mqttProviderConfig.publish(2, false, reTopic, jsonObject.toJSONString()); + } + Thread.sleep(cmdParam.getTime()); + log.info(manager.queryAll().toString()); + // 鍋滄鍏ㄩ儴浠诲姟 + manager.stopAll(); + manager.destory(); + } catch (Exception e) { + e.printStackTrace(); + } } /** * 鑾峰彇闃块噷浜戦氶亾 + * * @return */ private JSONObject getChenl() { - String result = HttpURLConnectionUtil.doGet("https://streaming.t-aaron.com/livechannel/getLiveChannelList"); + String result = HttpURLConnectionUtil.doGet("https://streaming.t-aaron.com/livechannel/getLiveChannelList"); if (!StringUtils.isNullOrEmpty(result)) { try { JSONObject object = JSONObject.parseObject(result); @@ -100,10 +197,10 @@ public class RtmpLiveService { } } - }catch (Exception e){ - log.error("",e); + } catch (Exception e) { + log.error("", e); } - }else{ + } else { return null; } return null; @@ -112,49 +209,54 @@ public class RtmpLiveService { /** * 鏍规嵁鎺ㄦ媺娴佸湴鍧鎺ㄥ姩 + * * @param pushUrl * @param playUrl */ - public void runRtmp(String pushUrl,String playUrl,String code) { + public void runRtmp(String pushUrl, String playUrl, String code) { try { log.info("鑾峰彇鎾祦鍦板潃锛歿}"); //CommandManager manager = new CommandManagerImpl(); - String taskId = manager.start(code, CommandBuidlerFactory.createBuidler() - .add("ffmpeg").add("-i",playUrl) - .add("-rtsp_transport","tcp") - .add("-vcodec","copy") - .add("-acodec","copy") - .add("-f","flv") + String taskId = manager.start(code, CommandBuidlerFactory.createBuidler() + .add("ffmpeg").add("-i", playUrl) + .add("-rtsp_transport", "tcp") + .add("-vcodec", "copy") + .add("-acodec", "copy") + .add("-f", "flv") + .add("-b:v", "2M") + .add("-maxrate", "2M") + .add("-bufsize", "1M") + .add("-v", "trace ") .add("-y").add(pushUrl)); cmdParam.getMqttTopic(); - String reTopic = cmdParam.getMqttTopic().replace("live","result"); + String reTopic = cmdParam.getMqttTopic().replace("live", "result"); log.info(manager.queryAll().toString()); JSONObject jsonObject = new JSONObject(); - if (StringUtils.isNullOrEmpty(taskId)){ + if (StringUtils.isNullOrEmpty(taskId)) { jsonObject.put("code", -1); jsonObject.put("msg", "鎺ㄦ祦鏈嶅姟澶辫触"); //鎺ㄦ祦澶辫触 - mqttProviderConfig.publish(2,false,reTopic,jsonObject.toJSONString()); + mqttProviderConfig.publish(2, false, reTopic, jsonObject.toJSONString()); // 鍋滄鍏ㄩ儴浠诲姟 manager.stopAll(); return; - }else { + } else { jsonObject.put("code", 0); jsonObject.put("msg", "鎺ㄦ祦鏈嶅姟鍚姩鎴愬姛"); - mqttProviderConfig.publish(2,false,reTopic,jsonObject.toJSONString()); + mqttProviderConfig.publish(2, false, reTopic, jsonObject.toJSONString()); } - Thread.sleep(36000); + Thread.sleep(cmdParam.getTime()); log.info(manager.queryAll().toString()); // 鍋滄鍏ㄩ儴浠诲姟 manager.stopAll(); manager.destory(); - }catch (Exception e){ - log.error("",e); + } catch (Exception e) { + log.error("", e); } //ds.close(); } - public void stopRtmp() { + public void stopRtmp() { try { log.info("鍋滄鎺ㄦ祦"); //CommandManager manager = new CommandManagerImpl(); @@ -162,22 +264,22 @@ public class RtmpLiveService { int index = manager.stopAll(); manager.destory(); JSONObject jsonObject = new JSONObject(); - String reTopic = cmdParam.getMqttTopic().replace("live","result"); - if (index==0){ + String reTopic = cmdParam.getMqttTopic().replace("live", "result"); + if (index == 0) { jsonObject.put("code", -1); jsonObject.put("msg", "鎺ㄦ祦鏈嶅姟鍏抽棴澶辫触"); //鎺ㄦ祦澶辫触 - mqttProviderConfig.publish(2,false,reTopic,jsonObject.toJSONString()); + mqttProviderConfig.publish(2, false, reTopic, jsonObject.toJSONString()); // 鍋滄鍏ㄩ儴浠诲姟 manager.stopAll(); return; - }else if (index>0){ + } else if (index > 0) { jsonObject.put("code", 0); jsonObject.put("msg", "鎺ㄦ祦鏈嶅姟鍏抽棴鎴愬姛"); returnChenl(); - mqttProviderConfig.publish(2,false,reTopic,jsonObject.toJSONString()); + mqttProviderConfig.publish(2, false, reTopic, jsonObject.toJSONString()); } - }catch (Exception e){ - log.error("",e); + } catch (Exception e) { + log.error("", e); } //ds.close(); } @@ -185,6 +287,7 @@ public class RtmpLiveService { /** * 閲婃斁闃块噷浜戦氶亾 + * * @return */ private JSONObject returnChenl() { @@ -215,8 +318,8 @@ public class RtmpLiveService { return null; } return null; - }catch (Exception e){ - log.error("",e); + } catch (Exception e) { + log.error("", e); } return null; }