Java侦听器中异步处理Java消息

时间:2014-04-24 10:27:09

标签: java asynchronous ejb listener tcp-ip

我有一个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将如何提供帮助?你能展示代码样本吗?

0 个答案:

没有答案