/* * MicroJIAC - A Lightweight Agent Framework * This file is part of MicroJIAC ActiveMQ-Broker. * * Copyright (c) 2007-2012 DAI-Labor, Technische Universität Berlin * * This library includes software developed at DAI-Labor, Technische * Universität Berlin (http://www.dai-labor.de) * * This library is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see <http://www.gnu.org/licenses/>. */ /* * $Id: ActiveMQBroker.java 23214 2009-05-06 12:18:42Z marcel $ */ package de.jiac.micro.ext.jms; import java.net.URI; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.broker.BrokerService; import org.apache.activemq.broker.TransportConnector; import org.apache.activemq.broker.jmx.ManagementContext; import org.apache.activemq.network.NetworkConnector; import org.slf4j.Logger; import de.jiac.micro.core.IHandle; import de.jiac.micro.core.INode; import de.jiac.micro.core.scope.AgentScope; import de.jiac.micro.core.scope.NodeScope; import de.jiac.micro.internal.core.AbstractNodeComponent; import de.jiac.micro.internal.core.AbstractNodeConfiguration; /** * @author Marcel Patzlaff * @version $Revision: 23214 $ */ public class ActiveMQBroker extends AbstractNodeComponent { private JMSTransportConnector[] _transportConnectors; private String[] _networkConnectors; private BrokerService _broker; private boolean _useJMX= false; private Logger _logger; private JMSLocalConnectionFactory _localConnectionFactory; public void cleanup() { _logger.debug("stop broker"); try { _broker.stop(); } catch (Exception e) { _logger.error("could not stop broker", e); } _logger.debug("cleanup broker"); _logger= null; _broker= null; _localConnectionFactory= null; } public void initialise() { INode node= NodeScope.getNodeReference(); _logger= node.getLogger("ActiveMQ"); AbstractNodeConfiguration nodeConf= (AbstractNodeConfiguration) node.getHandle(AbstractNodeConfiguration.class); String brokerName= nodeConf.id.substring(nodeConf.id.lastIndexOf('#') + 1) + node.hashCode(); brokerName= brokerName.toLowerCase(); _logger.debug("initialise broker"); _broker= new BrokerService(); _broker.setBrokerName(brokerName); _broker.setUseJmx(_useJMX); if(_useJMX) { ManagementContext context = new ManagementContext(); context.setJmxDomainName("de.jiac.micro"); context.setCreateConnector(false); _broker.setManagementContext(context); } _broker.setUseShutdownHook(false); _broker.setPersistent(false); for(int i= 0; _networkConnectors != null && i < _networkConnectors.length; ++i) { try { URI networkUri = new URI(_networkConnectors[i]); NetworkConnector networkConnector = _broker.addNetworkConnector(networkUri); networkConnector.setDuplex(true); networkConnector.setNetworkTTL(20); } catch (Exception e) { _logger.error("could not initialise broker", e); } } for(int i= 0; _transportConnectors != null && i < _transportConnectors.length; ++i) { try { TransportConnector tc= _broker.addConnector(_transportConnectors[i].transportURI); if(_transportConnectors[i].discoveryURI != null) { URI uri= new URI(_transportConnectors[i].discoveryURI); tc.setDiscoveryUri(uri); // NetworkConnector nc= new DiscoveryNetworkConnector(uri); // _broker.addNetworkConnector(nc); } } catch (Exception e) { _logger.error("could not initialise broker", e); } } _localConnectionFactory= new JMSLocalConnectionFactory(new ActiveMQConnectionFactory("vm://" + _broker.getBrokerName())); _logger.debug("start broker"); try { _broker.start(); } catch (Exception e) { _logger.error("could not start broker", e); } } public void setUseJMX(boolean val) { _useJMX= val; } public void setTransportConnectors(JMSTransportConnector[] connectors) { _transportConnectors= connectors; } public void setNetworkConnectors(String[] networkConnectors) { _networkConnectors= networkConnectors; } protected void addHandlesOn(AgentScope agent) { super.addHandlesOn(agent); agent.getContainerReference().addHandle(_localConnectionFactory); } protected void removeHandlesFrom(AgentScope agent) { IHandle factory= agent.getContainerReference().getHandle(JMSLocalConnectionFactory.class); if(factory != null) { agent.getContainerReference().removeHandle(factory); } super.removeHandlesFrom(agent); } }