在Jersey REST Api中使用共享UDP套接字
我正在用jersey和jetty开发一个简单的rest服务,它从客户端获取一些请求,并将准备好的请求进一步发送到另一个软件(这不是我做的)。软件发回一些必须分析的消息并发回客户端。因此,我开发了一个名为SocketReceiver的新线程,它在ist向软件发送请求后启动。该类使用一个帮助器类,该类存储到udp套接字的连接(实现为singleton)。只要我每次只有一个请求,解决方案就可以完美运行。如果发出两个请求(来自两个独立的客户端),则会出现并发问题,并且jersey不会将响应写回客户端 以下是套接字接收器的运行方法:在Jersey REST Api中使用共享UDP套接字,rest,asynchronous,concurrency,jersey-2.0,Rest,Asynchronous,Concurrency,Jersey 2.0,我正在用jersey和jetty开发一个简单的rest服务,它从客户端获取一些请求,并将准备好的请求进一步发送到另一个软件(这不是我做的)。软件发回一些必须分析的消息并发回客户端。因此,我开发了一个名为SocketReceiver的新线程,它在ist向软件发送请求后启动。该类使用一个帮助器类,该类存储到udp套接字的连接(实现为singleton)。只要我每次只有一个请求,解决方案就可以完美运行。如果发出两个请求(来自两个独立的客户端),则会出现并发问题,并且jersey不会将响应写回客户端 以
@Override
public void run() {
byte[] message = new byte[9999];
DatagramPacket p = new DatagramPacket(message, message.length);
while (returnedObject == null) {
logger.debug("Waiting for incomming message ...");
try {
onDemandInfoServer.getDataRadioSocket().receive(p);
MessageFrame messageFrame = new MessageFrame(message);
// CHECK Length (2. and 3. byte) and CODE (first byte)
if ((message[1] == 0 && message[2] == 0) || !(message[0] == DC_Constants.D_Code
|| message[0] == DC_Constants.G_Code || message[0] == DC_Constants.P_Code)) {
logger.warn("wrong message!");
continue;
}
int length = messageFrame.getLength();
if (length > message.length) {
logger.warn("wrong message!");
continue;
}
byte[] msg = new byte[length];
System.arraycopy(message, 0, msg, 0, length);
logger.debug(LogHelper.getDataAsString(msg));
if (message[0] == DC_Constants.P_Code) {
msg = messageIsParanet(messageFrame);
}
MessageFrame msgFrame = new MessageFrame(msg);
if (!msgFrame.isAcknowledge()) {
newMessageFromDataradio(msgFrame);
}
} catch (IOException e) {
// error handling
}
}
asyncResponse.resume(returnedObject); // returned objects sets when messages being analyszed
}
下面是一个新泽西休息服务的示例:
@Path("/trips")
public class RequestTripListService extends BaseRestService {
private static final Logger logger = Logger.getLogger(RequestTripListService.class);
@POST
@Compress
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void logonToBlock(TripListRequest tripListRequest, @Suspended final AsyncResponse asyncResponse,
@Context HttpServletRequest request) throws IOException {
// Send message via udp
byte[] logonTelegramm = createLogonTelegramm(sequenceNumber);
getOnDemandInfoServer().sendToDataRadio(logonTelegramm);
// Build a new socket receiver and execute it
JourneyOnDemandInfo info = new JourneyOnDemandInfo(terminal, tripListRequest.getBlockNo(), 0, 0, sequenceNumber);
SocketReceiver<TripListUpdate> socketReceiver = new SocketReceiver<>(asyncResponse,
getOnDemandInfoServer(), getXmlCodec(), info, TripListUpdate.class);
socketReceiver.start();
}
}
@Path(“/trips”)
公共类RequestTripListService扩展了BaseRestService{
私有静态最终记录器Logger=Logger.getLogger(RequestTripListService.class);
@职位
@压缩
@使用(MediaType.APPLICATION_JSON)
@产生(MediaType.APPLICATION_JSON)
public void logonToBlock(TripListRequest TripListRequest,@Suspended final AsyncResponse AsyncResponse,
@上下文HttpServletRequest(请求)引发IOException{
//通过udp发送消息
字节[]LogonteleGram=CreateLogonteleGram(sequenceNumber);
GetOnDemandInfo服务器().sendToDataRadio(LogonteleGram);
//构建一个新的套接字接收器并执行它
JourneyOnDemandInfo info=新的JourneyOnDemandInfo(终端,tripListRequest.getBlockNo(),0,0,sequenceNumber);
SocketReceiver SocketReceiver=新的SocketReceiver(异步响应,
GetOnDemandInfo服务器()、getXmlCodec()、信息、TripListUpdate.class);
socketReceiver.start();
}
}