我对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?
答案 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