我有一个EJB Singleton,它不断地以String形式监听消息,当消息到达时,它会处理消息,例如存储到数据库并执行其他操作。
收到消息后,在进行加班处理后,我需要非常地发送消息。 Java提供ExecuteService以异步处理消息。 EJB还通过@Asynchrnous注释提供异步处理。监听器通过每隔几秒检查一次来查看消息是否已到达。一旦发送了异步方法,回复将以InputStream的形式返回。我有两个问题:
我有示例代码:
@Startup
@Singleton
public class Processor {
@PostConstruct
public void init() {
while(true) {
Thread.sleep(1000);
if(!portIsOpen()) {
openPort();
listen();
}
else {
listen();
}
}
}
public void listen() {
// listens for messages, once the message arrives process them and then send asynchronously
Future<InputStream> inputStream = processAsynchrnously();
while(!inputStream.isDone()) {
// carry on with repeated requests
}
inputStream = inputStream.get();
// read this inputStream and turn into XML
}
@Asynchronous
public Future<InputStream> processAsynchronosly() {
// make an http connection and send the request of with the data as XML
return new AsychResult<InputStream>(httpUrlConnection.getInputStream());
}
}
以上是我想要实现的目标。但是,目的是异步发送请求而不是等待,而是继续重复接收其他请求。问题是while(!inputStream.isDone())这意味着它被阻止了。
1)如何以不同的方式实现这一点,因此不需要while循环。
2)当数据可用时输入流与XML一起返回,在EJB中是否有可以调用的侦听器,以便我将实现一个读取输入流内容的方法?我知道有Inceptors但在这种情况下Inceptor不起作用。
编辑:
请注意,该应用程序是TCIIP应用程序,因此它会侦听端口上的消息。它不是RMI-IIOP应用程序。这个Singleton充当监听器,所以当消息到达时它会处理它。
如果MDB是唯一的解决方案,MDB将如何提供帮助?你能展示代码样本吗?