我的应用程序必须打开到服务器的tcp套接字连接,并定期收听传入消息。
在JEE 7应用程序中实现此目的的最佳实践是什么?
现在我有这样的事情:
@javax.ejb.Singleton
public class MessageChecker {
@Asynchronous
public void startChecking() {
// set up things
Socket client = new Socket(...);
[...]
// start a loop to retrieve the incoming messages
while((line = reader.readLine())!=null){
LOG.debug("Message from socket server: " + line);
}
}
}
使用@PostConstruct方法从@Startup bean调用MessageChecker.startChecking()函数。
@javax.ejb.Singleton
@Startup
public class Starter() {
@Inject
private MessageChecker checker;
@PostConstruct
public void startup() {
checker.startChecking();
}
}
您认为这是正确的做法吗? 实际上它运作不佳。应用程序服务器(JBoss 8 Wildfly)挂起,不再对关闭或重新部署命令作出反应。我觉得它会在while(...)循环中陷入困境。
干杯 弗兰克
答案 0 :(得分:6)
Frank,在EJB上下文中执行任何I / O操作都是不好的做法。这背后的原因很简单。在群集中工作时:
现在,我知道你的bean是@Singleton
,因此你的架构不依赖于事务性,集群和从该套接字读取的分布。所以你可能会对此感到满意。
但是:D,你要求的是符合java EE标准的解决方法。这是应该做的:
messaging
功能(发送消息并等待回复)。您可能正在使用同步协议来执行异步消息传递。试一试。有一些适配器,有些适合像手套,有些可能有点过度设计。