Spring Data - Spring Boot findFirst检索两次相同的文件

时间:2017-04-05 08:39:08

标签: java spring mongodb spring-boot spring-data-mongodb

我正在使用SpringBoot和SpringData与MongoDB。

这是一个带有@RestController注释的REST服务。它调用另一个组件ChuckNorrisCommand

@Component
public class ChuckNorrisCommand extends AbstractCommand {

    /**
     * command name.
     */
    private static final String CHUCK_COMMAND_NAME = "chuck";

    /**
     * repository to retrieve data form DB.
     */
    @Autowired
    private ChuckNorrisRepository chuckNorrisRepository;
    /**
     * repository to access gif from db.
     */
    @Autowired
    private ChuckNorrisGifRepository gifRepository;

    /**
     * main method for the command.
     * @param request the request object that triggered the command
     * @return a quote
     */
    @Override
    public final ResponseToSlack executeCommand(final SlackRequest request) {
        final ChuckNorrisQuote chuckQuote = this.chuckNorrisRepository.findFirstByLastDisplayedDateIsNullOrderByRankAsc();
        chuckQuote.setLastDisplayedDate(new Date());
        this.chuckNorrisRepository.save(chuckQuote);
        final List<ChuckNorrisGif> all = this.gifRepository.findAll();
        final int randomIndex = (int)(Math.random() * (((all.size() - 1)) + 1));
        final StringBuilder out = new StringBuilder();
        out.append(chuckQuote.getQuote()).append(" <").append(all.get(randomIndex).getUrl()).append('>');

        return new ResponseToSlack(ResponseTypeEnum.IN_CHANNEL, out.toString());
    }

    /**
     * Command name.
     * @return command name.
     */
    @Override
    public final String getName() {
        return CHUCK_COMMAND_NAME;
    }

    /**
     * Command description.
     * @return command description.
     */
    @Override
    public final String getDescription() {
        return "Get a very nice Chuck Norris quote and a gif to go with it.";
    }
}

这是ChuckNorrisRepository

public interface ChuckNorrisRepository extends MongoRepository<ChuckNorrisQuote, ObjectId> {
    ChuckNorrisQuote findFirstByLastDisplayedDateIsNullOrderByRankAsc();
}

我遇到的问题是ChuckNorrisRepository。当我在本地测试时,每次调用服务都有预期的行为:我从MongoDB集合中获取一个新文档。

但是当在我的“生产”环境中部署时,需要2次调用该服务才能获得不同的文档。这是可重现的,它需要2次调用来获取新文档。

我激活了MongoDB连接器日志,我确实看到每个服务调用都执行了请求。由于文档已更新,我还能够检查集合是否已正确更新,因此对我而言,问题出在数据检索和数据呈现之间。

我注意到两个环境之间的主要区别(坦率地说,我不知道它为什么会这样)当我在计算机上启动SpringBoot可执行jar时,我最终得到一个只有一个的tomcat线程,但在生产中我有34个线程运行SpringBoot应用程序。

我真的处在一个我不知道在互联网上寻找什么以及测试什么的地方,以便更多地了解正在发生的事情。

感谢您的时间和智慧!

编辑:解决方法

我改变机制使用计数器而不是日期,现在它可以正常工作。 我可能应该把它报告给春天,因为我真的不知道发生了什么。

0 个答案:

没有答案