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());

}

}

}