在Jersey REST Api中使用共享UDP套接字

在Jersey REST Api中使用共享UDP套接字,rest,asynchronous,concurrency,jersey-2.0,Rest,Asynchronous,Concurrency,Jersey 2.0,我正在用jersey和jetty开发一个简单的rest服务,它从客户端获取一些请求,并将准备好的请求进一步发送到另一个软件(这不是我做的)。软件发回一些必须分析的消息并发回客户端。因此,我开发了一个名为SocketReceiver的新线程,它在ist向软件发送请求后启动。该类使用一个帮助器类,该类存储到udp套接字的连接(实现为singleton)。只要我每次只有一个请求,解决方案就可以完美运行。如果发出两个请求(来自两个独立的客户端),则会出现并发问题,并且jersey不会将响应写回客户端 以

我正在用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();
}
}
  • 使用共享udp套接字的正确且线程安全的方法是什么
  • 如何解决上述问题
  • 谢谢你的帮助