Java 中的事件发射器
Event Emitter in Java
我目前正在将 NodeJS 项目转换为 Java。目前我被困在一个我还没有找到解决方案的问题中。
在我的 Node 项目中,我有一个与 EventEmitter(require('events')) 和 Net Sockets (require("net")) 一起使用的函数,并使用 "emit" 函数发送消息和"on" 收到。我怎样才能在 Java 中做同样的事情???
对于使用 GET 方法接收消息:
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path("/helloworld")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class HelloWorldRest {
@GET
public Response sayHello() {
return Response.ok("Hello World desde el API REST",MediaType.APPLICATION_JSON).build();
}
}
对于使用 POST 方法发送消息:
@POST
public Response createUser(User userRequest) {
userRequest.setId(users.size()+1l);
this.users.add(userRequest);
return Response.ok(userRequest).build();
}
这实际上取决于此应用程序的扩展方式。您有几个选择:
1.休息
您可以调用 REST API 来发送事件,而不是发出。
要接收,您可以托管另一方在完成事件后调用的服务。
在此方法中需要注意的一件事是错误处理。如果您的事件因为 REST API 关闭或超时而未发出,您想做什么。如果您无法将此错误传播给客户端并让他们重试...那么您将需要实施重试机制。
2。内存队列
如果这是一个单实例应用程序,您只想在处理请求时发出事件并转移到手头的下一个任务,并且没有其他实例会干扰或受此工作的影响,那么您可以选择使用 in-内存队列。您将需要一个侦听器来进行相同和类似的设置来接收您的事件。如果您希望免费提供的其他实例帮助解决其中一个事件,那么这并不是真正可扩展的。此外,如果由于任何原因此 JVM 在运行中死机,请求将进入并出错(同样适用于 #1)
3。 JMS/卡夫卡
如果这是一个大型应用程序,具有独立的进程来帮助处理不同的任务,并且这些进程必须是异步的,那么请考虑使用持久队列或像 kafka 这样的流。
所有这些方法都是可行的,但您需要查看您的场景,然后应用其中一种方法。这些中的每一个都伴随着弹性/基础设施维护方面的成本。
也许你会需要这样的:
服务器端:
import java.io.*;
public class Conex {
final int PUERTO=5000;
ServerSocket sc;
Socket so;
DataOutputStream salida;
String mensajeRecibido;
//SERVIDOR
public void initServer()
{
BufferedReader entrada;
try
{
sc = new ServerSocket(PUERTO );/* crea socket servidor que escuchara en puerto 5000*/
so=new Socket();
System.out.println("Esperando una conexión:");
so = sc.accept();</pre>
<pre class="brush:java">//Inicia el socket, ahora esta esperando una conexión por parte del cliente
System.out.println("Un cliente se ha conectado.");
//Canales de entrada y salida de datos
entrada = new BufferedReader(new InputStreamReader(so.getInputStream()));
salida = new DataOutputStream(so.getOutputStream());
System.out.println("Confirmando conexion al cliente....");
salida.writeUTF("Conexión exitosa...n envia un mensaje :D");
//Recepcion de mensaje
mensajeRecibido = entrada.readLine();
System.out.println(mensajeRecibido);
salida.writeUTF("Se recibio tu mensaje.n Terminando conexion...");
salida.writeUTF("Gracias por conectarte, adios!");
System.out.println("Cerrando conexión...");
sc.close();//Aqui se cierra la conexión con el cliente
}catch(Exception e )
{
System.out.println("Error: "+e.getMessage());
}
}
}
客户端:
import java.io.*;
public class Conex {
final String HOST = "localhost";
final int PUERTO=5000;
Socket sc;
DataOutputStream mensaje;
DataInputStream entrada;
//Cliente
public void initClient() /*ejecuta este metodo para correr el cliente */
{
try
{
sc = new Socket( HOST , PUERTO ); /*conectar a un servidor en localhost con puerto 5000*/
//creamos el flujo de datos por el que se enviara un mensaje
mensaje = new DataOutputStream(sc.getOutputStream());
//enviamos el mensaje
mensaje.writeUTF("hola que tal!!");
//cerramos la conexión
sc.close();
}catch(Exception e )
{
System.out.println("Error: "+e.getMessage());
}
}
}
我目前正在将 NodeJS 项目转换为 Java。目前我被困在一个我还没有找到解决方案的问题中。 在我的 Node 项目中,我有一个与 EventEmitter(require('events')) 和 Net Sockets (require("net")) 一起使用的函数,并使用 "emit" 函数发送消息和"on" 收到。我怎样才能在 Java 中做同样的事情???
对于使用 GET 方法接收消息:
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path("/helloworld")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class HelloWorldRest {
@GET
public Response sayHello() {
return Response.ok("Hello World desde el API REST",MediaType.APPLICATION_JSON).build();
}
}
对于使用 POST 方法发送消息:
@POST
public Response createUser(User userRequest) {
userRequest.setId(users.size()+1l);
this.users.add(userRequest);
return Response.ok(userRequest).build();
}
这实际上取决于此应用程序的扩展方式。您有几个选择:
1.休息 您可以调用 REST API 来发送事件,而不是发出。 要接收,您可以托管另一方在完成事件后调用的服务。
在此方法中需要注意的一件事是错误处理。如果您的事件因为 REST API 关闭或超时而未发出,您想做什么。如果您无法将此错误传播给客户端并让他们重试...那么您将需要实施重试机制。
2。内存队列 如果这是一个单实例应用程序,您只想在处理请求时发出事件并转移到手头的下一个任务,并且没有其他实例会干扰或受此工作的影响,那么您可以选择使用 in-内存队列。您将需要一个侦听器来进行相同和类似的设置来接收您的事件。如果您希望免费提供的其他实例帮助解决其中一个事件,那么这并不是真正可扩展的。此外,如果由于任何原因此 JVM 在运行中死机,请求将进入并出错(同样适用于 #1)
3。 JMS/卡夫卡 如果这是一个大型应用程序,具有独立的进程来帮助处理不同的任务,并且这些进程必须是异步的,那么请考虑使用持久队列或像 kafka 这样的流。
所有这些方法都是可行的,但您需要查看您的场景,然后应用其中一种方法。这些中的每一个都伴随着弹性/基础设施维护方面的成本。
也许你会需要这样的:
服务器端:
import java.io.*;
public class Conex {
final int PUERTO=5000;
ServerSocket sc;
Socket so;
DataOutputStream salida;
String mensajeRecibido;
//SERVIDOR
public void initServer()
{
BufferedReader entrada;
try
{
sc = new ServerSocket(PUERTO );/* crea socket servidor que escuchara en puerto 5000*/
so=new Socket();
System.out.println("Esperando una conexión:");
so = sc.accept();</pre>
<pre class="brush:java">//Inicia el socket, ahora esta esperando una conexión por parte del cliente
System.out.println("Un cliente se ha conectado.");
//Canales de entrada y salida de datos
entrada = new BufferedReader(new InputStreamReader(so.getInputStream()));
salida = new DataOutputStream(so.getOutputStream());
System.out.println("Confirmando conexion al cliente....");
salida.writeUTF("Conexión exitosa...n envia un mensaje :D");
//Recepcion de mensaje
mensajeRecibido = entrada.readLine();
System.out.println(mensajeRecibido);
salida.writeUTF("Se recibio tu mensaje.n Terminando conexion...");
salida.writeUTF("Gracias por conectarte, adios!");
System.out.println("Cerrando conexión...");
sc.close();//Aqui se cierra la conexión con el cliente
}catch(Exception e )
{
System.out.println("Error: "+e.getMessage());
}
}
}
客户端:
import java.io.*;
public class Conex {
final String HOST = "localhost";
final int PUERTO=5000;
Socket sc;
DataOutputStream mensaje;
DataInputStream entrada;
//Cliente
public void initClient() /*ejecuta este metodo para correr el cliente */
{
try
{
sc = new Socket( HOST , PUERTO ); /*conectar a un servidor en localhost con puerto 5000*/
//creamos el flujo de datos por el que se enviara un mensaje
mensaje = new DataOutputStream(sc.getOutputStream());
//enviamos el mensaje
mensaje.writeUTF("hola que tal!!");
//cerramos la conexión
sc.close();
}catch(Exception e )
{
System.out.println("Error: "+e.getMessage());
}
}
}