最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java連接opcua的常見問題及解決方法

 更新時(shí)間:2025年06月05日 14:30:49   作者:胡八一、  
本文將使用 Eclipse Milo 作為示例庫,演示如何在Java中使用匿名、用戶名密碼以及證書加密三種方式連接到 OPC UA 服務(wù)器,若需要使用其他 SDK,原理大同小異,API 的調(diào)用方式會(huì)有所不同,對(duì)java連接opcua的相關(guān)知識(shí)感興趣的朋友一起看看吧

一、前言

OPC UA(Open Platform Communications Unified Architecture)是針對(duì)工業(yè)自動(dòng)化領(lǐng)域的跨平臺(tái)通信協(xié)議標(biāo)準(zhǔn)。它在 OPC 經(jīng)典版本的基礎(chǔ)上進(jìn)行優(yōu)化,可以在不同操作系統(tǒng)、設(shè)備和編程語言之間進(jìn)行安全且可靠的數(shù)據(jù)交換。對(duì)于很多工業(yè)控制、設(shè)備監(jiān)控以及物聯(lián)網(wǎng)相關(guān)項(xiàng)目,OPC UA 是常用的數(shù)據(jù)通信方式。

在 Java 中,我們常用的 OPC UA 客戶端開發(fā)庫包括:

本篇將使用 Eclipse Milo 作為示例庫,演示如何在 Java 中使用匿名、用戶名密碼以及證書加密三種方式連接到 OPC UA 服務(wù)器。若需要使用其他 SDK,原理大同小異,API 的調(diào)用方式會(huì)有所不同。

二、準(zhǔn)備工作

JDK
建議至少使用 JDK 8 或更高版本。

Maven 或 Gradle
便于引入 Eclipse Milo 等依賴。如果使用 Maven,請?jiān)?pom.xml 中添加以下依賴:

<dependency>
    <groupId>org.eclipse.milo</groupId>
    <artifactId>sdk-client</artifactId>
    <version>0.6.15</version> 
    <!-- 版本號(hào)可根據(jù)需要更新 -->
</dependency>
<dependency>
         <groupId>org.eclipse.milo</groupId>
         <artifactId>server-examples</artifactId>
         <version>0.6.15</version> 
     </dependency>

如果使用 Gradle,則在 build.gradle 中添加:

implementation 'org.eclipse.milo:sdk-client:0.6.15'

OPC UA 服務(wù)器
本地或遠(yuǎn)程的 OPC UA 服務(wù)器環(huán)境,用于測試連接??梢栽谔摂M機(jī)或本地主機(jī)上安裝開源的 OPC UA 服務(wù)器,也可以使用商業(yè)軟件自帶的模擬服務(wù)器。

證書文件(僅在證書加密方式時(shí)需要)

若您在服務(wù)器上開啟了證書加密,需要準(zhǔn)備好客戶端證書(public key)和客戶端私鑰(private key),也可能需要服務(wù)器的信任證書。Eclipse Milo 提供了簡單的證書管理機(jī)制,或者您也可以使用標(biāo)準(zhǔn) Java KeyStore 的方式來存儲(chǔ)并讀取證書和私鑰。

三、匿名方式連接

3.1 匿名方式簡介

匿名連接是最簡單的方式,不需要用戶名、密碼或任何證書。只要服務(wù)器允許匿名訪問,就可以通過匿名方式連接。適合在測試環(huán)境或?qū)Π踩蟛桓叩膱鼍跋率褂谩?/p>

3.2 示例代碼

以下演示最基本的匿名連接流程,包括:

  • 創(chuàng)建 OPC UA Client 配置
  • 初始化并連接到服務(wù)器
  • 讀取或?qū)懭霐?shù)據(jù)(僅作示例)

請確保替換示例中的 endpointUrlnodeId 等信息為你自己的實(shí)際配置。

import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy;
import org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder;
import org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription;
import org.eclipse.milo.opcua.stack.core.types.structured.UserTokenPolicy;
import org.eclipse.milo.opcua.stack.core.types.enumerated.UserTokenType;
import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class OpcUaAnonymousExample {
    public static void main(String[] args) {
        try {
            // OPC UA 服務(wù)器地址,例如 "opc.tcp://localhost:49320"
            String url= "opc.tcp://127.0.0.1:49320";
            // 創(chuàng)建 client
                OpcUaClient client = OpcUaClient.create(url,
                        endpoints ->
                                endpoints.stream()
                                        .filter(e -> e.getSecurityPolicyUri().equals(SecurityPolicy.None.getUri()))
                                        .findFirst(),
                        configBuilder ->
                                configBuilder
                                        //訪問方式
                                        .setIdentityProvider(new AnonymousProvider())
                                        .setRequestTimeout(UInteger.valueOf(5000))
                                        .build());
            }
            // 連接到服務(wù)器
            CompletableFuture<OpcUaClient> future = client.connect();
            future.get(); // 等待連接完成
            System.out.println("匿名連接成功!");
            // 在此處可以進(jìn)行讀寫操作,例如讀取節(jié)點(diǎn)的值
            // client.readValue(0, TimestampsToReturn.Both, new ReadValueId(NodeId, ...));
            // ...
            // 最后斷開連接
            client.disconnect().get();
            System.out.println("客戶端斷開連接。");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 簡單選擇一個(gè)安全策略為 None 的端點(diǎn)(匿名方式一般使用安全策略None,具體看服務(wù)器配置)
    private static EndpointDescription chooseSecureEndpoint(List<EndpointDescription> endpoints) {
        EndpointDescription result = null;
        for (EndpointDescription e : endpoints) {
            if (e.getSecurityPolicyUri().equals(SecurityPolicy.None.getUri())) {
                result = e;
                break;
            }
        }
        return result;
    }
}

在上述示例中,最關(guān)鍵的步驟是將身份認(rèn)證方式設(shè)為 new AnonymousProvider() 并選擇一個(gè) SecurityPolicy 為 None 的 endpoint。這樣即可使用匿名方式成功連接。

四、用戶名密碼方式連接

4.1 用戶名密碼方式簡介

在實(shí)際生產(chǎn)環(huán)境中,常常需要使用賬號(hào)密碼進(jìn)行身份驗(yàn)證,以限制訪問權(quán)限、保護(hù)關(guān)鍵信息。與匿名方式相比,多了用戶名密碼的配置,但整體流程類似。

4.2 示例代碼

import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy;
import org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder;
import org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription;
import org.eclipse.milo.opcua.stack.core.types.structured.UserTokenPolicy;
import org.eclipse.milo.opcua.stack.core.types.enumerated.UserTokenType;
import org.eclipse.milo.opcua.sdk.client.api.identity.UsernameProvider;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class OpcUaUsernamePasswordExample {
    public static void main(String[] args) {
        try {
            String endpointUrl = "opc.tcp://127.0.0.1:4840";
            List<EndpointDescription> endpoints = OpcUaClient
                    .getEndpoints(endpointUrl).get();
            EndpointDescription endpoint = chooseUserNameEndpoint(endpoints);
            OpcUaClientConfigBuilder configBuilder = new OpcUaClientConfigBuilder();
            configBuilder.setEndpoint(endpoint);
            // 假設(shè)用戶名為 "user", 密碼為 "password"
            configBuilder.setIdentityProvider(new UsernameProvider("user", "password"));
            OpcUaClient client = OpcUaClient.create(configBuilder.build());
            CompletableFuture<OpcUaClient> future = client.connect();
            future.get();
            System.out.println("用戶名密碼方式連接成功!");
            // 進(jìn)行后續(xù)讀寫操作
            // ...
            client.disconnect().get();
            System.out.println("客戶端斷開連接。");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static EndpointDescription chooseUserNameEndpoint(List<EndpointDescription> endpoints) {
        // 通常 OPC UA 服務(wù)器也支持 SecurityPolicy.None + UserName 方式
        // 也可能是 Basic128Rsa15, Basic256, etc. 具體看服務(wù)端配置
        for (EndpointDescription e : endpoints) {
            if (e.getSecurityPolicyUri().equals(SecurityPolicy.None.getUri())) {
                // 確保端點(diǎn)支持 UserName 類型的認(rèn)證
                for (UserTokenPolicy tokenPolicy : e.getUserIdentityTokens()) {
                    if (tokenPolicy.getTokenType() == UserTokenType.UserName) {
                        return e;
                    }
                }
            }
        }
        return null;
    }
}

要點(diǎn)說明:

  • 將 IdentityProvider 切換為 new UsernameProvider("username", "password")。
  • 根據(jù)服務(wù)端提供的用戶名、密碼進(jìn)行配置。
  • 需要注意端點(diǎn)是否支持 UserName 類型認(rèn)證。如果端點(diǎn)僅支持 Anonymous 或 Certificate,則無法使用用戶名密碼方式。

五、證書加密方式連接

5.1 證書加密方式簡介

在實(shí)際工業(yè)環(huán)境中,安全性要求更高時(shí)通常會(huì)啟用證書加密(基于 Public Key Infrastructure)。

  • 每個(gè)客戶端都會(huì)持有一份證書(公鑰)和對(duì)應(yīng)的私鑰,服務(wù)器端也有自己的證書。
  • 當(dāng)客戶端與服務(wù)器通信時(shí),會(huì)先驗(yàn)證雙方的證書簽名并進(jìn)行加密傳輸,從而保證安全性與完整性。

在這種方式下,服務(wù)端可能要求:

  • 客戶端必須提供已經(jīng)被服務(wù)器信任(或在服務(wù)器端手動(dòng)信任)的證書。
  • 采用特定的安全策略(例如 Basic256Sha256)并通過相應(yīng)端點(diǎn)連接。

5.2 證書和私鑰獲取

  • 可以通過第三方工具(例如 openssl、keytool 或 Eclipse Milo 提供的證書工具腳本)生成自簽名證書。
  • 生成后的證書和私鑰,可以存儲(chǔ)在 Java KeyStore 中,或者存儲(chǔ)為 .der、.pem 等格式并讓應(yīng)用程序讀取。

下方示例假設(shè)已經(jīng)擁有 ClientCert.der(客戶端公鑰)和 ClientKey.der(客戶端私鑰),并且服務(wù)器端配置了對(duì)應(yīng)的信任或信任鏈。

OPC UA訪問證書類

import org.eclipse.milo.opcua.sdk.server.util.HostnameUtil;
import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateBuilder;
import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.*;
import java.security.cert.X509Certificate;
import java.util.regex.Pattern;
class KeyStoreLoader {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    private static final Pattern IP_ADDR_PATTERN = Pattern.compile(
        "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");
    // 證書別名
    private static final String CLIENT_ALIAS = "client-ai";
    // 獲取私鑰的密碼
    private static final char[] PASSWORD = "password".toCharArray();
    // 證書對(duì)象
    private X509Certificate clientCertificate;
    // 密鑰對(duì)對(duì)象
    private KeyPair clientKeyPair;
    KeyStoreLoader load(Path baseDir) throws Exception {
        // 創(chuàng)建一個(gè)使用`PKCS12`加密標(biāo)準(zhǔn)的KeyStore。KeyStore在后面將作為讀取和生成證書的對(duì)象。
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        // PKCS12的加密標(biāo)準(zhǔn)的文件后綴是.pfx,其中包含了公鑰和私鑰。
        // 而其他如.der等的格式只包含公鑰,私鑰在另外的文件中。
        Path serverKeyStore = baseDir.resolve("example-client.pfx");
        logger.info("Loading KeyStore at {}", serverKeyStore);
        // 如果文件不存在則創(chuàng)建.pfx證書文件。
        if (!Files.exists(serverKeyStore)) {
            keyStore.load(null, PASSWORD);
            // 用2048位的RAS算法。`SelfSignedCertificateGenerator`為Milo庫的對(duì)象。
            KeyPair keyPair = SelfSignedCertificateGenerator.generateRsaKeyPair(2048);
            // `SelfSignedCertificateBuilder`也是Milo庫的對(duì)象,用來生成證書。
            // 中間所設(shè)置的證書屬性可以自行修改。
            SelfSignedCertificateBuilder builder = new SelfSignedCertificateBuilder(keyPair)
                .setCommonName("Eclipse Milo Example Client")
                .setOrganization("digitalpetri")
                .setOrganizationalUnit("dev")
                .setLocalityName("Folsom")
                .setStateName("CA")
                .setCountryCode("US")
                .setApplicationUri("urn:eclipse:milo:examples:client")
                .addDnsName("localhost")
                .addIpAddress("127.0.0.1");
            // Get as many hostnames and IP addresses as we can listed in the certificate.
            for (String hostname : HostnameUtil.getHostnames("0.0.0.0")) {
                if (IP_ADDR_PATTERN.matcher(hostname).matches()) {
                    builder.addIpAddress(hostname);
                } else {
                    builder.addDnsName(hostname);
                }
            }
            // 創(chuàng)建證書
            X509Certificate certificate = builder.build();
            // 設(shè)置對(duì)應(yīng)私鑰的別名,密碼,證書鏈
            keyStore.setKeyEntry(CLIENT_ALIAS, keyPair.getPrivate(), PASSWORD, new X509Certificate[]{certificate});
            try (OutputStream out = Files.newOutputStream(serverKeyStore)) {
                // 保存證書到輸出流
                keyStore.store(out, PASSWORD);
            }
        } else {
            try (InputStream in = Files.newInputStream(serverKeyStore)) {
                // 如果文件存在則讀取
                keyStore.load(in, PASSWORD);
            }
        }
        // 用密碼獲取對(duì)應(yīng)別名的私鑰。
        Key serverPrivateKey = keyStore.getKey(CLIENT_ALIAS, PASSWORD);
        if (serverPrivateKey instanceof PrivateKey) {
            // 獲取對(duì)應(yīng)別名的證書對(duì)象。
            clientCertificate = (X509Certificate) keyStore.getCertificate(CLIENT_ALIAS);
            // 獲取公鑰
            PublicKey serverPublicKey = clientCertificate.getPublicKey();
            // 創(chuàng)建Keypair對(duì)象。
            clientKeyPair = new KeyPair(serverPublicKey, (PrivateKey) serverPrivateKey);
        }
        return this;
    }
    // 返回證書
    X509Certificate getClientCertificate() {
        return clientCertificate;
    }
    // 返回密鑰對(duì)
    KeyPair getClientKeyPair() {
        return clientKeyPair;
    }
}

5.3 示例代碼

public static OpcUaClient initClient(String url,SecurityPolicy securityPolicy) {
        try {
            if (securityPolicy.equals(SecurityPolicy.None)){
                return OpcUaClient.create(url,
                        endpoints ->
                                endpoints.stream()
                                        .filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getUri()))
                                        .findFirst(),
                        configBuilder ->
                                configBuilder
                                        //訪問方式
                                        .setIdentityProvider(new AnonymousProvider())
                                        .setRequestTimeout(UInteger.valueOf(5000))
                                        .build());
            }
            Path securityTempDir = Paths.get(System.getProperty("java.io.tmpdir"), "security");
            Files.createDirectories(securityTempDir);
            if (!Files.exists(securityTempDir)) {
                throw new Exception("unable to create security dir: " + securityTempDir);
            }
            KeyStoreLoader loader = new KeyStoreLoader().load(securityTempDir);
            File pkiDir = securityTempDir.resolve("pki").toFile();
            DefaultTrustListManager trustListManager = new DefaultTrustListManager(pkiDir);
            DefaultClientCertificateValidator certificateValidator =
                    new DefaultClientCertificateValidator(trustListManager);
            String hostName = InetAddress.getLocalHost().getHostName();
            return OpcUaClient.create(url,
                    endpoints ->
                            endpoints.stream()
                                    .map(endpoint -> {
                                        // 構(gòu)建一個(gè)新的 EndpointDescription(可選修改某些字段)
                                        return new EndpointDescription(
                                                url,
                                                endpoint.getServer(),
                                                endpoint.getServerCertificate(),
                                                endpoint.getSecurityMode(), // 或者強(qiáng)制改為某種模式
                                                endpoint.getSecurityPolicyUri(),
                                                endpoint.getUserIdentityTokens(),
                                                endpoint.getTransportProfileUri(),
                                                endpoint.getSecurityLevel()
                                        );
                                    })
                                    .filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getUri()))
                                    .findFirst(),
                    configBuilder ->
                            configBuilder
                                    //訪問方式
                                    .setApplicationName(LocalizedText.english("datacollector-driver"))
                                    .setApplicationUri(String.format("urn:%s:opcua-client", hostName))  // 必須與證書中的URI一致
                                    .setKeyPair(loader.getClientKeyPair())
                                    .setCertificate(loader.getClientCertificate())
                                    .setCertificateChain(loader.getClientCertificateChain())
                                    .setCertificateValidator(certificateValidator)
                                    .setIdentityProvider(new UsernameProvider("admin", "123456"))
                                    .setRequestTimeout(UInteger.valueOf(5000))
                                    .build());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

證書路徑

我們需要把服務(wù)器證書放在pki\trusted\certs目錄下:

要點(diǎn)說明:

  • 選擇合適的安全策略(如 Basic256Sha256)。
  • 使用客戶端證書和私鑰(可以自簽名,也可以通過權(quán)威 CA 簽發(fā))。
  • 服務(wù)端需信任此客戶端證書(在服務(wù)器配置中添加到信任列表)。
  • 配置 CertificateManager、CertificateValidator 以及 X509IdentityProvider。

六、常見問題與注意事項(xiàng)

端點(diǎn)選擇

  • 不同 OPC UA 服務(wù)器可能同時(shí)暴露多個(gè)端點(diǎn),包含不同的安全模式(Security Mode)和安全策略(Security Policy)。
  • 在匿名或用戶名密碼方式時(shí),如果選擇了需要證書的端點(diǎn),就會(huì)出現(xiàn)認(rèn)證失敗或連接被拒的情況。
  • 在證書加密方式時(shí),如果選擇了安全策略為 None 的端點(diǎn),則證書不會(huì)被使用,同樣也會(huì)連接異?;蛘邔?dǎo)致安全策略不匹配。

服務(wù)器信任客戶端證書

  • 大多數(shù) OPC UA 服務(wù)器在默認(rèn)情況下不信任任何客戶端的證書,需要在服務(wù)端管理界面或配置文件中手動(dòng)將客戶端證書加入白名單。
  • 記得查看服務(wù)器日志,若提示「Untrusted Certificate」,就需要在服務(wù)器端操作信任列表。

安全策略與性能

  • 加密等級(jí)越高(如 Basic256Sha256),對(duì) CPU 資源消耗越大,通信速度會(huì)相對(duì)降低,但數(shù)據(jù)安全性更強(qiáng)。
  • 在測試環(huán)境或低安全需求的場景下可以先使用 SecurityPolicy.None ;正式項(xiàng)目上線時(shí)再切換到更高的安全策略。

兼容性

  • 不同版本的 OPC UA SDK、服務(wù)器或 Java 版本之間可能存在兼容性問題;如果連接失敗,可以嘗試升級(jí)或降低 Milo 版本、換用不同的 JDK 版本等。
  • OPC UA 服務(wù)器上若啟用特定的加密算法(例如 AES-256),客戶端也需要對(duì)應(yīng)的加密套件。

斷線重連

  • 工業(yè)現(xiàn)場環(huán)境中網(wǎng)絡(luò)抖動(dòng)常見,客戶端需要實(shí)現(xiàn)斷線重連或重試機(jī)制,以確保數(shù)據(jù)采集的連續(xù)性與穩(wěn)定性。

到此這篇關(guān)于java連接opcua的文章就介紹到這了,更多相關(guān)java連接opcua內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringFactoriesLoader類作用詳解

    SpringFactoriesLoader類作用詳解

    SpringFactoriesLoader可以加載jar包下META-INF下的spring.factories,把相關(guān)接口的實(shí)現(xiàn)按照key,value的形式加載到內(nèi)存,一個(gè)接口的多個(gè)實(shí)現(xiàn)可以按照","進(jìn)行分割
    2022-10-10
  • 關(guān)于springboot2.4跨域配置問題

    關(guān)于springboot2.4跨域配置問題

    這篇文章主要介紹了springboot2.4跨域配置的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • 在Android中使用WebView在線查看PDF文件的方法示例

    在Android中使用WebView在線查看PDF文件的方法示例

    在Android應(yīng)用開發(fā)中,有時(shí)我們需要在客戶端展示PDF文件,以便用戶可以閱讀或交互,這篇文章主要介紹了在Android中使用WebView在線查看PDF文件的方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • JUC并發(fā)編程LinkedBlockingQueue隊(duì)列深入分析源碼

    JUC并發(fā)編程LinkedBlockingQueue隊(duì)列深入分析源碼

    LinkedBlockingQueue 是一個(gè)可選有界阻塞隊(duì)列,這篇文章主要為大家詳細(xì)介紹了Java中LinkedBlockingQueue的實(shí)現(xiàn)原理與適用場景,感興趣的可以了解一下
    2023-04-04
  • 基于UncategorizedSQLException異常處理方案

    基于UncategorizedSQLException異常處理方案

    這篇文章主要介紹了基于UncategorizedSQLException異常處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解IDEA用maven創(chuàng)建springMVC項(xiàng)目和配置

    詳解IDEA用maven創(chuàng)建springMVC項(xiàng)目和配置

    本篇文章主要介紹了詳解IDEA用maven創(chuàng)建springMVC項(xiàng)目和配置 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • JVM類加載,垃圾回收

    JVM類加載,垃圾回收

    這篇文章主要介紹了JVM的幾種垃圾回收器,文中通過示例代碼介紹的很詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • SpringBoot整合Swagger3.0全過程

    SpringBoot整合Swagger3.0全過程

    文章介紹了Swagger3,一個(gè)自動(dòng)生成接口文檔的工具,相比Swagger2,配置更少,使用更方便,文章詳細(xì)介紹了如何引入依賴,添加開關(guān)注解,訪問Swagger界面,以及如何配置Swagger和引入第三方UI包來美化頁面
    2026-03-03
  • Scheduled如何會(huì)在上次任務(wù)執(zhí)行完才會(huì)執(zhí)行下次任務(wù)

    Scheduled如何會(huì)在上次任務(wù)執(zhí)行完才會(huì)執(zhí)行下次任務(wù)

    這篇文章主要介紹了Scheduled如何會(huì)在上次任務(wù)執(zhí)行完才會(huì)執(zhí)行下次任務(wù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • IDEA意外退出問題及解決

    IDEA意外退出問題及解決

    文章主要講述了解決在使用IDEA拉取項(xiàng)目時(shí),由于堆內(nèi)存不足導(dǎo)致IDEA自動(dòng)退出的問題,通過調(diào)整IDEA的堆內(nèi)存大?。╔ms和Xmx),并在執(zhí)行完畢后重新打開IDEA,最終成功解決問題
    2026-04-04

最新評(píng)論

博湖县| 博湖县| 仁怀市| 辛集市| 凌海市| 二连浩特市| 柏乡县| 徐水县| 雷波县| 银川市| 青浦区| 敦化市| 余干县| 棋牌| 通道| 霍林郭勒市| 渝中区| 兴海县| 普安县| 昔阳县| 洪湖市| 抚顺县| 平山县| 永泰县| 普兰县| 荣成市| 亚东县| 平度市| 上思县| 财经| 固阳县| 石渠县| 聂拉木县| 鞍山市| 沧州市| 高邑县| 天水市| 墨玉县| 郴州市| 高淳县| 西安市|