package ch.unisg.tapas; import ch.unisg.tapas.auctionhouse.adapter.common.clients.TapasMqttClient; import ch.unisg.tapas.auctionhouse.adapter.in.messaging.mqtt.AuctionEventsMqttDispatcher; import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscovery; import ch.unisg.tapas.auctionhouse.adapter.common.clients.WebSubSubscriber; import ch.unisg.tapas.common.AuctionHouseResourceDirectory; import ch.unisg.tapas.common.ConfigProperties; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.eclipse.paho.client.mqttv3.MqttException; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.env.ConfigurableEnvironment; import java.net.URI; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * Main TAPAS Auction House application. */ @SpringBootApplication public class TapasAuctionHouseApplication { private static final Logger LOGGER = LogManager.getLogger(TapasAuctionHouseApplication.class); public static String RESOURCE_DIRECTORY = "http://localhost:3500"; public static String DEFAULT_MQTT_BROKER = "tcp://broker.hivemq.com:1883"; private static ConfigurableEnvironment ENVIRONMENT; public static void main(String[] args) { SpringApplication tapasAuctioneerApp = new SpringApplication(TapasAuctionHouseApplication.class); ENVIRONMENT = tapasAuctioneerApp.run(args).getEnvironment(); // TODO Set start up of message services with config // We will use these bootstrap methods in Week 6: bootstrapMarketplaceWithWebSub(); bootstrapMarketplaceWithMqtt(); ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); executor.scheduleAtFixedRate(crawlerRunnable, 30, 30, TimeUnit.SECONDS); } /** * Discovers auction houses and subscribes to WebSub notifications */ private static void bootstrapMarketplaceWithWebSub() { discoverAuctionHouseEndpoints(); // WebSubSubscriber subscriber = new WebSubSubscriber(); // for (String endpoint : auctionHouseEndpoints) { // subscriber.subscribeToAuctionHouseEndpoint(URI.create(endpoint)); // } } /** * Connects to an MQTT broker, presumably the one used by all TAPAS groups to communicate with * one another */ private static void bootstrapMarketplaceWithMqtt() { try { String broker = ENVIRONMENT.getProperty("mqtt.broker.uri"); LOGGER.info("Bootstrapping Mqtt"); if (broker == null) { broker = DEFAULT_MQTT_BROKER; LOGGER.info("No MQTT broker was set in application.propreties, going with default: " + DEFAULT_MQTT_BROKER); } AuctionEventsMqttDispatcher dispatcher = new AuctionEventsMqttDispatcher(); TapasMqttClient client = TapasMqttClient.getInstance(broker, dispatcher); client.startReceivingMessages(); } catch (MqttException e) { LOGGER.error(e.getMessage(), e); } } private static void discoverAuctionHouseEndpoints() { AuctionHouseResourceDirectory rd = new AuctionHouseResourceDirectory( URI.create(RESOURCE_DIRECTORY) ); AuctionHouseDiscovery.getInstance().addAuctionHouseDiscoveryInformation(rd.retrieveAuctionHouseEndpoints()); } private static Runnable crawlerRunnable = new Runnable() { public void run() { AuctionHouseResourceDirectory rd = new AuctionHouseResourceDirectory( URI.create(RESOURCE_DIRECTORY) ); AuctionHouseDiscovery.getInstance().addAuctionHouseDiscoveryInformation(rd.retrieveAuctionHouseEndpoints()); } }; }