summaryrefslogtreecommitdiffstats
path: root/vespaclient-core/src/main/java/com/yahoo/feedapi/FeedContext.java
diff options
context:
space:
mode:
Diffstat (limited to 'vespaclient-core/src/main/java/com/yahoo/feedapi/FeedContext.java')
-rwxr-xr-xvespaclient-core/src/main/java/com/yahoo/feedapi/FeedContext.java111
1 files changed, 111 insertions, 0 deletions
diff --git a/vespaclient-core/src/main/java/com/yahoo/feedapi/FeedContext.java b/vespaclient-core/src/main/java/com/yahoo/feedapi/FeedContext.java
new file mode 100755
index 00000000000..a26064cd98b
--- /dev/null
+++ b/vespaclient-core/src/main/java/com/yahoo/feedapi/FeedContext.java
@@ -0,0 +1,111 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.feedapi;
+
+import com.yahoo.jdisc.Metric;
+import com.yahoo.vespa.config.content.LoadTypeConfig;
+import com.yahoo.document.DocumentTypeManager;
+import com.yahoo.clientmetrics.ClientMetrics;
+import com.yahoo.vespaclient.ClusterList;
+import com.yahoo.vespaclient.config.FeederConfig;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+public class FeedContext {
+
+ private final SessionFactory factory;
+ private final MessagePropertyProcessor propertyProcessor;
+ private final DocumentTypeManager docTypeManager;
+ private final ClusterList clusterList;
+ private final ClientMetrics metrics;
+ private final Metric metric;
+ private Map<String, SharedSender> senders = new TreeMap<>();
+
+ public static final Object sync = new Object();
+ public static FeedContext instance = null;
+
+ public FeedContext(MessagePropertyProcessor propertyProcessor, SessionFactory factory, DocumentTypeManager manager, ClusterList clusterList, Metric metric) {
+ this.propertyProcessor = propertyProcessor;
+ this.factory = factory;
+ docTypeManager = manager;
+ this.clusterList = clusterList;
+ metrics = new ClientMetrics();
+ this.metric = metric;
+ }
+
+ public ClientMetrics getMetrics() {
+ return metrics;
+ }
+
+ public ClusterList getClusterList() {
+ return clusterList;
+ }
+
+ public SessionFactory getSessionFactory() {
+ return factory;
+ }
+
+ public void shutdownSenders() {
+ for (SharedSender s : senders.values()) {
+ s.shutdown();
+ }
+ }
+
+ public synchronized SharedSender getSharedSender(String route) {
+ if (propertyProcessor.configChanged()) {
+ Map<String, SharedSender> newSenders = new TreeMap<>();
+
+ for (Map.Entry<String, SharedSender> sender : senders.entrySet()) {
+ newSenders.put(sender.getKey(), new SharedSender(sender.getKey(), factory, sender.getValue(), metric));
+ }
+
+ shutdownSenders();
+ senders = newSenders;
+ propertyProcessor.setConfigChanged(false);
+ }
+
+ if (route == null) {
+ route = propertyProcessor.getFeederOptions().getRoute();
+ }
+
+ SharedSender sender = senders.get(route);
+
+ if (sender == null) {
+ sender = new SharedSender(route, factory, sender, metric);
+ senders.put(route, sender);
+ metrics.addRouteMetricSet(sender.getMetrics());
+ }
+
+ return sender;
+ }
+
+ public MessagePropertyProcessor getPropertyProcessor() {
+ return propertyProcessor;
+ }
+
+ public DocumentTypeManager getDocumentTypeManager() {
+ return docTypeManager;
+ }
+
+ public static FeedContext getInstance(FeederConfig feederConfig, LoadTypeConfig loadTypeConfig, Metric metric) {
+ synchronized (sync) {
+ try {
+ if (instance == null) {
+ MessagePropertyProcessor proc = new MessagePropertyProcessor(feederConfig, loadTypeConfig);
+ MessageBusSessionFactory mbusFactory = new MessageBusSessionFactory(proc);
+ instance = new FeedContext(proc,
+ mbusFactory,
+ mbusFactory.getAccess().getDocumentTypeManager(),
+ new ClusterList("client"), metric);
+ } else {
+ instance.getPropertyProcessor().configure(feederConfig, loadTypeConfig);
+ }
+
+ return instance;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+}