hzxie / voj

A cross-platform online judge system based on Spring MVC framework and ActiveMQ.
https://verwandlung.org
GNU General Public License v3.0
569 stars 121 forks source link

为什么ActiveMQ的消息队列vojJudgeResultQueue有两个消费者呢? #48

Closed haitaoya closed 5 years ago

haitaoya commented 5 years ago

image 只是通过tomcat启动了一个web端 我查看了XML中activeMQ的配置,找不出原因。

hzxie commented 5 years ago

emmmmmmm。我也不太清楚,好久没做Java开发了。 是不是因为Tomcat中有好几个Connector?

haitaoya commented 5 years ago

@hzxie 嗯,那我再查查看。 虽然显示两个消费者,但是没有影响消息的正确接收。

haitaoya commented 5 years ago

我查了很久没找到原因....

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">

        <property name="connectionFactory" ref="connectionFactory" />

        <property name="destinationName" value="vojJudgeResultQueue" />

        <property name="messageListener" ref="messageReceiver" />

        <property name="concurrentConsumers" value="1"/>

        <property name="maxConcurrentConsumers" value="1"/>

 </bean>

加了maxConcurrentConsumers 不起作用。 最后activeMQ的Number Of Consumers还是2。 测试发现,Number Of Consumers的值始终是concurrentConsumers值的一倍...但是消息仍可以正常接收。 -_-#

hzxie commented 5 years ago

消息肯定可以正常接收。因为消息本来就是会发送给每一个消费者。 我总觉得是Tomcat有多个Connector。

haitaoya commented 5 years ago

嗯。好的。我再试试看。 竞赛acm模式排行榜的时间计算好像有些问题。 直接用${contestant.time / 3600} 会四舍五入。无法得到取整的结果。https://github.com/hzxie/voj/blob/5ccd8fe1a43314d9f1e305056d28b789b26e64e0/web/src/main/webapp/WEB-INF/views/contests/leaderboard-acm.jsp#L70 ${(contestant.time-contestant.time % 3600 ) / 3600} 这样应该能正常显示了