Синглтон бин UDP слушатель - PullRequest
       22

Синглтон бин UDP слушатель

1 голос
/ 14 февраля 2012

Я невероятно новичок в разработке Java EE и пытаюсь создать прослушиватель UDP в GlassFish. Это всегда должно быть запущено. Поэтому я верю, что бин Singleton выполнит эту задачу.

Вот проблема. Код работает, но он вызывает сбои 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-пакеты. Как мне создать экземпляр этого компонента таким образом, чтобы он не уничтожал основной поток?

1 Ответ

1 голос
/ 14 февраля 2012

Из DatagramSocket.receive () javadocs :

Этот метод блокируется до получения дейтаграммы.

Вызывая accept в бесконечном цикле (while(true)), вы активно ожидаете поступления данных и тем самым блокируете свою систему.

EDIT: Если ваш прослушиватель 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
...