ActiveMQ (AMQ) 단일 브 라 우 저 AJAX 다 중 페이지 클 라 이언 트 지원 (clientId)
8676 단어 JavaScriptAjax
IE8 의 여러 페이지 에서 AMQ 의 한 테마 구독 을 방문 할 때 여러 페이지 에서 얻 은 메 시 지 는 같은 테마 큐 에서 나 와 페이지 상태 논리 적 오 류 를 초래 합 니 다.
AMQ 의 공식 문 서 를 찾 아 보면 5.4.2 이후 버 전에 서 AMQ 의 AJAX 클 라 이언 트 는 유일한 clientId 를 지정 하여 여러 페이지 가 한 브 라 우 저 에서 같은 구독 의 다른 대기 열 에 접근 할 수 있 도록 함으로써 이전 버 전에 서 JSESSIONID 로 인 한 사용자 측 에서 구분 할 수 없 는 문 제 를 피 할 수 있 습 니 다. 공식 문 서 는 다음 과 같 습 니 다.
http://activemq.apache.org/ajax.html 그러나 이 안에서 실 현 된 amq. js 는 변경 이 너무 커서 이전의 인터페이스 와 호 환 할 수 없 기 때문에 공식 메 인 소스 코드 에 통합 되 지 않 고 demo 형식 으로 추가 로 저장 되 었 으 나 상기 기능 을 실현 한 백 엔 드 코드 는 5.4.2 이후 메 인 소스 코드 에 의 해 합병 되 었 다.
따라서 최신 버 전의 AMQ 만 사용 하면 이 AJAX 다 중 클 라 이언 트 의 기능 을 얻 을 수 없 으 므 로 스스로 추가 로 조정 해 야 합 니 다.
오늘 오전 에 이 문 제 를 해결 하고 약간 수정 하 였 습 니 다amq. js 파일 은 원 인터페이스 와 의 일치 성 을 확보 하고 initClient Id 방법 을 추가 하여 AMQ 의 AJAX 다 중 클 라 이언 트 기능 을 편리 하 게 사용 할 수 있 습 니 다.
사용 시 이 를amq. js 대체 원 activemq웹 - x. x. x. jar 의 파일 을 호출 하 는 동시에 페이지 에서 최초 uri 할당 을 진행 할 때 amq. initClient Id () 를 호출 합 니 다.이 기능 을 켤 수 있 습 니 다.
방금 코드 테스트 를 실 시 했 는데 초보 적 으로 통과 되 었 고 기능 의 정확성 이 초보 적 으로 검증 되 었 다.
만약 학우 가 같은 문제 에 부 딪 혔 다 면, 테스트 조정 을 도와 줄 수 있 기 를 바 랍 니 다.
문장 은 본인 이 창작 한 것 입 니 다. 전재 할 때 출처 와 작 가 를 밝 혀 주 십시오. 본 고 는 원래 의 주소 http://h-rain.iteye.com/blog/1387640 에 있 습 니 다.
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// AMQ Ajax handler
// This class provides the main API for using the Ajax features of AMQ. It
// allows JMS messages to be sent and received from javascript when used
// with the org.apache.activemq.web.MessageListenerServlet
//
var amq =
{
// The URI of the MessageListenerServlet
uri: '/amq',
// Polling. Set to true (default) if waiting poll for messages is needed
poll: true,
// Poll delay. if set to positive integer, this is the time to wait in ms before
// sending the next poll after the last completes.
_pollDelay: 0,
_clientIdStr:'',
_first: true,
_pollEvent: function(first) {},
_handlers: new Array(),
_messages:0,
_messageQueue: '',
_queueMessages: 0,
//init the clientId,default auto make as Date string
initClientId:function(newId)
{
if (newId)
amq._clientIdStr="clientId="+newId;
else
amq._clientIdStr="clientId="+(new Date()).getTime().toString();
},
//using clientId,whit separtor
_makeClientIdStr:function(spChar)
{
var SC=spChar||'';
if (amq._clientIdStr=='')
return '';
return SC+amq._clientIdStr;
},
_messageHandler: function(request)
{
try
{
if (request.status == 200)
{
var response = request.responseXML.getElementsByTagName("ajax-response");
if (response != null && response.length == 1)
{
for ( var i = 0 ; i < response[0].childNodes.length ; i++ )
{
var responseElement = response[0].childNodes[i];
// only process nodes of type element.....
if ( responseElement.nodeType != 1 )
continue;
var id = responseElement.getAttribute('id');
var handler = amq._handlers[id];
if (handler!=null)
{
for (var j = 0; j < responseElement.childNodes.length; j++)
{
handler(responseElement.childNodes[j]);
}
}
}
}
}
}
catch(e)
{
alert(e);
}
},
startBatch: function()
{
amq._queueMessages++;
},
endBatch: function()
{
amq._queueMessages--;
if (amq._queueMessages==0 && amq._messages>0)
{
var body = amq._messageQueue;
amq._messageQueue='';
amq._messages=0;
amq._queueMessages++;
new Ajax.Request(amq.uri, { method: 'post', postBody: body+amq._makeClientIdStr('&'), onSuccess: amq.endBatch});
}
},
_pollHandler: function(request)
{
amq.startBatch();
try
{
amq._messageHandler(request);
amq._pollEvent(amq._first);
amq._first=false;
}
catch(e)
{
alert(e);
}
amq.endBatch();
if (amq._pollDelay>0)
setTimeout('amq._sendPoll()',amq._pollDelay);
else
amq._sendPoll();
},
_sendPoll: function(request)
{
new Ajax.Request(amq.uri, { method: 'get', parameters: amq._makeClientIdStr(),onSuccess: amq._pollHandler });
},
// Add a function that gets called on every poll response, after all received
// messages have been handled. The poll handler is past a boolean that indicates
// if this is the first poll for the page.
addPollHandler : function(func)
{
var old = amq._pollEvent;
amq._pollEvent = function(first)
{
old(first);
func(first);
}
},
// Send a JMS message to a destination (eg topic://MY.TOPIC). Message should be xml or encoded
// xml content.
sendMessage : function(destination,message)
{
amq._sendMessage(destination,message,'send');
},
// Listen on a channel or topic. handler must be a function taking a message arguement
addListener : function(id,destination,handler)
{
amq._handlers[id]=handler;
amq._sendMessage(destination,id,'listen');
},
// remove Listener from channel or topic.
removeListener : function(id,destination)
{
amq._handlers[id]=null;
amq._sendMessage(destination,id,'unlisten');
},
_sendMessage : function(destination,message,type)
{
if (amq._queueMessages>0)
{
if (amq._messages==0)
{
amq._messageQueue='destination='+destination+'&message='+message+'&type='+type;
}
else
{
amq._messageQueue+='&d'+amq._messages+'='+destination+'&m'+amq._messages+'='+message+'&t'+amq._messages+'='+type;
}
amq._messages++;
}
else
{
amq.startBatch();
new Ajax.Request(amq.uri, { method: 'post', postBody: 'destination='+destination+'&message='+message+'&type='+type+amq._makeClientIdStr('&'), onSuccess: amq.endBatch});
}
},
_startPolling : function()
{
if (amq.poll)
new Ajax.Request(amq.uri, { method: 'get', parameters: 'timeout=10'+amq._makeClientIdStr('&'), onSuccess: amq._pollHandler });
}
};
Behaviour.addLoadEvent(amq._startPolling);
function getKeyCode(ev)
{
var keyc;
if (window.event)
keyc=window.event.keyCode;
else
keyc=ev.keyCode;
return keyc;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.