/*
* 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.
*/
package org.apache.activemq.artemis.rest.queue.push;
import java.util.ArrayList;
import java.util.List;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.client.ClientConsumer;
import org.apache.activemq.artemis.api.core.client.ClientSession;
import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.jms.client.ConnectionFactoryOptions;
import org.apache.activemq.artemis.rest.ActiveMQRestLogger;
import org.apache.activemq.artemis.rest.queue.push.xml.PushRegistration;
import org.apache.activemq.artemis.utils.SelectorTranslator;
public class PushConsumer {
protected PushRegistration registration;
protected ClientSessionFactory factory;
protected List<ClientSession> sessions;
protected List<ClientConsumer> consumers;
protected String destination;
protected String id;
protected PushStrategy strategy;
protected PushStore store;
private ConnectionFactoryOptions jmsOptions;
public PushConsumer(ClientSessionFactory factory,
String destination,
String id,
PushRegistration registration,
PushStore store,
ConnectionFactoryOptions jmsOptions) {
this.factory = factory;
this.destination = destination;
this.id = id;
this.registration = registration;
this.store = store;
this.jmsOptions = jmsOptions;
}
public PushStrategy getStrategy() {
return strategy;
}
public PushRegistration getRegistration() {
return registration;
}
public String getDestination() {
return destination;
}
public void start() throws Exception {
if (registration.getTarget().getClassName() != null) {
Class clazz = Thread.currentThread().getContextClassLoader().loadClass(registration.getTarget().getClassName());
strategy = (PushStrategy) clazz.newInstance();
} else if (registration.getTarget().getRelationship() != null) {
if (registration.getTarget().getRelationship().equals("destination")) {
strategy = new ActiveMQPushStrategy();
} else if (registration.getTarget().getRelationship().equals("template")) {
strategy = new UriTemplateStrategy();
}
}
if (strategy == null) {
strategy = new UriStrategy();
}
strategy.setRegistration(registration);
strategy.setJmsOptions(jmsOptions);
strategy.start();
sessions = new ArrayList<>();
consumers = new ArrayList<>();
for (int i = 0; i < registration.getSessionCount(); i++) {
ClientSession session = factory.createSession(false, false, 0);
ClientConsumer consumer;
if (registration.getSelector() != null) {
consumer = session.createConsumer(destination, SelectorTranslator.convertToActiveMQFilterString(registration.getSelector()));
} else {
consumer = session.createConsumer(destination);
}
consumer.setMessageHandler(new PushConsumerMessageHandler(this, session));
session.start();
ActiveMQRestLogger.LOGGER.startingPushConsumer(registration.getTarget());
consumers.add(consumer);
sessions.add(session);
}
}
public void stop() {
for (ClientSession session : sessions) {
try {
if (session != null) {
session.close();
}
} catch (ActiveMQException e) {
}
}
try {
if (strategy != null) {
strategy.stop();
}
} catch (Exception e) {
}
}
public void disableFromFailure() {
registration.setEnabled(false);
try {
if (registration.isDurable()) {
store.update(registration);
}
} catch (Exception e) {
ActiveMQRestLogger.LOGGER.errorUpdatingStore(e);
}
stop();
}
}