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 制作一个以毫秒为间隔的定时器来发送数据包的主要内容,如果未能解决你的问题,请参考以下文章

qml 定时器以及几种简单动画

2个定时器之间的差异

JS 定时器

在Java android中制作间隔计时器

WIN32 定时器消息

springboot定时任务但时间间隔不同