给虚拟机的Ubuntu配置静态IP地址。

虽然现在我们开发和测试以及运维都运用了大量的docker可以解决多环境的问题,但是不可否认的是虚拟机还是有自己的用武之地,特别是做分布式学习测试等。但是一般新安装的ip虚拟机ip地址都是自动获取的,下次启动的时候ip地址会发生变化,很不方便,所以今天我们看看如何配置静态的IP地址

一、首先选择虚拟机的网络为桥接模式。
二、进入/etc/netplan目录,找到一个yaml结尾的配置文件信息。
三、修改配置信息,

你进来可能看到的是这样的配置:

network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: true

现在我们把它修改成这样:

network:
  ethernets:
    ens33:
      addresses:
        - 192.168.1.111/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
          search: [mydomain,otherdomain]
          addresses: [192.138.1.1, 114.114.114.114]
  version: 2
  • 192.168.1.111/24:配置自己的ip地址为:192.168.1.111静态Ip地址。
  • via: 192.168.1.1:这个是当前局域网的网关地址。
  • addresses: [192.138.1.1, 114.114.114.114] :这是DNS解析。可以根据自己的来。114的是百度的。
四、重新加载网络:sudo netplan apply

更多的配置信息参考官网网络配置:https://ubuntu.com/server/docs/network-configuration

想不到的Invalid bound statement (not found)问题解决方案

在SpringBoot中开发,如果出现了Invalid bound statement (not found),不管是从翻译的意思和网上搜索引擎以及论坛给的答案都是你Mapper文件没有给对。

第一、你的配置文件没有给对,比如:

mybatis-plus:
  mapper-locations: classpath*:/mapper/*.xml

第二、是的的mapper中命名空间没有找到对的Dao文件像这样:

<mapper namespace="com.baidu.ai.auth.dao.XUserAccountDao">

第三,还有就是pom配置文件的build插件没有导入资源,比如:

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

重点来了!!!!!!!,当你发现所有的都检查了,发现还是报这个错误。

其实还有错误也会导致这种提示,那就是pom里面的依赖不兼容的时候,

比如,你引入了Mybatis和Mybatis-plus然后就掐架了。

比如,还有各种版本号不兼容的情况下。

最后把所有的版本都兼容了之后,代码显示正确了。

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.1</version>
        </dependency>

       <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-annotation</artifactId>
            <version>3.5.3.1</version>
        </dependency>

这个提示真的坑哦,如果提示冲突,或者直接给出很明显的异常都好排错。

Docker 安装RabbitMq镜像

如果是在物理机或者虚拟机以及云环境中搭建一个RabbitMq的话需要装很多环境,比如Erlang。那么如果用Docker搭建就简单的多。

前提基础:环境中已经安装了docker。

一、安装(拉取)RabbitMq镜像。

我们现在一个版本,3.11,并且带web控制面板的,后面有management的才是带面板的。

docker仓库版本地址:https://hub.docker.com/_/rabbitmq

sudo docker pull rabbitmq:3.11-management

二、创建并启动容器

docker run -d --hostname rb --name rb1 -p 15672:15672 -p 5672:5672 rabbitmq

参数说明

  • run :运行容器
  • -d :守护
  • –hostname :自定义一个主机名称,如果不自定义,系统会随机生成一个
  • –name:容器名称
  • -p:物理端口:容器端口。15672:是控制面板的端口,5672是RabbitMq服务的端口。

三、启动web插件

a,使用 docker ps -a 查看所有的容器。可以看到刚才运行的容器,比如我的容器ID:a7cdfe05e39c

b,进入容器:docker exec -it a7 /bin/bash :r7是我容器ID的前两个字母,因为没有其他id,r7可以确定是那个一个容器了。

c,开启插件:rabbitmq-plugins enable rabbitmq_management

这样就可以打开web管理界面了 http://ip地址:5672

四、添加账号

系统默认是guest账号,其实我们可以自己来添加一个账号,以下是在容器里操作的哦。

a,添加一个虚拟主机: rabbitmqctl add_vhost host1 host1是虚拟主机名称,可以自定义的。

b,添加账号:rabbitmqctl add_user admin 123456 admin是账号,123456是密码

c,开启管理权限:rabbitmqctl set_user_tags admin management admin是刚才添加的账号

这样我们就可以在【三】中登录了。

用户的四种角色:

management
用户可以通过AMQP做的任何事外加:
列出自己可以通过AMQP登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和关闭自己的channels 和 connections
查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。

policymaker
management可以做的任何事外加:
查看、创建和删除自己的virtual hosts所属的policies和parameters

monitoring
management可以做的任何事外加:
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connections和channels
查看节点级别的数据如clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息

administrator
policymaker和monitoring可以做的任何事外加:
创建和删除virtual hosts
查看、创建和删除users
查看创建和删除permissions
关闭其他用户的connections

使用Yaml类读取yml配置文件信息。

    private String getPropertiesValue(String key) {
        
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("application.yml");
        Yaml yaml = new Yaml();

        Map<String, Object> map = yaml.load(inputStream);

        String[] split = key.split("\\.");

        String res = null;

        for (String s : split) {
            Object ob = map.get(s);
            if (!(ob instanceof Map)) {
                res = (String) ob;
            } else {
                map = (Map) ob;
            }
        }
        return res;
    }

调用:

        String key = "spring.profiles.active";
        System.out.println(getPropertiesValue(key));

在Quartz的Job中自动注入RabbitMq为null的解决方案。

业务场景是这样的,在Quartz定时任务框架中去执行定时业务,比如获取最新的信息,如果存在就通过RabbitMq发送其他服务器处理,那么在SpringBoot中我们自动想到使用@Autowired去自动注入:

   @Autowired
    private AmqpTemplate amqpTemplate;

但是提示为null,因为 Quartz 在执行任务时是在独立的线程中执行的,而这个线程是不受 Spring 管理的,因此在这个线程中无法自动注入 amqpTemplate。

那么我们可以通过其他方式来解决这一问提

第一步,我们定义一个自定义的模板类。

import jakarta.annotation.PostConstruct;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Component
public class MyRabbitTemplate {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public static RabbitTemplate staticRabbitTemplate;

    @PostConstruct
    public void init() {
        staticRabbitTemplate = rabbitTemplate;
    }
}

第二步,在Job类中使用

MyRabbitTemplate.staticRabbitTemplate.convertAndSend("队列名称", "消息内容");

备注:这是application.yml的配置

server:
  port: 12345
spring:
  quartz:
    scheduler-name: XiaoHongShuScheduler
    job-store-type: memory
    auto-startup: false
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: admin