Skip to content

Commit 7147fba

Browse files
authored
Merge pull request #130 from Cinimex-Informatica/feature/issue17_shutdown_handling
ShutdownHook implemented
2 parents 9134fbe + 231eaed commit 7147fba

File tree

5 files changed

+43
-6
lines changed

5 files changed

+43
-6
lines changed

src/main/java/ru/cinimex/exporter/ExporterLauncher.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public class ExporterLauncher {
3131
private static final Logger logger = LogManager.getLogger(ExporterLauncher.class);
3232
private static final String TOPIC_STRING = "$SYS/MQ/INFO/QMGR/%s/Monitor/METADATA/CLASSES";
3333
private static final int GMO = MQConstants.MQGMO_WAIT | MQConstants.MQGMO_COMPLETE_MSG | MQConstants.MQGMO_SYNCPOINT;
34+
private static MQSubscriberManager manager;
35+
private static HTTPServer server;
3436

3537
public static void main(String[] args) {
3638
if (args.length == 0) {
@@ -39,6 +41,7 @@ public static void main(String[] args) {
3941
}
4042
Config config = new Config(args[0]);
4143

44+
createShutdownHook();
4245
ArrayList<PCFElement> elements = getAllPublishedMetrics(config);
4346
ArrayList<MQObject.MQType> monitoringTypes = new ArrayList<>();
4447
ArrayList<MQObject> objects = new ArrayList<>();
@@ -63,11 +66,11 @@ public static void main(String[] args) {
6366
}
6467

6568
MetricsManager.initMetrics(elements, monitoringTypes);
66-
MQSubscriberManager manager = new MQSubscriberManager(config);
69+
manager = new MQSubscriberManager(config);
6770
manager.runSubscribers(elements, objects, config.sendPCFCommands(), config.usePCFWildcards(),
6871
config.getScrapeInterval(), config.getConnTimeout());
6972
try {
70-
new HTTPServer(new InetSocketAddress("0.0.0.0", config.getEndpPort()), config.getEndpURL(), Registry.getRegistry(), false);
73+
server = new HTTPServer(new InetSocketAddress("0.0.0.0", config.getEndpPort()), config.getEndpURL(), Registry.getRegistry(), false);
7174
} catch (IOException e) {
7275
logger.error("Error occurred during expanding endpoint for Prometheus: ", e);
7376
}
@@ -123,6 +126,27 @@ private static ArrayList<PCFElement> getAllPublishedMetrics(Config config) {
123126
return elements;
124127
}
125128

129+
private static void createShutdownHook() {
130+
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
131+
logger.info("Exporter finishes all activities...");
132+
if (manager != null) {
133+
try {
134+
logger.debug("Stopping subscribers... (it may take some time, please, be patient)");
135+
manager.stopSubscribers();
136+
} catch (InterruptedException e) {
137+
logger.error("Error occurred during stopping subscribers: ", e);
138+
}
139+
}
140+
141+
if (server != null) {
142+
logger.debug("Stopping HTTP server...");
143+
server.stop();
144+
}
145+
logger.info("Goodbye!");
146+
LogManager.shutdown();
147+
}));
148+
}
149+
126150
private static MQMessage getEmptyMessage() {
127151
MQMessage message = new MQMessage();
128152
message.messageId = null;

src/main/java/ru/cinimex/exporter/mq/MQPCFSubscriber.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,12 @@ private void updateWithDirectPCFCommand(List<String> objectNames) {
146146
public void stopProcessing() {
147147
isRunning = false;
148148
try {
149-
agent.disconnect();
150-
connection.close();
149+
if (agent != null) {
150+
agent.disconnect();
151+
}
152+
if (connection != null) {
153+
connection.close();
154+
}
151155
} catch (MQException e) {
152156
logger.error("Error occurred during stopping PCF subscriber: ", e);
153157
}

src/main/java/ru/cinimex/exporter/mq/MQSubscriberManager.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class MQSubscriberManager {
2020
private String queueManagerName;
2121
private ArrayList<MQSubscriber> subscribers;
2222
private ScheduledExecutorService executor;
23+
private int timeout;
2324

2425
/**
2526
* Constructor sets params for connecting to target queue manager.
@@ -44,6 +45,7 @@ public MQSubscriberManager(Config config) {
4445
public void runSubscribers(List<PCFElement> elements, List<MQObject> objects, boolean sendPCFCommands, boolean usePCFWildcards, int interval, int timeout) {
4546
logger.info("Launching subscribers...");
4647
subscribers = new ArrayList<>();
48+
this.timeout = timeout;
4749
addTopicSubscribers(elements, objects, timeout);
4850
if (sendPCFCommands) {
4951
if (usePCFWildcards) {
@@ -65,13 +67,20 @@ public void runSubscribers(List<PCFElement> elements, List<MQObject> objects, bo
6567

6668
}
6769

68-
public void stopSubscribers() {
70+
/**
71+
* Stops all running subscribers in managed mode. All connections will be closed, all threads will be finished.
72+
* @throws InterruptedException
73+
*/
74+
public void stopSubscribers() throws InterruptedException {
6975
if (executor != null) {
7076
executor.shutdown();
7177
}
7278
for (MQSubscriber subscriber : subscribers) {
7379
subscriber.stopProcessing();
7480
}
81+
for (MQSubscriber subscriber : subscribers) {
82+
subscriber.join(timeout);
83+
}
7584
}
7685

7786
/**

src/main/java/ru/cinimex/exporter/mq/MQTopicSubscriber.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ public void run() {
9898
} catch (MQException e) {
9999
logger.error("Error occurred during establishing connection with topic {}", element.getTopicString(), e);
100100
} finally {
101-
System.out.println("Finishing topic work!");
102101
try {
103102
if (topic != null && topic.isOpen()) {
104103
topic.close();

src/main/resources/log4j2.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
status = warn
22
name= exporter_log_configuration
3+
shutdownHook = disable
34

45
# Give directory path where log files should get stored
56
property.basePath = ./log/

0 commit comments

Comments
 (0)