Java EE 制作一个以毫秒为间隔的定时器来发送数据包
Posted
技术标签:
【中文标题】Java EE 制作一个以毫秒为间隔的定时器来发送数据包【英文标题】:Java EE Make a timer with millisecond interval to send packets 【发布时间】:2017-05-31 04:58:16 【问题描述】:Java EE 对我来说是一个庞然大物,一天前我已经问过一个非常类似的问题,但没有得到任何充分的答复。
简单地说,我想为我的 GlassFish 服务器创建一个计时器循环,它将持续向通过 websocket 连接的任何客户端发送信息包。
我希望它发送很多数据包(每隔几毫秒),因为这是为了游戏的实现。
我查看了一个使用 @Schedule
注释的建议,但该建议最多每秒一次,这对于我正在做的事情来说是非常不够的。
我在网上查看过,但我什至不知道使用什么关键字来查找我在 Java 中寻找的内容。有什么建议吗?
【问题讨论】:
您是每 x 毫秒向所有玩家发送游戏状态的快照,还是在玩家执行操作时立即发送消息。如果您发送快照,则需要一个计时器,如果您推送消息,则不需要计时器(但您可能需要额外的线程来发送消息)。为了回答您如何实现计时器,我们需要知道游戏是否分布在多个服务器上,或者您是否可以使用 Java 中的 Timer 类来触发每次推送。 【参考方案1】:您可以将TimerService 与@Timeout 注释结合使用以处理毫秒间隔。
package my.example;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Singleton;
import javax.ejb.LocalBean;
import javax.ejb.Startup;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;
@Singleton
@LocalBean
@Startup
public class IntervalTest
@Resource
private TimerService timerService;
@PostConstruct
private void init()
// Start after 1 seconds, subsequently every 50 milliseconds
timerService.createTimer(1000, 50, "IntervalTest");
@Timeout
public void execute(Timer timer)
// do something
【讨论】:
谢谢,但现在我遇到了另一个问题。我不能在我正在实例化的这个 Bean 上使用 @Startup 来发送数据包。它一直告诉我我无法实例化一个可能会遇到异常的单例,但我需要抛出异常才能将 JsonObjects 发送到我的 websocket。有什么建议吗?以上是关于Java EE 制作一个以毫秒为间隔的定时器来发送数据包的主要内容,如果未能解决你的问题,请参考以下文章