首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >04-RabbitMQ常用的六种模型以及在SpringBoot中的应用

04-RabbitMQ常用的六种模型以及在SpringBoot中的应用

作者头像
qubianzhong
发布于 2019-08-14 06:21:37
发布于 2019-08-14 06:21:37
1.1K00
代码可运行
举报
文章被收录于专栏:行者常至行者常至
运行总次数:0
代码可运行

在RabbitMQ中,我们常用的模型主要有六种,分别是:

  • Hello World
  • Work queues
  • Publish/Subscribe
  • Routing
  • Topic
  • RPC

俗话说得好,光说不练假把式,下面我们结合springBoot逐一实现这六种模型。

Hello World

从上图可以看出,这是一个默认交换机的单播路由,并且每个队列只有一个消费者。

Work queues

从上图可以看出,主要的部分是:默认交换机的单播路由,并且每个队列有多个消费者。

Publish/Subscribe

从上图可以看出,主要的部分是:扇形交换机的多播路由。

Routing

从上图可以看出,主要的部分是:直连交换机的多播路由。

Topic

从上图可以看出,主要的部分是:主题交换机的多播路由。

RPC

从上图可以看出,主要的部分是:默认交换机的单播路由。

环境

  • 下面我们代码演示一下除了RPC之外的其他五种模型,在SpringBoot中的用法

pom.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.qbz</groupId>
    <artifactId>rabbit-mq-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rabbit-mq-test</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    virtual-host: /qbz-test #虚拟主机,必须存在,不然会报错。
    username: guest
    password: guest
    publisher-confirms: true #消息发送到交换机确认机制,是否确认回调,默认false
    publisher-returns: true #消息发送到交换机确认机制,是否返回回调,默认false
    listener:
      simple:
        prefetch: 1 #预先载入数量,默认值250
        concurrency: 10 #指定最小消费数量
        max-concurrency: 20 #指定最大的消费者数量,当并行消费者数量到达concurrency后会开至最大max-concurrency
        acknowledge-mode: manual # 采用手动应答,设置为手动应答后,消费者如果不进行手动应答,会处于假死状态,不能再消费。默认auto
        retry:
          enabled: true # 失败重试机制,默认为false.
          max-attempts: 1 # 失败后,再重试几次,默认为:3

RabbitMqTestApplication.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.qbz.rabbitmqtest;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * RabbitMQ 测试
 *
 * @author qubianzhong
 * @Date 13:42 2019/7/26
 */
@SpringBootApplication
@EnableRabbit //新增开启Rabbit注解
public class RabbitMqTestApplication {

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

}

RabbitMqProduceController.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.qbz.rabbitmqtest.controller;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author qubianzhong
 * @date 2019/7/22 13:51
 */
@RestController
public class RabbitMqProduceController {

    @Autowired
    private AmqpTemplate amqpTemplate;
    @Autowired
    private AmqpAdmin amqpAdmin;

    @GetMapping(value = "/produce")
    public String produceMsg(@RequestParam(value = "msg") String msg) {
        /****************************hello/work start****************************
         * hello-world、work queues 均是只绑定队列
         * 发布消息时,如下所示,推荐使用第二种
         */
        //1.如果队列不存在,则消息会进入“黑洞”
        amqpTemplate.convertAndSend("hello", msg + System.currentTimeMillis());
        /**
         * 2.如果队列不存在,则进行创建,如果队列已存在,则使用此队列
         * public Queue(String name) {
         *      //The queue is durable, non-exclusive and non auto-delete.
         * 		this(name, true, false, false);
         *  }
         */
        Queue queue = new Queue("hello");
        amqpAdmin.declareQueue(queue);
        amqpTemplate.convertAndSend(queue.getName(), msg + System.currentTimeMillis());

        //3.work
        queue = new Queue("work");
        amqpAdmin.declareQueue(queue);
        for (int i = 0; i < 30; i++) {
            amqpTemplate.convertAndSend(queue.getName(), "wwoork" + i);
        }
        /****************************hello/work end****************************/

        /****************************Publish/Subscribe start****************************
         * 生产者只向扇形交换机发送消息,扇形交换机负责向绑定其队列上的所有消费者进行分发。
         * public AbstractExchange(String name) {
         *      //Construct a new durable, non-auto-delete Exchange with the provided name.
         * 		this(name, true, false);
         * }
         */
        for (int i = 0; i < 5; i++) {
            Exchange pubSubExchange = new FanoutExchange("pub-sub-exchange");
            amqpAdmin.declareExchange(pubSubExchange);
            amqpTemplate.convertAndSend(pubSubExchange.getName(), null, msg + System.currentTimeMillis());
        }
        /****************************Publish/Subscribe end****************************/

        /****************************Routing start****************************
         * Routing  消费者消费的时候,多个路由键绑定一个队列
         */
        Exchange routeExchange = new DirectExchange("routing-exchange");
        amqpAdmin.declareExchange(routeExchange);
        amqpTemplate.convertAndSend(routeExchange.getName(), "routing-log-error", "routing-log-error:" + System.currentTimeMillis());
        amqpTemplate.convertAndSend(routeExchange.getName(), "routing-log-info", "routing-log-info:" + System.currentTimeMillis());
        amqpTemplate.convertAndSend(routeExchange.getName(), "routing-log-waring", "routing-log-waring:" + System.currentTimeMillis());

        /****************************Routing end****************************/

        /****************************Topic start****************************
         * Topic  消费者消费的时候,多个路由键,模糊匹配,绑定一个队列,其实和routing差不多
         */
        Exchange topicExchange = new TopicExchange("topic-exchange");
        amqpAdmin.declareExchange(topicExchange);
        amqpTemplate.convertAndSend(topicExchange.getName(), "topic-log-error.20190706", "topic-log-error.20190706:" + System.currentTimeMillis());
        amqpTemplate.convertAndSend(topicExchange.getName(), "topic-log-info.20190606", "topic-log-info.20190606:" + System.currentTimeMillis());
        amqpTemplate.convertAndSend(topicExchange.getName(), "topic-log-error.20190708", "topic-log-error.20190708:" + System.currentTimeMillis());
        amqpTemplate.convertAndSend(topicExchange.getName(), "topic-log-waring.20190506", "topic-log-waring.20190506:" + System.currentTimeMillis());
        amqpTemplate.convertAndSend(topicExchange.getName(), "topic-log-waring.20190516", "topic-log-waring.20190516:" + System.currentTimeMillis());
        amqpTemplate.convertAndSend(topicExchange.getName(), "topic-log-info.20190723", "topic-log-info.20190723:" + System.currentTimeMillis());

        /****************************Topic end****************************/

        return "success";
    }
}

RabbitTestListener.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.qbz.rabbitmqtest.rabbit;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @author qubianzhong
 * @date 2019/7/26 14:40
 */
@Component
public class RabbitTestListener {
    /****************************demo 演示如何消费消息 start****************************
     * 推荐使用第二种或第三种
     * 当不需要绑定交换机的时候,如果使用第三种,exchange置为空会报错
     */

    /**
     * 1.此种用法需要手动创建队列,不然会报错
     */
    @RabbitListener(queues = "demo-1")
    public void demo1(Message message, Channel channel) throws IOException {
        System.err.println("demo-1:" + new String(message.getBody()));
        //信道上发布的消息都会被指派一个唯一的ID号:message.getMessageProperties().getDeliveryTag()
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);

        //1:接收到的被指派一个唯一的ID号:deliveryTag;
        // 2:true当前consumer拒绝所有的deliveryTag包括此次的,false当前consumer只拒绝此次的这个deliveryTag;
        // 3:true此消息重新排队,而不是被丢弃或者扔进死信队列中
        //channel.basicNack(message.getMessageProperties().getDeliveryTag(), true, true);
    }

    /**
     * 2.如果队列不存在,则会新建;如果队列已存在,则使用此队列
     */
    @RabbitListener(queuesToDeclare = @Queue("demo-2"))
    public void demo2(Message message, Channel channel) throws IOException {
        System.err.println("demo-2:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }


    /**
     * 3.绑定队列、交换机
     * 如果队列或交换机不存在,则新建;如果已存在,则使用。
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("demo-3"),
            exchange = @Exchange("demo-exchange-3")
    ))
    public void demo3(Message message, Channel channel) throws IOException {
        System.err.println("demo-3:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }

    /****************************demo 演示如何消费消息 start****************************/

    /****************************hello start****************************
     * 消费 hello-world
     */
    @RabbitListener(queuesToDeclare = {@Queue("hello")})
    public void hello(Message message, Channel channel) throws IOException {
        System.err.println("hello:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }
    /****************************hello end****************************/

    /****************************work start****************************
     * 消费 work 一个队列对应多个消费者,此时,消息是平均分配到每个消费者手里的。
     */
    @RabbitListener(queuesToDeclare = {@Queue("work")})
    public void work1(Message message, Channel channel) throws IOException {
        System.err.println("work1:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }

    @RabbitListener(queuesToDeclare = {@Queue("work")})
    public void work2(Message message, Channel channel) throws InterruptedException, IOException {
        Thread.sleep(1230);
        System.err.println("work2:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }

    @RabbitListener(queuesToDeclare = {@Queue("work")})
    public void work3(Message message, Channel channel) throws InterruptedException, IOException {
        Thread.sleep(30);
        System.err.println("work3:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }
    /****************************work end****************************/


    /****************************Publish/Subscribe start****************************
     * 消费 Publish/Subscribe 扇形交换机负责向绑定其队列上的所有消费者进行分发。
     * 此处,exchange和queue如果不存在,则会新建。
     * 注意:@Exchange注解属性 type需要定义为 fanout,不然会是默认的 direct
     */
    @RabbitListener(bindings = {@QueueBinding(
            value = @Queue("sub-pub-queue1"),
            exchange = @Exchange(value = "pub-sub-exchange", type = ExchangeTypes.FANOUT)
    )})
    public void pubSub1(Message message, Channel channel) throws IOException {
        System.err.println("sub-pub-queue1:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }

    @RabbitListener(bindings = {@QueueBinding(
            value = @Queue("sub-pub-queue2"),
            exchange = @Exchange(value = "pub-sub-exchange", type = ExchangeTypes.FANOUT)
    )})
    public void pubSub2(Message message, Channel channel) throws IOException {
        System.err.println("sub-pub-queue2:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }
    /****************************Publish/Subscribe end****************************/


    /****************************Routing start****************************
     * 消费 Routing
     * 其中一个队列,只消费error信息,一个队列消费所有信息
     */
    @RabbitListener(bindings = {@QueueBinding(value = @Queue("routing-log-error"), key = {"routing-log-error"}, exchange = @Exchange(value = "routing-exchange"))})
    public void routing1(Message message, Channel channel) throws IOException {
        System.err.println("routing-log-error:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }

    @RabbitListener(bindings = {@QueueBinding(value = @Queue("routing-log-all"), key = {"routing-log-error", "routing-log-info", "routing-log-waring"}, exchange = @Exchange(value = "routing-exchange")
    )})
    public void routing2(Message message, Channel channel) throws IOException {
        System.err.println("routing-log-all:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }
    /****************************Routing end****************************/


    /****************************Topic start****************************
     * 消费 Topic
     * 其中一个队列,消费前缀为'topic-log-info.'的信息,
     * 一个队列消费前缀为'topic-log-error.'的和模糊匹配'.201907.'的信息
     */
    @RabbitListener(bindings = {@QueueBinding(value = @Queue("topic-log-1"), key = {"topic-log-info.*"}, exchange = @Exchange(value = "topic-exchange", type = ExchangeTypes.TOPIC))})
    public void topic1(Message message, Channel channel) throws IOException {
        System.err.println("所有的info:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }

    @RabbitListener(bindings = {@QueueBinding(value = @Queue("topic-log-2"), key = {"*.201907.*", "topic-log-error.*"}, exchange = @Exchange(value = "topic-exchange", type = ExchangeTypes.TOPIC))})
    public void topic2(Message message, Channel channel) throws IOException {
        System.err.println("所有的error and 7月份:" + new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }
    /****************************Routing end****************************/

}

RabbitTemplateCallback.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.qbz.rabbitmqtest.rabbit;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author qubianzhong
 * @date 2019/7/31 10:56
 */
@Component
public class RabbitTemplateCallback implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {

    private RabbitTemplate rabbitTemplate;

    @Autowired
    public void setRabbitTemplate(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
        this.rabbitTemplate.setMandatory(true);
        this.rabbitTemplate.setConfirmCallback(this::confirm);
        this.rabbitTemplate.setReturnCallback(this::returnedMessage);
    }

    /**
     * Confirmation callback.
     *
     * @param correlationData correlation data for the callback.
     * @param ack             true for ack, false for nack
     * @param cause           An optional cause, for nack, when available, otherwise null.
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (!ack) {
            System.err.println("消息未能在交换机上得到确认!异常处理......");
        }
    }

    /**
     * Returned message callback.
     *
     * @param message    the returned message.
     * @param replyCode  the reply code.
     * @param replyText  the reply text.
     * @param exchange   the exchange.
     * @param routingKey the routing key.
     */
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        System.err.println("消息未能到达队列!" + "return exchange: " + exchange + ", routingKey: "
                + routingKey + ", replyCode: " + replyCode + ", replyText: " + replyText);
    }
}

RPC 补充

我们并不推荐RPC式的mq调用,这么做完全没有发挥mq异步削峰的作用。如果有使用RPC的需求,请移步SpringCloud或者Dubbo。

我们虽然不使用RabbitMQ来进行RPC调用,但是我们也要了解,RabbitMQ为啥子可以实现RPC。

当使用RabbitMQ来实现RPC时.你只是简单地发布消息而已。RabbitMQ会负责使用绑定来路由消息到达合适的队列。RPC服务器会从这些队列上消费消息。RabbitMQ替你完成了所有这些艰难的工作:将消息路由到合适的地方,通过多台RPC服务器对RPC消息进行负载均衡,甚至当处理消息的服务器崩溃时,将RPC消息重发到另一台。

问题在于。如何将应答返回给客户端呢?毕竟,到目前为止你体验的RabbitMQ是发后即忘模型。

RabbitMQ团队想出了一个优雅的解决方案:使用消息来发回应答。在每个AMQP消息头里有个字段叫作reply_ to,消息的生产者可以通过该字段来确定队列名称,并监听队列等待应答。然后接收消息的RPC服务器能够检杳reply _to字段,并创建包含应答内容的新的消息,并以队列名称作为路由键。

你也许想:“光是每次创建唯一队列名就得花很多工夫吧。我们怎样阻止其他客户端读到应答消息呢?”

我们前面说过,如果你声明了没有名字的队列,RabbitMQ会为你指定一个。这个名字恰好是唯一的队列名;同时在声明的时候指定exclusive参数.确保只有你可以读取队列上的消息。所有RPC客户端需要做的是声明临时的、排他的、匿名队列,并将该队列名称包含到RPC消息的reply _to头中。于是服务器端就知道应答消息该发往哪儿了。值得注意的是我们并没有提到将应答队列绑定到交换器上。这是因为当RPC服务器将应答消息发布到RabbitMQ而没有指定交换器时.RabbitMQ就知道目的地是应答队列,路由键就是队列的名称。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年08月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
启动计算机配置windows7,win7开机显示准备配置Windows请勿关闭计算机 然后无限重启怎么回事…
win7开机显示准备配置Windows请勿关闭计算机 然后无限重启怎么回事以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
全栈程序员站长
2022/07/05
2.7K0
启动计算机配置windows7,win7开机显示准备配置Windows请勿关闭计算机 然后无限重启怎么回事…
正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程…
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。
全栈程序员站长
2022/07/02
2.7K0
正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程…
台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法…
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。
全栈程序员站长
2022/07/02
3.2K0
台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法…
windows7系统 您的账户已被停用。请向系统管理员咨询
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
3.3K0
计算机蓝屏代码0x000000ED,电脑蓝屏代码0x000000ed解决步骤[通俗易懂]
电脑蓝屏代码现象是我们在使用电脑中最常见的一种启动问题,令小白用户很头痛 。比如,我们在启动电脑的时候,它并没有正常地启动,屏幕反而一片蓝色,出现了一串奇怪的代码:0x000000ed,怎么办?下面,小编给大伙演示电脑蓝屏代码0x000000ed的修复流程。
全栈程序员站长
2022/11/10
4.5K0
计算机蓝屏代码0x000000ED,电脑蓝屏代码0x000000ed解决步骤[通俗易懂]
快速加速计算机的方法,电脑慢的快速解决办法 四种方法电脑速度变快10倍[通俗易懂]
电脑这种东西刚买来的时候用起来“刷刷”的,随着使用时间的增加,电脑就会开始莫名的变卡、变慢。作为一个资深的电脑大神,电脑慢这种问题根本就不能算电脑问题,让电脑变快的方法有很多,而且操作都巨简单,下面就一起来看看吧。
全栈程序员站长
2022/09/06
2.7K0
快速加速计算机的方法,电脑慢的快速解决办法 四种方法电脑速度变快10倍[通俗易懂]
计算机错误代码0X000000be,Win7系统出现蓝屏代码0x000000BE的解决方法「建议收藏」
蓝屏是我们日常使用电脑的时候经常会碰到的故障,这不就有很多win7 32位系统用户反映说电脑出现蓝屏错误代码0x000000BE,该怎么解决这样的问题呢,接下来给大家讲解一下Win7系统出现蓝屏代码0x000000BE的解决方法吧。
全栈程序员站长
2022/11/09
2.3K0
未能连接一个windows服务器,Win7出现未能连接一个Windows服务的解决办法
大家好,又见面了,我是你们的朋友全栈君。 近日有网友“所爱隔山海”Win7电脑在开机的时候遇到了开机很慢,开机后提示:未能连接一个Windows服务。如果遇到电脑出现未能连接一个Windows服务该如
全栈程序员站长
2022/08/27
1.7K0
未能连接一个windows服务器,Win7出现未能连接一个Windows服务的解决办法
xp sp2 升级到sp3
昨天晚上整整忙乎了一夜,终于将sp2成功升级至SP3了,期间失败了n多次,但终归是成功了,再次将方法贴出,希望对其他人有用。
py3study
2020/01/08
3.4K0
Windows XP虚拟机到期无法使用的解决方案(救急版)[通俗易懂]
在之前的文章中已经教过大家如何在VMware中安装Windows XP虚拟机,但是使用期限只有30天,近期有很多小伙伴说虚拟机到期了,开机之后显示无法登录,进不去桌面,更换密钥似乎也没成功,情况大概如下图这样:
全栈程序员站长
2022/10/05
3.2K0
Windows XP虚拟机到期无法使用的解决方案(救急版)[通俗易懂]
键盘失灵重启电脑就没事了_笔记本电脑重启后黑屏
下午,卸载了360软件(安全卫士、软件管家、360安全浏览器)后,重启电脑,然后电脑开始硬盘扫描、检测,结果告知不能成功修复。
全栈程序员站长
2022/09/21
2.3K0
计算机插了网线缺连不了网络,网线连不上网怎么回事_为什么网线插电脑上不了网-win7之家…
当我们在使用有线网络的时候,都需要在电脑中插入网线才可以,但是有不少用户却遇到网线连不上网的情况,为什么网线插电脑上不了网呢?导致这样问题的原因有很多,为了帮助到大家,现在给大家讲解一下网线连不上网的几种解决方法,一起来看看吧。
全栈程序员站长
2022/09/13
23.7K0
win7显示安装程序正在启动服务器失败,Win7安装程序正在启动服务怎么办?
许多用户在使用电脑的时候,都会时不时的重装一下电脑系统。但是最近有不少用户反应自己在安装Windows7系统的时候,卡在程序正在启动服务。那么这要怎么办呢?下面小编就带着大家一起看看吧!
全栈程序员站长
2022/09/14
4.7K0
win7显示安装程序正在启动服务器失败,Win7安装程序正在启动服务怎么办?
计算机修改用户名密码,怎么修改电脑用户名呢_电脑的登录名和密码在哪里
1、按“win+R”打开运行,在运行输入框里面输入“gpedit.msc”,如下图所示:
全栈程序员站长
2022/11/04
4.6K0
计算机主机后面板接口名称,i/o背板接口是计算机主机与什么连接的插座结合?…
usb不被电脑识别,如果是系统或系统自带的驱动的原因,可以按下面方法修复一下。 1、开机按f8进入安全模式后在退出,选重启或关机在开机,就可以进入正常模式(修复注册表)。 2、如果故障依旧,请你用系统自带的系统还原,还原到你没有出现这次故障的时候修复(如果正常模式恢复失败,请开机按f8进入到安全模式中使用系统还原)。 3、如果故障依旧,使用系统盘修复,打开命令提示符输入sfc /scannow 回车(sfc和/之间有一个空格),插入原装系统盘修复系统,系统会自动对比修复的。 4、如果故障依旧,在bios中设置光驱为第一启动设备插入系统安装盘按r键选择“修复安装”即可。 5、如果故障依旧,建议重装操作系统。 u盘插入电脑,电脑提示“无法识别的设备”故障诊断方法如下。 第1步:如果u盘插入电脑,电脑提示“无法识别的设备”,说明u盘的供电电路正常。接着检查u盘的usb接口电路故障。 第2步:如果u盘的usb接口电路正常,则可能是时钟电路有故障(u盘的时钟频率和电脑不能同步所致)。接着检测时钟电路中的晶振和谐振电容。 第3步:如果时钟电路正常,则是主控芯片工作不良。检测主控芯片的供电,如果供电正常,则是主控芯片损坏,更换即可。 另外还有一种原因,就是usb接口供电不足,可能是usb接口连接的外设太多造成供电不足。建议使用带电的usbhub或者使用usb转ps/2的转接头。还有可能windowsxp默认开启了节电模式,致使usb接口供电不足,使usb接口间歇性失灵。右击我的电脑/属性/硬件/设备管理器,双击“通用串行总线控制器”会到好几个“usb root hub”双击任意一个,打开属性对话框,切换到“电源管理”选项卡,去除“允许计算机关闭这个设备以节约电源”前的勾选,点击确定返回,依次将每个usb roothub的属性都修改完后重新启动电脑。usb设备就能恢复稳定运行了,频率尽量设低一些。 如果是有盘符而没有显示出来的,解决方法:右击我的电脑/管理/存储/磁盘管理,然后右击“可移动磁盘”图标”单击快捷菜单中的“更改驱动器和路径”选项,并在随后的界面中单击“添加”按钮,接下来选中“指派驱动器号”,同时从该选项旁边的下拉列表中选择合适的盘符,在单击确定即可。最后打开我的电脑,就能看到移动硬盘的盘符了。
全栈程序员站长
2022/07/12
8070
解决win10开机内存占用大,内存持续升高的方法[通俗易懂]
控制面板-》管理工具-》windows内存诊断。完毕重启,直接开机30多秒,内存降低到25%。C盘占用降低2G。
全栈程序员站长
2022/09/07
12.2K0
SQL 2005安装问题解决办法
问题一、忘记了登录Microsoft SQL Server 2005 的sa的登录密码
全栈程序员站长
2022/07/05
2.5K0
Unity3D 2018安装教程[通俗易懂]
安装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,安装包路径也不要有中文。
全栈程序员站长
2022/09/30
1.4K0
Unity3D 2018安装教程[通俗易懂]
0x00000000代码电脑蓝屏的原因_计算机0x是什么意思
在我们平时工作使用电脑的过程中难免会遇到各种各样的问题,有些电脑的故障,可以轻松解决,而有些问题就连重装系统都不一定解决的了,例如电脑蓝屏,而电脑蓝屏代码0x000000BE又是怎么回事呢?又该怎么解决呢?莫慌,小编这就将解决电脑蓝屏代码0x000000BE的方法告诉大家。
全栈程序员站长
2022/11/08
1.8K0
net share列出了Windows的默认共享(包括C盘)[通俗易懂]
1、如果你不在局域网内使用共享服务,干脆将“本地连接‘属性中的“网络的文件和打印机共享 ”卸载掉,默认共享就可以彻底被关闭了
全栈程序员站长
2022/07/31
5.4K0
推荐阅读
启动计算机配置windows7,win7开机显示准备配置Windows请勿关闭计算机 然后无限重启怎么回事…
2.7K0
正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程…
2.7K0
台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法…
3.2K0
windows7系统 您的账户已被停用。请向系统管理员咨询
3.3K0
计算机蓝屏代码0x000000ED,电脑蓝屏代码0x000000ed解决步骤[通俗易懂]
4.5K0
快速加速计算机的方法,电脑慢的快速解决办法 四种方法电脑速度变快10倍[通俗易懂]
2.7K0
计算机错误代码0X000000be,Win7系统出现蓝屏代码0x000000BE的解决方法「建议收藏」
2.3K0
未能连接一个windows服务器,Win7出现未能连接一个Windows服务的解决办法
1.7K0
xp sp2 升级到sp3
3.4K0
Windows XP虚拟机到期无法使用的解决方案(救急版)[通俗易懂]
3.2K0
键盘失灵重启电脑就没事了_笔记本电脑重启后黑屏
2.3K0
计算机插了网线缺连不了网络,网线连不上网怎么回事_为什么网线插电脑上不了网-win7之家…
23.7K0
win7显示安装程序正在启动服务器失败,Win7安装程序正在启动服务怎么办?
4.7K0
计算机修改用户名密码,怎么修改电脑用户名呢_电脑的登录名和密码在哪里
4.6K0
计算机主机后面板接口名称,i/o背板接口是计算机主机与什么连接的插座结合?…
8070
解决win10开机内存占用大,内存持续升高的方法[通俗易懂]
12.2K0
SQL 2005安装问题解决办法
2.5K0
Unity3D 2018安装教程[通俗易懂]
1.4K0
0x00000000代码电脑蓝屏的原因_计算机0x是什么意思
1.8K0
net share列出了Windows的默认共享(包括C盘)[通俗易懂]
5.4K0
相关推荐
启动计算机配置windows7,win7开机显示准备配置Windows请勿关闭计算机 然后无限重启怎么回事…
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档