阿里云物联网平台网关子设备接入JAVA Sample

简介: 本文主要如何演示使用JAVA SDK实现相关过程。

作者:俏巴


概述


子设备不直接连接物联网平台,而是通过网关接入物联网平台。首先,需在物联网平台上创建网关和子设备;然后,开发网关设备端SDK,实现网关直连物联网平台;再由网关向物联网平台上报网关与子设备的拓扑关系;通过网关上报子设备证书(一机一密方式)或者子设备动态注册的认证方式,物联网平台校验子设备的身份和该子设备与网关的拓扑关系。所有校验通过,才会建立子设备逻辑通道,并绑定至网关物理通道上,实现子设备通过网关,与物联网平台建立连接,并进行通信。本文主要如何演示使用JAVA SDK实现相关过程。


关系图


_


操作步骤


1、创建网关和子设备,参考链接


2、子设备产品的物模型定义:
_


2、pom.xml


 <repositories>
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">repository</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">id</span>&gt;</span>alimaven<span class="hljs-tag">&lt;/<span class="hljs-name">id</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">name</span>&gt;</span>aliyun maven<span class="hljs-tag">&lt;/<span class="hljs-name">name</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">url</span>&gt;</span>http://maven.aliyun.com/nexus/content/groups/public/<span class="hljs-tag">&lt;/<span class="hljs-name">url</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">repository</span>&gt;</span></span>
&lt;<span class="hljs-regexp">/repositories&gt;

&lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;com.aliyun.alink.linksdk&lt;/g</span>roupId&gt;
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>iot-linkkit-java<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></span>
        &lt;version&gt;<span class="hljs-number">1.2</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>&lt;<span class="hljs-regexp">/version&gt;
        &lt;scope&gt;compile&lt;/</span>scope&gt;
    <span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span></span>
    &lt;dependency&gt;
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>com.google.code.gson<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></span>
        &lt;artifactId&gt;gson&lt;<span class="hljs-regexp">/artifactId&gt;
        &lt;version&gt;2.8.1&lt;/</span>version&gt;
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>compile<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span></span>
    &lt;<span class="hljs-regexp">/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;com.alibaba&lt;/g</span>roupId&gt;
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>fastjson<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></span>
        &lt;version&gt;<span class="hljs-number">1.2</span><span class="hljs-number">.40</span>&lt;<span class="hljs-regexp">/version&gt;
        &lt;scope&gt;compile&lt;/</span>scope&gt;
    <span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span></span>
&lt;<span class="hljs-regexp">/dependencies&gt;

&lt;build&gt;
    &lt;finalName&gt;iot-java-sdk&lt;/</span>finalName&gt;
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">plugins</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.apache.maven.plugins<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>maven-compiler-plugin<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">source</span>&gt;</span>1.8<span class="hljs-tag">&lt;/<span class="hljs-name">source</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">target</span>&gt;</span>1.8<span class="hljs-tag">&lt;/<span class="hljs-name">target</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">encoding</span>&gt;</span>UTF-8<span class="hljs-tag">&lt;/<span class="hljs-name">encoding</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">plugins</span>&gt;</span></span>
&lt;<span class="hljs-regexp">/build&gt;</span></code></pre>

3、Code Sample


import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.aliyun.alink.dm.api.BaseInfo;
import com.aliyun.alink.dm.api.DeviceInfo;
import com.aliyun.alink.dm.api.InitResult;
import com.aliyun.alink.dm.api.SignUtils;
import com.aliyun.alink.dm.model.ResponseModel;
import com.aliyun.alink.linkkit.api.ILinkKitConnectListener;
import com.aliyun.alink.linkkit.api.IoTMqttClientConfig;
import com.aliyun.alink.linkkit.api.LinkKit;
import com.aliyun.alink.linkkit.api.LinkKitInitParams;
import com.aliyun.alink.linksdk.channel.gateway.api.subdevice.ISubDeviceActionListener;
import com.aliyun.alink.linksdk.channel.gateway.api.subdevice.ISubDeviceChannel;
import com.aliyun.alink.linksdk.channel.gateway.api.subdevice.ISubDeviceConnectListener;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttPublishRequest;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttSubscribeRequest;
import com.aliyun.alink.linksdk.cmp.core.base.AMessage;
import com.aliyun.alink.linksdk.cmp.core.base.ARequest;
import com.aliyun.alink.linksdk.cmp.core.base.AResponse;
import com.aliyun.alink.linksdk.cmp.core.base.ConnectState;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectNotifyListener;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSendListener;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSubscribeListener;
import com.aliyun.alink.linksdk.tools.AError;
import com.aliyun.alink.linksdk.tools.ALog;

import java.util.*;

import static com.aliyun.alink.linksdk.tools.ALog.LEVEL_DEBUG;

// 子设备测试
public class SubDeviceDemo {

<span class="hljs-comment">// 初始化参数</span>
private <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> regionId = <span class="hljs-string">"cn-shanghai"</span>;
private <span class="hljs-keyword">static</span> final <span class="hljs-built_in">String</span> TAG = <span class="hljs-string">"TOPO"</span>;

<span class="hljs-comment">//网关设备三元组信息</span>
private <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> GWproductKey = <span class="hljs-string">"********"</span>;
private <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> GWdeviceName = <span class="hljs-string">"********"</span>;
private <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> GWdeviceSecret = <span class="hljs-string">"********"</span>;

public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(<span class="hljs-built_in">String</span>[] args) {

    LinkKitInitParams params = <span class="hljs-keyword">new</span> LinkKitInitParams();
    <span class="hljs-comment">/**
     * 设置 Mqtt 初始化参数
     */</span>
    IoTMqttClientConfig config = <span class="hljs-keyword">new</span> IoTMqttClientConfig();
    config.productKey = GWproductKey;
    config.deviceName = GWdeviceName;
    config.deviceSecret = GWdeviceSecret;
    config.channelHost = GWproductKey + <span class="hljs-string">".iot-as-mqtt."</span> + regionId + <span class="hljs-string">".aliyuncs.com:1883"</span>;
    <span class="hljs-comment">/**
     * 是否接受离线消息
     * 对应 mqtt 的 cleanSession 字段
     */</span>
    config.receiveOfflineMsg = <span class="hljs-literal">false</span>;
    params.mqttClientConfig = config;
    ALog.setLevel(LEVEL_DEBUG); <span class="hljs-comment">// 设置日志打印级别</span>
    ALog.i(TAG, <span class="hljs-string">"mqtt connetcion info="</span> + params);

    <span class="hljs-comment">/**
     * 设置初始化,传入设备证书信息
     */</span>
    DeviceInfo deviceInfo = <span class="hljs-keyword">new</span> DeviceInfo();
    deviceInfo.productKey = GWproductKey;
    deviceInfo.deviceName = GWdeviceName;
    deviceInfo.deviceSecret = GWdeviceSecret;
    params.deviceInfo = deviceInfo;

    <span class="hljs-comment">/**建立链接**/</span>
    LinkKit.getInstance().init(params, <span class="hljs-keyword">new</span> ILinkKitConnectListener() {
        public <span class="hljs-keyword">void</span> onError(AError aError) {
            ALog.e(TAG, <span class="hljs-string">"Init Error error="</span> + aError);
        }

        public <span class="hljs-keyword">void</span> onInitDone(InitResult initResult) {
            ALog.i(TAG, <span class="hljs-string">"onInitDone result="</span> + initResult);

            <span class="hljs-comment">//获取网关下topo关系,查询网关与子设备是否已经存在topo关系</span>
            <span class="hljs-comment">//如果已经存在,则直接上线子设备,不存在则需要添加网关子设备</span>
            LinkKit.getInstance().getGateway().gatewayGetSubDevices(<span class="hljs-keyword">new</span> IConnectSendListener() {
                @Override
                public <span class="hljs-keyword">void</span> onResponse(ARequest request, AResponse aResponse) {
                    ALog.i(TAG, <span class="hljs-string">"获取网关的topo关系成功 : "</span> + JSONObject.toJSONString(aResponse));

                    <span class="hljs-comment">// 1、获取子设备列表结果</span>
                    <span class="hljs-keyword">try</span> {
                        ResponseModel&lt;List&lt;DeviceInfo&gt;&gt; response = JSONObject.parseObject(aResponse.data.toString(), <span class="hljs-keyword">new</span> TypeReference&lt;ResponseModel&lt;List&lt;DeviceInfo&gt;&gt;&gt;() {
                        }.getType());
                        <span class="hljs-comment">// TODO 根据实际应用场景处理</span>
                        Integer subDeviceCounts = response.data.size();
                        System.out.println(<span class="hljs-string">"topo下子设备的数目:"</span> + subDeviceCounts);<span class="hljs-comment">// topo网管下子设备的数目</span>

// // 2、如果topo下面的子设备数目为0,则通过动态注册获取子设备Secret信息
// if (subDeviceCounts == 0)
// {
// /**
// * 子设备动态注册获取设备deviceSecret,如果设备已知三元组则忽略此步
// * 预注册设备时,可以使用设备的MAC地址或SN序列号等作为DeviceName
// */
// List<BaseInfo> subDevices = new ArrayList<>();
// BaseInfo baseInfo1 = new BaseInfo();
// // 未激活的子设备的信息
// baseInfo1.productKey = "";
// baseInfo1.deviceName = "";
// subDevices.add(baseInfo1);
//
// LinkKit.getInstance().getGateway().gatewaySubDevicRegister(subDevices, new IConnectSendListener() {
//
// @Override
// public void onResponse(ARequest request, AResponse response) {
// ALog.i(TAG, "子设备动态注册成功 : " + JSONObject.toJSONString(response));
//
// // 通过动态注册获取的子设备信息,供后续添加子设备到网关设备使用
// //{"iotId":"","deviceSecret":"","productKey":"","deviceName":""}
// }
// @Override
// public void onFailure(ARequest request, AError error) {
// ALog.i(TAG, "子设备注册失败 : " + JSONObject.toJSONString(error));
// }
// });
// }

                        <span class="hljs-comment">// 3、使用子设备动态注册获取完子设备三元组信息后,添加到网关设备</span>
                        List&lt;BaseInfo&gt; subDevices = <span class="hljs-keyword">new</span> ArrayList&lt;&gt;();
                        BaseInfo baseInfo2 = <span class="hljs-keyword">new</span> BaseInfo();
                        <span class="hljs-comment">// 未激活的子设备三元组信息,可以通过上面的注释代码获取</span>
                        baseInfo2.productKey = <span class="hljs-string">"********"</span>;
                        baseInfo2.deviceName = <span class="hljs-string">"********"</span>;
                        <span class="hljs-built_in">String</span> deviceSecret = <span class="hljs-string">"********"</span>;
                        subDevices.add(baseInfo2);
                        LinkKit.getInstance().getGateway().gatewayAddSubDevice(baseInfo2, <span class="hljs-keyword">new</span> ISubDeviceConnectListener() {
                            @Override
                            public <span class="hljs-built_in">String</span> getSignMethod() {
                                <span class="hljs-comment">// 使用的签名方法</span>
                                <span class="hljs-keyword">return</span> <span class="hljs-string">"hmacsha1"</span>;
                            }

                            @Override
                            public <span class="hljs-built_in">String</span> getSignValue() {
                                <span class="hljs-comment">// 获取签名,用户使用 deviceSecret 获得签名结果</span>
                                <span class="hljs-built_in">Map</span>&lt;<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>&gt; signMap = <span class="hljs-keyword">new</span> HashMap&lt;&gt;();
                                signMap.put(<span class="hljs-string">"productKey"</span>, baseInfo2.productKey);
                                signMap.put(<span class="hljs-string">"deviceName"</span>, baseInfo2.deviceName);
                                <span class="hljs-comment">// signMap.put("timestamp", String.valueOf(System.currentTimeMillis()));</span>
                                signMap.put(<span class="hljs-string">"clientId"</span>, getClientId());
                                <span class="hljs-keyword">return</span> SignUtils.hmacSign(signMap, deviceSecret);
                            }

                            @Override
                            public <span class="hljs-built_in">String</span> getClientId() {
                                <span class="hljs-comment">// clientId 可为任意值</span>
                                <span class="hljs-keyword">return</span> <span class="hljs-string">"id"</span>;
                            }

                            @Override
                            public <span class="hljs-built_in">Map</span>&lt;<span class="hljs-built_in">String</span>, <span class="hljs-built_in">Object</span>&gt; getSignExtraData() {
                                <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
                            }

                            @Override
                            public <span class="hljs-keyword">void</span> onConnectResult(boolean isSuccess, ISubDeviceChannel iSubDeviceChannel, AError aError) {

                                <span class="hljs-comment">// 添加结果</span>
                                <span class="hljs-keyword">if</span> (isSuccess) {
                                    <span class="hljs-comment">// 子设备添加成功,接下来可以做子设备上线的逻辑</span>
                                    ALog.i(TAG, <span class="hljs-string">"topo关系添加成功 : "</span> + JSONObject.toJSONString(iSubDeviceChannel));

                                    <span class="hljs-comment">// 子设备添加成功后,代理子设备上线</span>
                                    LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(baseInfo2, <span class="hljs-keyword">new</span> ISubDeviceActionListener() {
                                        @Override
                                        public <span class="hljs-keyword">void</span> onSuccess() {
                                            System.out.println(<span class="hljs-string">"代理子设备上线成功!"</span>);

                                            <span class="hljs-comment">// 基本信息设置</span>
                                            System.out.println(<span class="hljs-string">"使用网关的通道执行子设备的数据上下行"</span>);
                                            <span class="hljs-built_in">String</span> topic = <span class="hljs-string">"/******/******/user/datapubandsub"</span>; <span class="hljs-comment">// 子设备自定义Topic</span>
                                            <span class="hljs-built_in">String</span> sysSubTopic = <span class="hljs-string">"/sys/******/******/thing/event/property/post"</span>;<span class="hljs-comment">// 子设备系统属性设置Topic</span>
                                            <span class="hljs-built_in">String</span> payLoad = <span class="hljs-string">"{\"id\":\"123\",\"method\":\"thing.event.property.post\",\"params\":{\"RoomHumidity\":19},\"version\":\"1.0\"}"</span>; <span class="hljs-comment">//注意此处和第二步子设备物模型定义相关</span>

                                            <span class="hljs-comment">// 发布系统消息测试</span>
                                            MqttPublishRequest request1 = <span class="hljs-keyword">new</span> MqttPublishRequest();

// // topic 用户根据实际场景填写

                                            request1.topic = sysSubTopic;
                                            request1.payloadObj = payLoad;

                                            LinkKit.getInstance().publish(request1, <span class="hljs-keyword">new</span> IConnectSendListener(){
                                                @Override
                                                public <span class="hljs-keyword">void</span> onResponse(ARequest aRequest, AResponse aResponse) {

                                                    System.out.println(<span class="hljs-string">"发送成功"</span>);
                                                }

                                                @Override
                                                public <span class="hljs-keyword">void</span> onFailure(ARequest aRequest, AError aError) {
                                                    System.out.println(<span class="hljs-string">"发送失败"</span>);

                                                }
                                            });

                                            <span class="hljs-comment">// 订阅</span>
                                            MqttSubscribeRequest request = <span class="hljs-keyword">new</span> MqttSubscribeRequest();
                                            <span class="hljs-comment">// topic 用户根据实际场景填写</span>
                                            request.topic = topic;
                                            request.isSubscribe = <span class="hljs-literal">true</span>;

                                            <span class="hljs-comment">// 直接做Topic的订阅,注意自定义Topic需要使用这种方式,否则会出现订阅失败的情况,SDK有Bug,系统Topic没有问题</span>
                                            LinkKit.getInstance().subscribe(request, <span class="hljs-keyword">new</span> IConnectSubscribeListener(){
                                                @Override
                                                public <span class="hljs-keyword">void</span> onSuccess() {
                                                    System.out.println(<span class="hljs-string">"直接订阅成功"</span>);
                                                }

                                                @Override
                                                public <span class="hljs-keyword">void</span> onFailure(AError aError) {
                                                    System.out.println(<span class="hljs-string">"直接订阅失败"</span> + aError.getMsg());

                                                }
                                            });

                                            <span class="hljs-comment">// 注册下行监听</span>
                                            LinkKit.getInstance().registerOnNotifyListener(<span class="hljs-keyword">new</span> IConnectNotifyListener() {
                                                @Override
                                                public <span class="hljs-keyword">void</span> onNotify(<span class="hljs-built_in">String</span> s, <span class="hljs-built_in">String</span> s1, AMessage aMessage) {
                                                    System.out.println(<span class="hljs-string">"下行消息Topic:"</span> + s);
                                                    System.out.println(<span class="hljs-string">"下行消息:"</span> + <span class="hljs-keyword">new</span> <span class="hljs-built_in">String</span>((byte[])aMessage.getData()));
                                                }
                                                @Override
                                                public boolean shouldHandle(<span class="hljs-built_in">String</span> s, <span class="hljs-built_in">String</span> s1) {
                                                    <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
                                                }

                                                @Override
                                                public <span class="hljs-keyword">void</span> onConnectStateChange(<span class="hljs-built_in">String</span> s, ConnectState connectState) {
                                                    System.out.println(<span class="hljs-string">"连接状态发生变化 :"</span> + s + connectState);
                                                }
                                            });
                                            System.out.println(<span class="hljs-string">"---取消订阅---"</span>);
                                            <span class="hljs-comment">// 取消订阅  参考订阅方法  request.isSubscribe = false; 即可</span>
                                        }

                                        @Override
                                        public <span class="hljs-keyword">void</span> onFailed(AError aError) {
                                            ALog.d(TAG, <span class="hljs-string">"onFailed() called with: aError = ["</span> + aError + <span class="hljs-string">"]"</span>);
                                            System.out.println(aError.getMsg());
                                        }
                                    });
                                } <span class="hljs-keyword">else</span> {
                                    ALog.i(TAG, <span class="hljs-string">"topo关系添加失败 : "</span> + JSONObject.toJSONString(aError));
                                }
                            }

                            @Override
                            public <span class="hljs-keyword">void</span> onDataPush(<span class="hljs-built_in">String</span> s, AMessage aMessage) {
                            }
                        });
                    } <span class="hljs-keyword">catch</span> (Exception e) {
                        e.printStackTrace();
                    }
                }
                @Override
                public <span class="hljs-keyword">void</span> onFailure(ARequest request, AError error) {
                    ALog.i(TAG, <span class="hljs-string">"获取网关的topo关系失败 : "</span> + JSONObject.toJSONString(error));
                }
            });
        }
    });
}

}


说明


1、首先初始化网关设备,建立连接;
2、检查当前网关设备拓扑关系,获取现有子设备信息,示例演示网关设备尚未添加子设备;
3、动态注册获取网关子设备DeviceSecret,本部分注释,第一次运行需要取消注释;
4、添加子设备三元组信息到网关设备;
5、网关代理子设备进行Topic的订阅、消息的发布及下行监听注册。


注意


替换网关设备三元组信息、子设备三元组信息、子设备Topic信息。


4、运行结果


_


更多参考


设备安全认证
网关接入物联网平台
子设备接入物联网平台


相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
1月前
|
存储 边缘计算 物联网
阿里云物联网平台:推动万物互联的智能化解决方案
随着物联网技术的快速发展,阿里云物联网平台为企业提供了一体化的解决方案,包括设备接入、数据管理和智能应用等核心功能。平台支持海量设备接入、实时数据采集与存储、边缘计算,并具备大规模设备管理、高安全性和开放生态等优势。广泛应用于智能制造、智慧城市和智能家居等领域,助力企业实现数字化转型。
156 5
|
2月前
|
存储 SQL 分布式计算
Java连接阿里云MaxCompute例
要使用Java连接阿里云MaxCompute数据库,首先需在项目中添加MaxCompute JDBC驱动依赖,推荐通过Maven管理。避免在代码中直接写入AccessKey,应使用环境变量或配置文件安全存储。示例代码展示了如何注册驱动、建立连接及执行SQL查询。建议使用RAM用户提升安全性,并根据需要配置时区和公网访问权限。具体步骤和注意事项请参考阿里云官方文档。
|
3月前
|
Java 开发工具
通过Java SDK调用阿里云模型服务
在阿里云平台上,可以通过创建应用并使用模型服务完成特定任务,如生成文章内容。本示例展示了一段简化的Java代码,演示了如何调用阿里云模型服务生成关于“春秋战国经济与文化”的简短文章。示例代码通过设置系统角色为历史学家,并提出文章生成需求,最终处理并输出生成的文章内容。在实际部署前,请确保正确配置环境变量中的密钥和ID,并根据需要调整SDK导入语句及类名。更多详情和示例,请参考相关链接。
|
3月前
|
机器学习/深度学习 存储 缓存
Java本地高性能缓存实践问题之阿里云机器学习团队开源社区的问题如何解决
Java本地高性能缓存实践问题之阿里云机器学习团队开源社区的问题如何解决
|
9天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
18天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
6天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9
|
9天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
5天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
9天前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
22 3

相关产品

  • 物联网平台