All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.generallycloud.baseio.container.jms.server.AbstractProductLine Maven / Gradle / Ivy

/*
 * Copyright 2015-2017 GenerallyCloud.com
 *  
 * Licensed 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.
 */ 
package com.generallycloud.baseio.container.jms.server;

import java.util.HashMap;
import java.util.Map;

import com.generallycloud.baseio.codec.protobase.future.ProtobaseReadFuture;
import com.generallycloud.baseio.common.Logger;
import com.generallycloud.baseio.common.LoggerFactory;
import com.generallycloud.baseio.component.SocketSession;
import com.generallycloud.baseio.concurrent.AbstractEventLoop;
import com.generallycloud.baseio.container.ApplicationContextUtil;
import com.generallycloud.baseio.container.authority.Authority;
import com.generallycloud.baseio.container.jms.Message;

public abstract class AbstractProductLine extends AbstractEventLoop implements MessageQueue {

	protected MQContext					context;
	protected MessageStorage				storage;
	protected long						dueTime;
	protected Map		consumerMap;
	private Logger							logger	= LoggerFactory.getLogger(getClass());

	public AbstractProductLine(MQContext context) {

		this.context = context;

		this.storage = new MessageStorage();

		this.consumerMap = new HashMap();

		this.dueTime = context.getMessageDueTime();
	}

	// TODO 处理剩下的message 和 receiver
	@Override
	protected void doStop() {
	}

	public MQContext getContext() {
		return context;
	}

	@Override
	public void pollMessage(SocketSession session, ProtobaseReadFuture future, MQSessionAttachment attachment) {

		if (attachment.getConsumer() != null) {
			return;
		}

		Authority authority = ApplicationContextUtil.getAuthority(session);

		String queueName = authority.getUuid();

		// 来自终端类型
		context.addReceiver(queueName);

		ConsumerQueue consumerQueue = getConsumerQueue(queueName);

		Consumer consumer = new Consumer(consumerQueue, attachment, session, future, queueName);

		attachment.setConsumer(consumer);

		consumerQueue.offer(consumer);
	}

	protected ConsumerQueue getConsumerQueue(String queueName) {

		ConsumerQueue consumerQueue = consumerMap.get(queueName);

		if (consumerQueue == null) {

			synchronized (consumerMap) {

				consumerQueue = consumerMap.get(queueName);

				if (consumerQueue == null) {
					consumerQueue = createConsumerQueue();
					consumerMap.put(queueName, consumerQueue);
				}
			}
		}
		return consumerQueue;
	}

	protected abstract ConsumerQueue createConsumerQueue();

	@Override
	public void offerMessage(Message message) {

		storage.offer(message);
	}

	protected void filterUseless(Message message) {
		long now = System.currentTimeMillis();
		long dueTime = this.dueTime;

		if (now - message.getTimestamp() > dueTime) {
			// 消息过期了
			logger.debug(">>>> message invalidate : {}", message);
			return;
		}
		this.offerMessage(message);
	}

	public void setDueTime(long dueTime) {
		this.dueTime = dueTime;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy