Java 单例Bean UDP侦听器
我对JavaEE开发非常陌生,我正试图在GlassFish中创建一个UDP侦听器。这将始终需要运行。因此,我相信单例bean将完成这项任务 问题就在这里。代码是有效的,但它会导致GlassFish死机。尽管部署了应用程序,GlassFish的管理页面还是挂起了。我也无法访问已部署WAR应用程序的其他元素,这使我相信存在线程问题。然而,我总是假设EJB没有线程问题。这是我在Eclipse中制作的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 {
@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应用程序容器中运行的独特流程。欢迎光临。