有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Redis MQ在springboot程序中与JDBC存在问题

我试图在springboot程序中使用redis pub/sub作为消息队列

我做了一个Springboot测试,比如:

@Test
    void redisTest() {
        
        RedisMQBaseMessage redisMQBaseMessage = new RedisMQBaseMessage();
        redisMQBaseMessage.setType(ConstantInfo.ATD_TYPE.PUNCH_LOG);
        redisMQBaseMessage.setData(messageData);
        String json = JSONObject.toJSONString(redisMQBaseMessage);
        log.info("json:{}", json);
        stringRedisTemplate.convertAndSend(ConstantInfo.CHANNEL.ATD, json);
    }

下面是我的留言:

public void onMessage(Message message, byte[] bytes) {
        RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
        String msg = serializer.deserialize(message.getBody());
        DTO dto= new DTO();
        set function...
        log.info("The 1 message is:{}", msg);
        dataMapper.insert(DTO);
        log.info("The 2 message is:{}", msg);
    }

在侦听器中,我可以接收第一个日志信息,但插入操作会引发异常

“sql会话未注册同步,因为同步未处于活动状态”

因此,插入操作失败,我无法获取第二个日志信息。所以我尝试了JdbcTemplate而不是mybatis mapper。 它还抛出一个异常“com.mysql.jdbc.Driver Not Found”

但是,如果我在向侦听器发送消息之前在测试中添加了一个DB操作,那么插入操作 在这个过程中,听众会成功:

@Test
    void redisTest() {
        
        RedisMQBaseMessage redisMQBaseMessage = new RedisMQBaseMessage();
        redisMQBaseMessage.setType(ConstantInfo.ATD_TYPE.PUNCH_LOG);
        redisMQBaseMessage.setData(messageData);
        String json = JSONObject.toJSONString(redisMQBaseMessage);
        log.info("json:{}", json);
        dataMapper.select(sql);
        stringRedisTemplate.convertAndSend(ConstantInfo.CHANNEL.ATD, json);
    }

我的springboot版本是2.4.3

我想知道这种奇怪现象的原因是什么,我该如何解决它

谢谢


共 (0) 个答案