Singleton Bean UDP侦听器

时间:2012-02-13 20:38:16

标签: java glassfish singleton udp ejb-3.1

我对Java EE开发非常陌生,我正在尝试在GlassFish中创建UDP侦听器。这将始终需要运行。因此,我相信Singleton bean将完成这项任务。

这是问题所在。代码可以工作,但它会导致GlassFish瘫痪。尽管部署了应用程序,但GlassFish的管理页面只是挂起。我也无法访问已部署的WAR应用程序的其他元素,这使我相信存在线程问题。但是,我总是假设EJB没有线程问题。我在Eclipse中做过这个。

@Singleton
@LocalBean
public class UDPListener {
    public UDPListener() 
    { 
        DatagramSocket datagramSocket = null;
    try 
    {
        datagramSocket = new DatagramSocket(9090);
    } catch (SocketException e) { e.printStackTrace(); }    

    byte[] buffer = new byte[100];

    // Create a datagram packet.
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

    while(true)
    {
        // Receive the packet.
        try {
            datagramSocket.receive(packet);
        } catch (IOException e) { e.printStackTrace(); }

        buffer = packet.getData();          
                // Print the data:
        System.out.println(new String(buffer));
    }
    }
}

有什么我想念的吗?我一直在审查Java EE 6教程,它提到了有关并发访问的内容。但是,我不确定这是不是问题。

谢谢

编辑:为了添加更多信息,我需要创建一个始终运行,监听并响应来自UDP数据包的Bean。 如何做我以不杀死主线程的方式实例化这个bean?

1 个答案:

答案 0 :(得分:1)

来自DatagramSocket.receive()javadocs

  

此方法将一直阻塞,直到收到数据报。

通过在infinie循环(accept)内调用while(true),您正在主动等待传入数据,从而阻止您的系统。

编辑: 如果您的UDP侦听器不应阻止主线程,则必须在不同的线程中运行。只需使用您的监听代码启动一个新线程,并在主线程中执行任何必须完成的操作。像这样:

Thread t = new Thread(new Runnable() {

    @Override
    public void run() {
        DatagramSocket datagramSocket = null;
        try 
        {
            datagramSocket = new DatagramSocket(9090);
        } catch (SocketException e) { e.printStackTrace(); }    

        byte[] buffer = new byte[100];

        // Create a datagram packet.
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        while(true)
        {
            // Receive the packet.
            try {
                datagramSocket.receive(packet);
            } catch (IOException e) { e.printStackTrace(); }

            buffer = packet.getData();          
                // Print the data:
            System.out.println(new String(buffer));
        }
    }
});

t.start();

//go on with main thread