Como ignorar vários cliques de um usuário impaciente?
Tenho uma consulta para responder à solicitação padrão de clientes remotos. Padrão no sentido de que ele não usa parâmetros de fora do servidor. Sempre que alguém enviar uma solicitação para um URL, digahttp://www.example.com/query, ele obtém o conteúdo de umreply.xml
no corpo da resposta, dependendo do que o banco de dados fornece naquele momento. O conteúdo dereply.xml
muda apenas no conteúdo do banco de dados no servidor e não muda em nada externo, como quem faz a consulta, em qual entrada etc., portanto, não usa parâmetros dos clientes. Não estou verificando nenhuma autenticação - estamos deixando tudo para o firewall.
Então eu escrevi um@POST
método, digamosquery()
ser invocado em uma solicitação publicada emhttp://www.example.com/querye entregue o resultado. eu useiJersey
nele e tudo está funcionando bem com as especificações, exceto que
os pedidos devem ser exclusivos ao longo do tempo. ou seja, uma solicitação deve ser atendida por vez - os cliques subseqüentes do usuário devem receber uma mensagem com status HTTP 309, a menos que o servidor não esteja executando um processo de consulta invocado pelo meu métodoquery()
.
Como conseguir isso? Eu tentei fazerquery()
servir@PUT
ao invés de@POST
respostas e obteve os mesmos resultados.
Talvez um Q ingênuo sobre o assunto. No entanto, não está muito familiarizado com os serviços Restful.
Eu posso fazer isso segmentando um token para controlar que apenas uma consulta esteja em execução por vez e fazer solicitações simultâneas receberem o HTTP 309. No entanto, deve haver uma maneira melhor e mais fácil de conseguir isso no servidor.
Estou usando o Tomcat 8, Jersey 1.19.
TIA.
Nota: eu liPUT vs POST em REST entre algumas outras discussões úteis.
// =====================
EDITAR:
O usuário que envia a consulta não faz diferença a qualquer momento.
SuponhauserA
enviou uma consulta. enquanto essa consulta ainda estiver em execução, ou seja, antesquery()
retorna a resposta parauserA
, userB
enviou uma consulta.userB
deve estar recebendo um 309-- só porque há uma consulta sendo processada no momento.
SeuserA
= userB
ouuserA
<>userB
é irrelevante aqui, um 309 deve ser retornado apenas porque há uma solicitação de consulta enquanto uma já está em execução. e é a única vez que um usuário recebe um 309.
// ================================================
EDIT-2:
Estou ciente das soluções com controle de concorrência. Eu estou supondo que há um usando os recursos Restful. este é um Q acadêmico.