2021-01-13

步骤1

  1. 安装erlang
  2. 安装rabbitMQ
  3. 做好准备,连接成功,访问http://localhost:15672

这些我就不多说了,rabbitmq可以去官网下载,每个版本都有对应的erlang版本说明,这里推荐https://www.cnblogs.com/z-1026/p/9985389.html下载安装,另外我还参考了:https://www.cnblogs.com/saryli/p/9729591.html这个博客

讲一下我遇到的问题:由于我第一次安装了6.2版本,与我的rabbitmq版本不匹配,但是卸载了之后,安装对应版本,依旧不可以,报错:Your installed version of Erlang (6.2) is too old. Please install a more recent version

解决:erlang卸载的时候用自带的进行卸载,我之前是用的window自带的卸载,linux系统就不说了

这一切准备好之后,进入预备状态

如果你还不知道什么是rabbitMQ,可以参考https://juejin.cn/post/6844903975360135176以及官方网站https://www.rabbitmq.com/getstarted.html

七种消息模型,随后我会用代码实现

步骤2

在新建的maven项目中加入依赖

<dependency>
      <groupId>com.rabbitmq</groupId>
      <artifactId>amqp-client</artifactId>
      <version>5.7.2</version>
</dependency>

开启本地的rabbitmq服务,首先点击admin---》add a user---》分配权限

 

开启服务的时候我遇到的问题:此时已经按照https://www.cnblogs.com/saryli/p/9729591.html这个博客配置好,但是点击在这里的时候我报了completed with 0 plugins.rabbitmq(正常是3)

解决:首先关闭服务,然后运行rabbitmq-plugins enable rabbitmq_management命令在sbin目录下

 

 

步骤3

模型1:点对点通信

首先建立连接工具类

public class ConnectionUtil {
    private static ConnectionFactory connectionFactory;

    static {
        connectionFactory = new ConnectionFactory();
        //设置连接rabbitmq主机
        connectionFactory.setHost("localhost");
        //设置端口号,TCP通信的端口号的5672
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/ems");
        connectionFactory.setUsername("ems");
        connectionFactory.setPassword("123");
    }

    public static Connection connection() {
        try {
            return connectionFactory.newConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void closeConnectionAndChannel(Channel channel, Connection connection) {
        try {
            if (channel != null) { channel.close(); }
            if (connection != null) { connection.close(); }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

建立生产者

    //生产消息
    @Test
    public void testSendMessage() throws IOException, TimeoutException {


        //获取连接对象
        Connection  connection = ConnectionUtil.connection();

        //获取连接通道
        Channel channel = connection.createChannel();

        //通道绑定对应消息队列
        //参数1:队列名称 如果不存在自动创建
        //参数2:用来定义队列特性是否需要持久化 true 持久化队列 false 不持久化
        //参数3:exclusive 是否独占队列
        //参数4:autoDelete:在消费完是否自动展出队列
        channel.queueDeclare("hello",false, false, false, null);

        //发布消息
        channel.basicPublish("","hello", null, "hello rabbitmq".getBytes());
        ConnectionUtil.closeConnectionAndChannel(channel, connection);
    }

这时候可以发送一下消息,看看在这里有没有变成1,以此来看下是否连接成功,如果消息拒绝了,就返回前面看看是不是服务器什么的写错了,还是权限不够

建立消费者

    public static void main(String[] args) throws IOException, TimeoutException {

        Connection connection = ConnectionUtil.connection();

        Channel channel = connection.createChannel();

        channel.queueDeclare("hello", false, false, false, null);

        //消费消息
        //参数1:消费的那个队列名称
        //参数2:开始消息的自动确认机制
        //参数3:消费时的回调接口
        channel.basicConsume("hello", true, new DefaultConsumer(channel){
            @Override
            //最后一个参数:消息队列中取出的消息
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("new String(body) = " + new String(body));
            }
        });
    }

执行后看是否消费消息,这里我没有进行close操作,会一直监听生产者生产的消息队列,一旦有消息就会进行消费,我这里默认每5秒刷新一次

注:同一个通道可以给多个队列发送消息,消费者和生产者队列特性要严格一致

 

 

<think>好的,用户想比较两个日期字符串的大小,比如'2021-01-03'和'2021-03-04'。首先,我需要考虑如何正确解析这些字符串并转换成可比较的格式。日期字符串的格式是yyyy-MM-dd,这在编程中很常见,但不同的编程语言可能有不同的处理方法。 用户可能用的是哪种语言呢?问题中引用了Java的引用,比如SimpleDateFormat,所以可能用户使用的是Java。不过,也可能用户对其他语言的方法感兴趣,比如Python或JavaScript。我需要先确定主要方法,再提到其他语言的例子。 首先,在Java中,比较日期字符串的方法是将字符串转换为Date对象,然后使用compareTo方法。或者,使用SimpleDateFormat将字符串解析成Date对象后再比较。另外,用户提到的引用[1]和[2]都提到了字符串比较,如果格式正确的话,直接按字符串比较是否可行?比如,如果日期字符串的格式是yyyy-MM-dd,并且每个部分都是两位补零的话,那么按字典序比较字符串是否有效?例如'2021-01-03'和'2021-03-04',直接比较字符串的话,前者的月份是01,后者是03,所以字符串比较会正确识别前者更小。但需要确认格式是否正确,比如月份和日期是否补零。如果用户输入的日期字符串是标准化的,那么直接比较可能有效,如引用[2]提到的。 但更可靠的方法还是将字符串转换为日期对象再比较,这样可以避免格式不一致的问题。例如,在Java中,使用SimpleDateFormat.parse()将字符串转为Date对象,然后比较两个Date对象的时间戳。或者在Python中,使用datetime模块的strptime方法解析字符串为datetime对象,再比较这些对象。 另外,用户可能需要处理不同格式的情况,但题目中的例子都是相同的格式,所以可能不需要考虑格式转换的问题。但为了代码的健壮性,应该先验证字符串是否符合预期格式。 现在需要分步骤说明:首先解析字符串为日期对象,然后比较。给出具体代码示例,比如Java和Python的。同时,提到直接字符串比较的条件和注意事项。 需要注意的是,直接字符串比较只有在格式严格一致且各部分补零的情况下才有效。例如,月份必须是两位,如03而不是3,否则像'2021-3-04'这样的字符串直接比较就会出错,因为3和03的字典序不同。所以,虽然引用[2]提到可以比较,但前提是格式正确。需要提醒用户这一点。 总结回答步骤: 1. 确认日期字符串的格式是否符合标准(yyyy-MM-dd,补零)。 2. 如果格式正确,可以直接字符串比较。 3. 否则,转换为日期对象再比较。 4. 提供不同编程语言的示例,如Java、Python、JavaScript。 5. 强调注意事项,如格式必须一致,补零的重要性。 现在检查引用内容,引用[1]提到使用SimpleDateFormat的format方法将日期转化为字符串再比较,但这里用户是要比较输入的字符串,可能直接转换后的比较是否需要?或者用户可能误解了引用的内容。不过引用[2]明确说明在格式正确的情况下,可以直接比较字符串。所以需要结合这两种方法。 可能用户的问题更倾向于如何正确转换,所以重点放在解析字符串为日期对象的方法上,同时提到直接比较的条件。因此,回答应该分两种方法:直接比较(条件严格)和转换为对象比较(更可靠)。 在代码示例中,Java使用SimpleDateFormat或LocalDate(Java 8及以上),Python使用datetime,JavaScript使用Date对象。例如: Java示例(使用SimpleDateFormat): 解析两个字符串为Date对象,然后使用compareTo或before/after方法。 Python示例: 使用datetime.strptime解析字符串为datetime对象,然后直接比较。 JavaScript示例: 将字符串转换为Date对象,再比较时间戳。 同时,提醒异常处理,比如捕获解析异常,以防格式错误。 最后,相关问题可能涉及日期格式转换、不同语言的处理方法、如何处理不同格式的日期比较,或者性能上的考虑。</think>要比较两个格式为$yyyy-MM-dd$的日期字符串(例如$'2021-01-03'$和$'2021-03-04'$),可通过以下方法实现: --- ### 方法一:直接字符串比较(仅适用于标准化格式) 若字符串满足以下条件: 1. 年份、月份、日期均补零(如`03`而非`3`) 2. 格式严格统一为$yyyy-MM-dd$ 可直接按**字典序**比较字符串: ```python date1 = '2021-01-03' date2 = '2021-03-04' print(date1 < date2) # 输出 True ``` --- ### 方法二:转换为日期对象(推荐) 通过编程语言内置的日期解析工具,将字符串转换为日期对象后再比较: #### **Java 示例** ```java import java.text.SimpleDateFormat; import java.util.Date; public class DateCompare { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { Date date1 = sdf.parse("2021-01-03"); Date date2 = sdf.parse("2021-03-04"); System.out.println(date1.before(date2)); // 输出 true } catch (Exception e) { e.printStackTrace(); } } } ``` #### **Python 示例** ```python from datetime import datetime date_str1 = '2021-01-03' date_str2 = '2021-03-04' date1 = datetime.strptime(date_str1, "%Y-%m-%d") date2 = datetime.strptime(date_str2, "%Y-%m-%d") print(date1 < date2) # 输出 True ``` #### **JavaScript 示例** ```javascript const date1 = new Date('2021-01-03'); const date2 = new Date('2021-03-04'); console.log(date1 < date2); // 输出 true ``` --- ### 注意事项 1. **格式一致性**:确保字符串格式与解析格式完全匹配[^2]。 2. **异常处理**:转换时需捕获可能的格式错误(如`2021-13-32`)。 3. **时区问题**:部分语言(如JavaScript)的`Date`对象会受时区影响,建议使用UTC时间。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值