首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot整合MQTT并实现异步线程调用

SpringBoot整合MQTT并实现异步线程调用

作者头像
时间静止不是简史
发布于 2022-01-05 06:35:44
发布于 2022-01-05 06:35:44
6.7K00
代码可运行
举报
文章被收录于专栏:Java探索之路Java探索之路
运行总次数:0
代码可运行

基于SpringBoot通过注解实现对mqtt消息处理的异步调用

使用背景

生产环境下, 由于mqtt 生产者生产的消息逐渐增多, 可能会导致消息堆积. 因此需要消费者去快速的消费. 而其中的一个方案便是使用异步线程去加速消费消息. 下面介绍下思路

我们可以在原来的mqtt工具类上面进行改装. 首先创建一个类MqttMessageListener并继承IMqttMessageListener实现messageArrived, 用于处理这些消息(业务编写) 然后改写mqtt客户端订阅的方法, 注入MqttMessageListener, 并在订阅方法中新增该参数 在然后在启动类开启异步线程, 编写一个配置类配置线程池参数并且在messageArrived加上@Async开启异步线程调用

代码实现

基础代码

指没有开启线程池的代码

  1. MqttPushClient 主要定义了连接参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @Author
 * @Date
 * @Description  连接至EMQ X 服务器,获取mqtt连接,发布消息
 */
@Component
public class MqttPushClient{

    private static final Logger log = LoggerFactory.getLogger(MqttPushClient.class);

    @Autowired
    private PushCallback pushCallback;

    private static MqttClient client;

    public static void setClient(MqttClient client) {
        MqttPushClient.client = client;
    }

    public static MqttClient getClient() {
        return client;
    }

    public void connect(String host, String clientID, String username, String password, int timeout, int keepalive, List<String> topicList) {
        MqttClient client;
        try {
            client = new MqttClient(host, clientID, new MemoryPersistence());
            MqttConnectOptions options = new MqttConnectOptions();
            options.setCleanSession(true);
            if (username != null) {
                options.setUserName(username);
            }
            if (password != null) {
                options.setPassword(password.toCharArray());
            }
            options.setConnectionTimeout(timeout);
            options.setKeepAliveInterval(keepalive);
            MqttPushClient.setClient(client);
            try {
                //设置回调类
                client.setCallback(pushCallback);
                //client.connect(options);
                IMqttToken iMqttToken = client.connectWithResult(options);
                boolean complete = iMqttToken.isComplete();
                log.info("MQTT连接"+(complete?"成功":"失败"));
                /** 订阅主题 **/
                for (String topic : topicList) {
                    log.info("连接订阅主题:{}", topic);
                    client.subscribe(topic, 0);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
  1. PushCallback 回调类, 实现重连, 消息发送监听, 消息接收监听
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Author
 * @Date
 * @Description  消息回调,处理接收的消息
 */
@Component
public class PushCallback implements MqttCallback {

    private static final Logger log = LoggerFactory.getLogger(PushCallback.class);

    @Autowired
    private MqttConfiguration mqttConfiguration;
    @Autowired
    private MqttTopic mqttTopic;

    @Override
    public void connectionLost(Throwable cause) {        // 连接丢失后,一般在这里面进行重连
        log.info("连接断开,正在重连");
        MqttPushClient mqttPushClient = mqttConfiguration.getMqttPushClient();
        if (null != mqttPushClient) {
            mqttPushClient.connect(mqttConfiguration.getHost(), mqttConfiguration.getClientid(), mqttConfiguration.getUsername(),
                    mqttConfiguration.getPassword(), mqttConfiguration.getTimeout(), mqttConfiguration.getKeepalive(), mqttConfiguration.getTopic());
            log.info("已重连");
        }

    }

    /**
     * 发送消息,消息到达后处理方法
     * @param token
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        int messageId = token.getMessageId();
        String[] topics = token.getTopics();
        log.info("消息发送完成,messageId={},topics={}",messageId,topics.toString());
    }

    /**
     * 订阅主题接收到消息处理方法
     * @param topic
     * @param message
     */
    @Override
    public void messageArrived(String topic, MqttMessage message) {
         // subscribe后得到的消息会执行到这里面,这里在控制台有输出
        String messageStr = new String(message.getPayload());
        // messageDistribute.distribute(topic, messageStr);
        log.info("接收的主题:" + topic +  ";接收到的信息:" + messageStr);
        }
  }
  1. MqttConfiguration 配置了mqtt相关参数, 并初始化连接(mqtt在这里启动)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @Author
 * @Date mqtt配置及连接
 * @Description
 */
@Slf4j
@Component
@Configuration
@ConfigurationProperties(MqttConfiguration.PREFIX)
public class MqttConfiguration {

    @Autowired
    private MqttPushClient mqttPushClient;

    /**
     * 指定配置文件application-local.properties中的属性名前缀
     */
    public static final String PREFIX = "std.mqtt";

    private String host;
    private String clientId;
    private String userName;
    private String password;
    private int timeout;
    private int keepAlive;
    private List<String> topic;

    public String getClientid() {
        return clientId;
    }

    public void setClientid(String clientid) {
        this.clientId = clientid;
    }

    public String getUsername() {
        return userName;
    }

    public void setUsername(String username) {
        this.userName = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getTimeout() {
        return timeout;
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    public int getKeepalive() {
        return keepAlive;
    }

    public void setKeepalive(int keepalive) {
        this.keepAlive = keepalive;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public List<String> getTopic() {
        return topic;
    }

    public void setTopic(List<String> topic) {
        this.topic = topic;
    }

    /**
     * 连接至mqtt服务器,获取mqtt连接
     * @return
     */
    @Bean
    public MqttPushClient getMqttPushClient() {
        //连接至mqtt服务器,获取mqtt连接
        mqttPushClient.connect(host, clientId, userName, password, timeout, keepAlive, topic);
        return mqttPushClient;
    }
}

properties.yml 配置文件
std.mqtt:
  host: tcp://x.x.x.x:1883
  username: your_username
  password: your_password
  #MQTT-连接服务器默认客户端ID
  clientid: your_clientid
  #连接超时
  timeout: 1000
  # deviceId
  deviceId: your_deviceId
  # mqtt-topic
  topic[0]: your_tpoic
  1. TopicOperation 定义了发布订阅的方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @Author chy
 */
public class TopicOperation {

    private static final Logger log = LoggerFactory.getLogger(TopicOperation.class);

    /**
     * 订阅主题
     * @param topic 主题名称
     */
    public static void subscribe(String topic) {
        try {
            MqttClient client = MqttPushClient.getClient();
            if (client == null) {
                return;
            };
            client.subscribe(topic, 0);
            log.info("订阅主题:{}",topic);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发布主题
     *
     * @param topic
     * @param pushMessage
     */
    public static void publish(String topic, String pushMessage) {

        log.info("SEND TO MQTT -- topic : {}, message : {}", topic, pushMessage);

        MqttMessage message = new MqttMessage();
        message.setQos(0);
        // 非持久化
        message.setRetained(false);
        message.setPayload(pushMessage.getBytes());
        MqttClient client = MqttPushClient.getClient();
        if (client == null) {
            return;
        };
        MqttTopic mTopic = client.getTopic(topic);
        if (null == mTopic) {
            log.error("主题不存在:{}",mTopic);
        }
        try {
            mTopic.publish(message);
        } catch (Exception e) {
            log.error("mqtt发送消息异常:",e);
        }
    }

}
  1. 定义了发布和订阅的相关主题
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.sxd.onlinereservation.exception.BusinessException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @Author
 * @Date topic名称
 * @Description
 */
@Component
public class MqttTopic {

    @Value("${std.mqtt.deviceId}")
    private String[] deviceId;

    public String getSubscribeTopic(String type){
        switch (type){

            case "appointTopic":
                return String.format("/v1/%s/service/appointTopic", deviceId[0]);
            default:
                throw new BusinessException("mqtt 订阅主题获取错误");
        }
    }

    public String getPublishTopic(String type) {
        switch (type){
                //1.0接口立即取号发布主题
            case "appointTopic":
                return String.format("/v1/%s/service/appointTopic", deviceId[1]);
            default:
                throw new BusinessException("mqtt 发布主题获取错误");
        }
    }



}

ps: 如果想要使用该工具类进行消息发送和接收看下面demo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//消息发布操作
 TopicOperation.publish(mqttTopic.getPublishTopic("appointTopic"), "消息体"));
 //消息订阅操作
  TopicOperation.subscribe(mqttTopic.getSubscribeTopic("appointTopic"), "消息体"));

异步线程处理实现

总结

  1. 创建消息监听类 , 用于监听消息并进行业务处理
  2. 在原来订阅时, 注入并使用第一步创建的监听类
  3. 通过注解开启异步线程并配置处理方式
创建消息监听类 , 用于监听消息并进行业务处理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@Component
public class MqttMessageListener implements IMqttMessageListener {

    @Resource
    private BusinessService businessService;
    @Autowired
    private MqttTopic mqttTopic;
    @Autowired
    private ThreeCallmachineService threeCallmachineService;
    @Autowired
    private BusinessHallService businessHallService;
    @Autowired
    private BusinessMaterialService businessMaterialService;
    @Autowired
    private BusinessWaitService businessWaitService;
    @Autowired
    private AppointmentService appointmentService;


    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        String messageStr = new String(message.getPayload());
        log.info("接收的主题:" + topic +  ";接收到的信息:" + messageStr);
        //进行 业务处理
        }
}
在原来订阅时, 注入并使用第一步创建的监听类

注入了 MqttMessageListener , 并且在订阅时加入 client.subscribe(topic, mqttMessageListener);

  1. 修改MqttPushClient (必须)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class MqttPushClient{

    private static final Logger log = LoggerFactory.getLogger(MqttPushClient.class);

    @Autowired
    private PushCallback pushCallback;
    @Autowired   //这里进行了注入操作
    private MqttMessageListener mqttMessageListener;

    private static MqttClient client;

    public static void setClient(MqttClient client) {
        MqttPushClient.client = client;
    }

    public static MqttClient getClient() {
        return client;
    }

    public void connect(String host, String clientID, String username, String password, int timeout, int keepalive, List<String> topicList) {
        MqttClient client;
        try {
            client = new MqttClient(host, clientID, new MemoryPersistence());
            MqttConnectOptions options = new MqttConnectOptions();
            options.setCleanSession(true);
            if (username != null) {
                options.setUserName(username);
            }
            if (password != null) {
                options.setPassword(password.toCharArray());
            }
            options.setConnectionTimeout(timeout);
            options.setKeepAliveInterval(keepalive);
            MqttPushClient.setClient(client);
            try {
                //设置回调类
                client.setCallback(pushCallback);
                //client.connect(options);
                IMqttToken iMqttToken = client.connectWithResult(options);
                boolean complete = iMqttToken.isComplete();
                log.info("MQTT连接"+(complete?"成功":"失败"));
                /** 订阅主题 **/
                for (String topic : topicList) {
                    log.info("连接订阅主题:{}", topic);
                    //client.subscribe(topic, 0);
                    client.subscribe(topic, mqttMessageListener);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
  1. 如果业务还使用了手动订阅, 则也需要在订阅的类上面注入MqttMessageListener , 并且在订阅方法中作为参数使用. 但是我们需要将方法改成非静态的, 因此在使用该方法时我们需要new该对象然后才能够调用. 但是手动订阅很少用到. 因此有无此步骤都可
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @Author chy
 * @Date
 * @Description
 */
public class TopicOperation {

    private static final Logger log = LoggerFactory.getLogger(TopicOperation.class);

	//注入MqttMessageListener
    @Autowired
    private MqttMessageListener mqttMessageListener;

    /**
     * 订阅主题
     * @param topic 主题名称
     */
    public void subscribe(String topic) {
        try {
            MqttClient client = MqttPushClient.getClient();
            if (client == null) {
                return;
            };
           //client.subscribe(topic, 0);
           //在订阅方法中作为参数使用
            client.subscribe(topic, mqttMessageListener);
            log.info("订阅主题:{}",topic);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发布主题
     *
     * @param topic
     * @param pushMessage
     */
    public static void publish(String topic, String pushMessage) {

        log.info("SEND TO MQTT -- topic : {}, message : {}", topic, pushMessage);

        MqttMessage message = new MqttMessage();
        message.setQos(0);
        // 非持久化
        message.setRetained(false);
        message.setPayload(pushMessage.getBytes());
        MqttClient client = MqttPushClient.getClient();
        if (client == null) {
            return;
        };
        MqttTopic mTopic = client.getTopic(topic);
        if (null == mTopic) {
            log.error("主题不存在:{}",mTopic);
        }
        try {
            mTopic.publish(message);
        } catch (Exception e) {
            log.error("mqtt发送消息异常:",e);
        }
    }

}
通过注解开启异步线程并配置处理方式
  1. 启动类开启 @EnableAsync(proxyTargetClass=true )
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
@MapperScan(basePackages = "com.x.x.mapper")
@EnableTransactionManagement
@EnableAsync(proxyTargetClass=true )
public class XXApplication {

    public static void main(String[] args) {
        SpringApplication.run(XXApplication.class, args);
    }

}
  1. 配置类配置线程池参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@Configuration
public class ExecutorConfig {

    @Bean
    public Executor asyncServiceExecutor() {
        log.info("start asyncServiceExecutor");
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(9);
        //配置最大线程数
        executor.setMaxPoolSize(20);
        //配置队列大小
        executor.setQueueCapacity(200);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("sxd-async-service-");
        // 设置拒绝策略:当pool已经达到max size的时候,如何处理新任务
        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
        executor.initialize();
        return executor;
    }
}
  1. MqttMessageListener的实现方法messageArrived开启@Async("asyncServiceExecutor")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@Component
public class MqttMessageListener implements IMqttMessageListener {

    @Resource
    private BusinessService businessService;
    @Autowired
    private MqttTopic mqttTopic;
    @Autowired
    private ThreeCallmachineService threeCallmachineService;
    @Autowired
    private BusinessHallService businessHallService;
    @Autowired
    private BusinessMaterialService businessMaterialService;
    @Autowired
    private BusinessWaitService businessWaitService;
    @Autowired
    private AppointmentService appointmentService;


    @Override
    @Async("asyncServiceExecutor")
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        String messageStr = new String(message.getPayload());
        log.info("接收的主题:" + topic +  ";接收到的信息:" + messageStr);
        System.out.println("线程名称:【" + Thread.currentThread().getName() + "】");
        //进行 业务处理
        }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
ChatGPT 之联盟营销
制定转化对话是每个营销人员和企业所有者都应该掌握的关键技能。它涉及创建和传递引人入胜的信息,吸引您的受众并激励他们采取行动。在当今数字时代,沟通跨越各种渠道和平台进行,掌握对话艺术比以往任何时候都更为重要。
ApacheCN_飞龙
2024/05/24
2440
ChatGPT 之联盟营销
AIGC-------AIGC在社交媒体内容生成中的应用
随着人工智能生成内容(AIGC)的快速发展,社交媒体平台上的内容创作方式发生了巨大变化。AIGC使得内容创作的门槛大大降低,从而让更多的人能够参与到社交媒体内容的创作中,同时也使得内容创作的质量和多样性得到了显著提升。在这篇博客中,我们将深入探讨AIGC在社交媒体内容生成中的应用,分析其技术实现方式以及在内容创作中的具体应用案例。
hope kc
2024/11/26
5380
ChatGPT 写作完全指南
欢迎来到《请继续,- 与 ChatGPT 写作的全面指南》。我叫赛勒斯·巴德,很高兴与您分享我与我们这个时代最具革命性技术之一 - ChatGPT 的一年奇妙旅程的成果。
ApacheCN_飞龙
2024/05/24
2930
ChatGPT 之图书大纲
您是否在为您想要写的书籍制定大纲时遇到困难?我理解您的困境,因为我也曾经历过。制定大纲需要大量时间和专注力,特别是当您的想法到处都是时。
ApacheCN_飞龙
2024/05/24
2750
ChatGPT 之图书大纲
ChatGPT 百万富翁手册
人工智能(AI)的急剧出现引发了组织工作方式和个人与技术互动方式的一波变革。这些变化是由 AI 的崛起带来的。人工智能中最令人印象深刻的例子之一就是被称为 ChatGPT 的模型,它由 OpenAI 开发。这个模型能够进行自然语言处理。由于它能够阅读和生成与人类极为相似的语言,它有潜力使商业的许多方面,尤其是利润丰厚的“赚钱”领域,成为一个极其令人困惑和难以预测的复杂领域。
ApacheCN_飞龙
2024/05/24
1230
《花雕学AI》28:革命性的 ChatGPT for SEO——让您的排名飙升 50%!
如果您想写篇有吸引力的文章,或者您是一个博客和网站的拥有者,那么您一定知道 SEO(搜索引擎优化)的重要性。SEO 可以帮助您提高相应的流量、转化率和收入,但是 SEO 也是一个复杂和耗时的过程,需要不断地更新和优化内容、关键词和链接等。
驴友花雕
2023/05/03
3450
《花雕学AI》28:革命性的 ChatGPT for SEO——让您的排名飙升 50%!
GPT-image-1:OpenAI 推出的最新图像生成模型
在人工智能领域,OpenAI 一直是技术革新的领头羊。2025 年 4 月 23 日,OpenAI 正式发布了其全新的图像生成模型 ——GPT-image-1,这一创新技术的推出,不仅为图像生成领域带来了前所未有的变革,也为开发者和创意工作者提供了更强大、更灵活的工具。
疯狂的KK
2025/04/25
9210
GPT-image-1:OpenAI 推出的最新图像生成模型
10个适用于WordPress的最佳时间轴插
您可能要考虑使用时间轴插件。 时间轴插件可以帮助观众以生动有趣的视觉方式讲述您的故事。
星姮十织
2022/01/02
2.6K0
盘点AI赋能PPT的办公工具
随着 chatgpt 的出圈,ai 已经开始已风卷残云之势占据了各个领域,几乎所有的领域都在被 AI 赋能,以前我们经常说干活的累死累活,有成果那又如何,到头来干不过写 ppt 的,现在不要紧了,我们可以通过 ai 来写 ppt 了,那些靠写 ppt 的再也不能嚣张跋扈了。
程序那些事儿
2023/07/24
1.2K0
盘点AI赋能PPT的办公工具
释放 ChatGPT4 的威力
在当今快速发展的数字领域中,人工智能(AI)已经成为无数行业的重要组成部分,彻底改变了我们生活和工作的方式。其中最具变革性的 AI 技术之一是由 OpenAI 开发的 ChatGPT-4 模型。作为一系列强大语言模型的最新版本,ChatGPT-4 展示了在理解和生成类似人类文本方面的卓越能力,使其成为各种应用的宝贵工具。
ApacheCN_飞龙
2024/04/10
1930
100天精通Python丨黑科技篇 —— 05、ChatGPT
本文收录于 《100天精通Python专栏 - 快速入门到黑科技》,是由 CSDN 内容合伙人丨全站排名 Top 4 的硬核博主 不吃西红柿 倾力打造,分基础知识篇和黑科技应用两大部分。
不吃西红柿
2023/03/30
1.2K0
100天精通Python丨黑科技篇 —— 05、ChatGPT
Sitecore 十大优秀功能
为客户的需求创建最佳解决方案是我们的主要目标。良好的设计不仅仅是视觉吸引力,还要确保用户体验简单直观。在设计Sitecore网站时,我们始终牢记这一点  。
jack.yang
2025/04/05
1560
ChatGPT 之现金流
在当今快节奏和不断发展的世界中,财务稳定和独立变得越来越重要。零工经济的兴起导致了兼职的激增,即人们在正常工作之外从事的兼职活动,以赚取额外收入。
ApacheCN_飞龙
2024/05/24
1960
ChatGPT 之现金流
2019的10个最佳WordPress画廊插件
在视觉文化时代,如果您的网站包含图片,则它会获得更多的观看次数。 研究表明,如果带有照片或视频,您的内容将获得更好的好评。
全栈程序员站长
2022/09/06
5.9K0
2019的10个最佳WordPress画廊插件
你为什么要用GPT?你不得不使用chatGPT的理由!
随着人工智能技术的不断进步,GPT已经被广泛应用于各行各业。对于企业而言,GPT是一款强大的工具,可以帮助企业在内容创作、智能客服、舆情监测等领域实现更高效、更精准、更个性化的服务等方面获得更高效的解决方案。
Chatgpt注册
2023/05/15
7680
5.内容创作的未来:ChatGPT如何辅助写作(5/10)
在信息爆炸的时代,内容创作已成为连接品牌与受众、传递信息与知识、以及塑造文化与观念的重要手段。随着数字媒体的兴起,内容创作的需求日益增长,对创作者的写作速度和质量提出了更高的要求。人工智能(AI)技术的飞速发展为内容创作领域带来了革命性的变化,其中ChatGPT作为一种先进的语言模型,展现出在写作辅助上的显著潜力。
正在走向自律
2024/12/18
1990
5.内容创作的未来:ChatGPT如何辅助写作(5/10)
徐大大seo:创建外链 的7种有效方法
外链是指其他网站链接到你的网站,这对于提高网站的权威性和排名非常重要。但是,如何创建有效的外链呢?下面介绍7种有效的方法。
徐大大seo
2023/03/13
6400
ChatGPT 提示词技巧:制作Ai看得懂清晰有效咒语
当ChatGPT首次推出时,我立即被它的功能所吸引。我以各种方式尝试了该工具,并一直对结果感到惊讶。当我看到其他人找到使用 ChatGPT 的创造性方法并了解更多关于如何优化其潜力的信息时,我受到启发,创建了的有效提示存储库。发现和探索 ChatGPT 的功能,然后与他人分享我的发现,这确实令人兴奋。
轩辕镜像
2024/11/22
2700
ChatGPT 提示词技巧:制作Ai看得懂清晰有效咒语
如何利用AI提高内容生产效率?
简介:通过AI技术,可以提升内容生产效率和质量。AI可以帮助自动生成文章、编辑和校对内容,减少人工工作量。同时,AI可以分析用户数据和趋势,提供内容创作建议。此外,AI还可用于图像、音频处理,提供多媒体内容。 AI技术可以自动化工作流程,提高生产效率;优化内容质量,提供个性化推荐。AI还能提供实时反馈,改进创作策略。综上所述,AI技术为内容生产者提供了更高效、高质量的内容创作和管理方式。
正在走向自律
2024/12/18
5450
如何利用AI提高内容生产效率?
Midjourney应用场景、特点、生成图片带来影响
Midjourney是一个基于GPT-3.5系列接口开发的免费AI机器人,旨在提供多领域的智能对话服务。本文主要介绍Midjourney的应用场景、功能特点、图片生成后可以做什么?
正在走向自律
2024/12/18
7990
Midjourney应用场景、特点、生成图片带来影响
推荐阅读
相关推荐
ChatGPT 之联盟营销
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档