ActiveMQ (AMQ) 단일 브 라 우 저 AJAX 다 중 페이지 클 라 이언 트 지원 (clientId)

8676 단어 JavaScriptAjax
최근 동료 들 이 AMQ 를 이용 해 정보 통신 을 하 다가 문제 가 생 겼 습 니 다.
    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;
}

좋은 웹페이지 즐겨찾기