/* * 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.synapse.transport.fix; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.TransportInDescription; import org.apache.axis2.transport.base.AbstractTransportListener; /** * The FIX transport listener implementation. A FIX Transport Listner will hold * a FIX session factory, which would be created at initialization * time. This implementation supports the creation of FIX sessions at runtime * as and when required. This FIX Listener registers with Axis to be notified * of service deployment/undeployment/start/stop, and enables or disables * listening for FIX messages on the destinations as appropriate. * <p/> * Service must state where the FIX configuration file is located so * that the required FIX sessions can be initialized for the service. * FIX configuration file should be a valid Quickfix/J session * configuration file. A URL to the file should be provided. * <p/> * <parameter name="transport.fix.AcceptorConfigURL"> * http://www.mycompany.org/fixconfig/file.cfg</parameter> */ public class FIXTransportListener extends AbstractTransportListener { /** * The FIXSessionFactory takes care of creating and managing all the * FIX sessions. */ private FIXSessionFactory fixSessionFactory; /** * This is the TransportListener initialization method invoked by Axis2 * * @param cfgCtx the Axis configuration context * @param trpInDesc the TransportIn description */ public void init(ConfigurationContext cfgCtx, TransportInDescription trpInDesc) throws AxisFault { super.init(cfgCtx, trpInDesc); fixSessionFactory = FIXSessionFactory.getInstance(new FIXApplicationFactory(cfgCtx)); fixSessionFactory.setListenerThreadPool(this.workerPool); log.info("FIX transport listener initialized..."); } /** * Prepare to listen for FIX messages on behalf of the given service * by first creating and starting a FIX session * * @param service the service for which to listen for messages */ public void startListeningForService(AxisService service) { try { boolean acceptorCreated = fixSessionFactory.createFIXAcceptor(service); boolean initiatorCreated = fixSessionFactory.createFIXInitiator(service); if (!acceptorCreated && !initiatorCreated) { log.warn("No acceptor or initiator has been configured for the " + "service " + service.getName() + " - Disabling the FIX transport for " + "this service"); disableTransportForService(service); } } catch (AxisFault axisFault) { disableTransportForService(service); } } /** * Stops listening for messages for the service thats undeployed or stopped * by stopping and disposing the appropriate FIX session * * @param service the service that was undeployed or stopped */ protected void stopListeningForService(AxisService service) { fixSessionFactory.disposeFIXAcceptor(service); } /** * Returns EPRs for the given service and IP over the FIX transport * * @param serviceName service name * @param ip ignored * @return the EPR for the service * @throws AxisFault */ public EndpointReference[] getEPRsForService(String serviceName, String ip) throws AxisFault { if (serviceName.indexOf('.') != -1) { serviceName = serviceName.substring(0, serviceName.indexOf('.')); } //Try to get the list of EPRs from the FIXSessionFactory String[] serviceEPRStrings = fixSessionFactory.getServiceEPRs(serviceName, ip); if (serviceEPRStrings != null) { EndpointReference[] serviceEPRs = new EndpointReference[serviceEPRStrings.length]; for (int i = 0; i < serviceEPRStrings.length; i++) { serviceEPRs[i] = new EndpointReference(serviceEPRStrings[i]); } return serviceEPRs; } throw new AxisFault("Unable to get EPRs for the service " + serviceName); } }