diff options
author | Eike Stepper | 2007-06-30 08:03:46 +0000 |
---|---|---|
committer | Eike Stepper | 2007-06-30 08:03:46 +0000 |
commit | 463b6934877e925bcf32ba7885dded61267302c3 (patch) | |
tree | a879fb1fc463c4c57592a005bd819a5c564404d7 /plugins/org.eclipse.net4j.jms.server/src/org/eclipse/net4j/jms/internal/server/ServerDestination.java | |
parent | e037a7f64ba3c9c8fdd8c377cf78b7d4a213f7cb (diff) | |
download | cdo-463b6934877e925bcf32ba7885dded61267302c3.tar.gz cdo-463b6934877e925bcf32ba7885dded61267302c3.tar.xz cdo-463b6934877e925bcf32ba7885dded61267302c3.zip |
task 1: Develop 0.8.0
Diffstat (limited to 'plugins/org.eclipse.net4j.jms.server/src/org/eclipse/net4j/jms/internal/server/ServerDestination.java')
-rw-r--r-- | plugins/org.eclipse.net4j.jms.server/src/org/eclipse/net4j/jms/internal/server/ServerDestination.java | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/plugins/org.eclipse.net4j.jms.server/src/org/eclipse/net4j/jms/internal/server/ServerDestination.java b/plugins/org.eclipse.net4j.jms.server/src/org/eclipse/net4j/jms/internal/server/ServerDestination.java new file mode 100644 index 0000000000..f14461e2b9 --- /dev/null +++ b/plugins/org.eclipse.net4j.jms.server/src/org/eclipse/net4j/jms/internal/server/ServerDestination.java @@ -0,0 +1,127 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.net4j.jms.internal.server; + +import org.eclipse.net4j.internal.jms.DestinationImpl; +import org.eclipse.net4j.internal.jms.MessageImpl; +import org.eclipse.net4j.internal.jms.QueueImpl; +import org.eclipse.net4j.internal.jms.TopicImpl; +import org.eclipse.net4j.internal.util.concurrent.RoundRobinList; +import org.eclipse.net4j.jms.server.IDestination; +import org.eclipse.net4j.jms.server.IStore; +import org.eclipse.net4j.jms.server.IStoreTransaction; + +import javax.naming.Context; +import javax.naming.NamingException; + +import java.util.Iterator; + +/** + * @author Eike Stepper + */ +public class ServerDestination implements IDestination +{ + private String name; + + private Type type; + + private RoundRobinList<ServerConsumer> consumers = new RoundRobinList(); + + public ServerDestination(String name, Type type) + { + this.name = name; + this.type = type; + } + + public String getName() + { + return name; + } + + public Type getType() + { + return type; + } + + public DestinationImpl bind(Context context, boolean rebind) throws NamingException + { + DestinationImpl destination = type == Type.QUEUE ? new QueueImpl(name) : new TopicImpl(name); + if (rebind) + { + context.rebind(name, destination); + } + else + { + context.bind(name, destination); + } + + return destination; + } + + public boolean addConsumer(ServerConsumer consumer) + { + if (consumer.isDurable()) + { + IStore store = Server.INSTANCE.getStore(); + IStoreTransaction transaction = store.startTransaction(); + transaction.consumerAdded(consumer); + store.commitTransaction(transaction); + } + + return consumers.add(consumer); + } + + public boolean removeConsumer(final long consumerID) + { + final boolean[] modified = { false }; + consumers.executeWrites(new Runnable() + { + public void run() + { + for (Iterator<ServerConsumer> it = consumers.iterator(); it.hasNext();) + { + ServerConsumer consumer = it.next(); + if (consumer.getID() == consumerID) + { + it.remove(); + modified[0] = true; + return; + } + } + } + }); + + return modified[0]; + } + + /** + * Called by worker thread of the server + */ + public void handleClientMessage(IStoreTransaction transaction, MessageImpl message) + { + if (type == Type.QUEUE) + { + ServerConsumer consumer = consumers.element(); + if (consumer != null) + { + consumer.handleClientMessage(transaction, message); + } + } + else + { + ServerConsumer[] consumers = this.consumers.toArray(new ServerConsumer[0]); + for (ServerConsumer consumer : consumers) + { + consumer.handleClientMessage(transaction, message); + } + } + } +} |