net core调用java API很慢的问题处理

背景:

在NET项目中用 HttpClient 来调用Java的API接口,发现很慢,  调用的java方法执行时间在java项目日志中记录为50ms左右, 但是在C#项目日志中显示调用了1000ms,

这种情况下压力测试很慢,并发量稍微高一点就超时,甚至导致服务内存无法释放,服务下线。

这里只有正确的 代码:

1: 这里需要需要用到单例加锁,不然容易在并发情况下导致大量的实例化 HttpClient

这里需要注意这个HttpClient的一个bug。

必须添加:下面2行代码,解决调用慢的问题,这是dll本身的bug

HttpClientHandler handler = new HttpClientHandler();

handler.UseProxy = false;

public class HttpClientHelper
    {
        private static HttpClient _client;

        private static readonly object _lock = new object();

        public static HttpClient GetClient()
        {

            try
            {
                if (_client == null)
                {
                    lock (_lock)
                    {
                        if (_client == null) {

                            HttpClientHandler handler = new HttpClientHandler();
                            handler.UseProxy = false;
                            _client = new HttpClient(handler);
                            _client.DefaultRequestHeaders.Connection.Add("keep-alive");
                            _client.Timeout = new TimeSpan(0, 0, 5);
                            return _client;
                        }                      
                    }
                }
                return _client;
            }
            catch (Exception)
            {
                return new HttpClient();
            }
        }
    }

2:调用方法,这里需要注意一下  这行代码:

httpClient.DefaultRequestHeaders.Clear();

public static string HttpWebRequestPostJsonNew(string postValues, string url)
        {
            string returnMsg = null;
            HttpClient httpClient = HttpClientHelper.GetClient();
            try
            {
                DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
                long timeStamp = (long)(DateTime.Now - startTime).TotalMilliseconds;
                string signPara = BQNewSysAccount + timeStamp + BQNewSysSecret;
                string sign = Sha256Hex(signPara);
                httpClient.DefaultRequestHeaders.Clear();
                httpClient.DefaultRequestHeaders.Add("mnappid", BQNewSysAccount);
                httpClient.DefaultRequestHeaders.Add("mnsign", sign);
                httpClient.DefaultRequestHeaders.Add("mntimestamp", timeStamp.ToString());
                var content = new StringContent(postValues, Encoding.UTF8, "application/json");
                System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                var result = httpClient.PostAsync(url, content).Result;
                returnMsg = result.Content.ReadAsStringAsync().Result;
                return returnMsg;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {

            }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要操作 OBS 软件并调用 Java API 实现人工配置方法,你需要按照以下步骤进行操作: 1. 下载 OBS Studio 并安装。OBS Studio 是一个免费的开源软件,用于录制和直播视频。 2. 在你的 Java 项目中添加 OBS 的 Java API 依赖。可以在 Maven 中添加以下依赖: ```xml <dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>5.7.4</version> </dependency> ``` 3. 创建一个 Java 类,用于连接 OBS 并调用API。可以使用以下代码片段来连接 OBS: ```java import com.sun.jna.Pointer; import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinDef; import com.sun.jna.platform.win32.WinUser; import java.util.Arrays; public class OBSConnector { private static final String OBS_WINDOW_CLASS = "Qt5QWindowIcon"; private static final String OBS_WINDOW_TITLE = "OBS 27.1.3 (64-bit, windows)"; private WinDef.HWND getOBSWindow() { char[] buffer = new char[1024]; User32.INSTANCE.EnumWindows((hwnd, pointer) -> { User32.INSTANCE.GetClassName(hwnd, buffer, buffer.length); if (OBS_WINDOW_CLASS.equals(new String(buffer).trim())) { User32.INSTANCE.GetWindowText(hwnd, buffer, buffer.length); if (OBS_WINDOW_TITLE.equals(new String(buffer).trim())) { return new BOOL(true); } } return new BOOL(false); }, null); return User32.INSTANCE.FindWindow(OBS_WINDOW_CLASS, OBS_WINDOW_TITLE); } public void connect() { WinDef.HWND obsWindow = getOBSWindow(); if (obsWindow != null) { User32.INSTANCE.SetForegroundWindow(obsWindow); User32.INSTANCE.PostMessage(obsWindow, WinUser.WM_COMMAND, new WinDef.WPARAM(0), new WinDef.LPARAM(0)); } } public void disconnect() { WinDef.HWND obsWindow = getOBSWindow(); if (obsWindow != null) { User32.INSTANCE.SetForegroundWindow(obsWindow); User32.INSTANCE.PostMessage(obsWindow, WinUser.WM_CLOSE, new WinDef.WPARAM(0), new WinDef.LPARAM(0)); } } } ``` 4. 在你的 Java 代码中,实例化 OBSConnector 并调用其 connect() 方法来连接 OBS。在连接成功后,你可以使用 OBS 的 Java API 来实现你需要的人工配置方法。 需要注意的是,OBS 的 Java API 并不是官方支持的 API,可能会在未来的 OBS 版本中发生变化。因此,建议在使用 OBS 的 Java API 时,仔细阅读文档和示例代码,并进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值