Java 单例Bean UDP侦听器

Java 单例Bean UDP侦听器,java,glassfish,singleton,udp,ejb-3.1,Java,Glassfish,Singleton,Udp,Ejb 3.1,我对JavaEE开发非常陌生,我正试图在GlassFish中创建一个UDP侦听器。这将始终需要运行。因此,我相信单例bean将完成这项任务 问题就在这里。代码是有效的,但它会导致GlassFish死机。尽管部署了应用程序,GlassFish的管理页面还是挂起了。我也无法访问已部署WAR应用程序的其他元素,这使我相信存在线程问题。然而,我总是假设EJB没有线程问题。这是我在Eclipse中制作的 @Singleton @LocalBean public class UDPListener {

我对JavaEE开发非常陌生,我正试图在GlassFish中创建一个UDP侦听器。这将始终需要运行。因此,我相信单例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));
    }
    }
}
有什么我遗漏的吗?我一直在复习JavaEE6教程,其中提到了一些关于并发访问的内容。然而,我不确定这是否是问题所在

多谢各位


编辑:为了添加更多信息,我需要创建一个Bean,它将始终运行、侦听和响应传入的UDP数据包如何以不杀死主线程的方式实例化此bean?

来自DatagramSocket.receive():

此方法会一直阻塞,直到收到数据报为止

通过在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

从DatagramSocket.receive()中:

此方法会一直阻塞,直到收到数据报为止

通过在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

这将有助于了解发送端的外观。发送端只需通过UDP发送XML字符串。它接收并显示为文本ok,但问题是在运行时无法执行其他操作。了解发送端的外观会有所帮助。发送端只需通过UDP发送XML字符串。它接收数据包并显示为文本ok,但问题是在运行时无法执行其他操作。如何在不阻塞系统的情况下侦听UDP数据包?我可以使用不执行阻塞的数据报通道,但当我等待传入消息时,它仍然停留在那里。我如何才能启动一个bean来完成这项工作,并让应用程序继续加载?我将尝试一下,让您知道结果如何。这确实可行,但这是最优的吗?我一直认为EJB能够独立完成这项工作,而无需使用线程。我基本上想要完成的是创建一个在同一个web应用程序容器中运行的独特流程。还有,不客气。我如何在不阻塞系统的情况下侦听UDP数据包?我可以使用不执行阻塞的数据报通道,但当我等待传入消息时,它仍然在那里。我如何才能启动一个bean来完成这项工作,并让应用程序继续加载?我将尝试一下,让您知道结果如何。这确实可行,但这是最优的吗?我一直认为EJB能够独立完成这项工作,而无需使用线程。我基本上想要完成的是创建一个在同一个web应用程序容器中运行的独特流程。欢迎光临。