com.netcore.hsmart.smsconsumers.SmsConsumer566.java Source code

Java tutorial

Introduction

Here is the source code for com.netcore.hsmart.smsconsumers.SmsConsumer566.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
    
mvn exec:java@HSMART_SMS_CONSUMERS_1000 -Dhsmart-config-path=/home/vibhor/installs/HSMART2/config
 */
package com.netcore.hsmart.smsconsumers;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.hazelcast.core.IMap;
import com.netcore.hsmart.AppConstants;
import com.netcore.hsmart.InsecureHostnameVerifier;
import com.netcore.hsmart.InsecureTrustManager;
import com.netcore.hsmart.Utilities;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.Method;
import com.rabbitmq.client.ShutdownListener;
import com.rabbitmq.client.ShutdownSignalException;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.ws.rs.ProcessingException;
import java.util.logging.Level;

import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.logging.log4j.ThreadContext;
import org.json.JSONObject;
import org.json.XML;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.glassfish.jersey.grizzly.connector.GrizzlyConnectorProvider;

/**
 *
 * @author root
 */
public class SmsConsumer566 {

    private static final int COUNTERS = ((System.getProperty("thread-count") != null)
            ? Integer.parseInt(System.getProperty("thread-count"))
            : 1);

    public static void main(String args[]) throws Exception {

        ExecutorService executor = Executors.newCachedThreadPool();

        for (int i = 1; i <= COUNTERS; i++) {
            Runnable worker = new SmsConsumer566Runnable(Integer.toString(i));
            executor.execute(worker);
        }
    }

    /**
     * *******worker class********
     */
    public static class SmsConsumer566Runnable implements Runnable {

        private final static String GATEWAY_ID = "566";

        private final static String GATEWAY_URL = "https://ems.inobei.com:443/api/index.php";
        private final static String API_SUCCESS_CALL_STATUS_VAL = "1000";

        private Map<String, String> API_CALL_STATS = new HashMap<>();
        private Map<String, String> DATA_POSTED = new HashMap<>();

        private final String threadId;
        private final static String NULLSTR = "null";

        private final ClientConfig CLIENT_CONFIG = new ClientConfig()
                .connectorProvider(new GrizzlyConnectorProvider());
        private Client CLIENT = ClientBuilder.newClient(CLIENT_CONFIG);
        private static IMap<String, String> refIdMap = null;

        // Thread runner;
        public SmsConsumer566Runnable(String str) {
            CLIENT_CONFIG.property(ClientProperties.CONNECT_TIMEOUT, 10000);
            CLIENT_CONFIG.property(ClientProperties.READ_TIMEOUT, 10000);
            CLIENT = ClientBuilder.newClient(CLIENT_CONFIG);

            SSLContext sc;
            try {
                sc = SSLContext.getInstance("TLSv1");
                TrustManager[] trustAllCerts = { new InsecureTrustManager() };
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                System.setProperty("https.protocols", "TLSv1");// Java 8
                HostnameVerifier allHostsValid = new InsecureHostnameVerifier();
                CLIENT = ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier(allHostsValid).build();
            } catch (NoSuchAlgorithmException | KeyManagementException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            threadId = str;

        }

        /**
         * @param args
         *            the command line arguments
         * @throws java.lang.Exception
         */
        // public static void main(String[] args) throws Exception {
        @Override
        public void run() {

            ThreadContext.put("gatewayId", GATEWAY_ID);
            try {
                AppConstants.loadAppConfig();
            } catch (ConfigurationException ex) {
                java.util.logging.Logger.getLogger(this.getClass().getSimpleName()).log(Level.SEVERE, null, ex);
            }

            Logger logger = LoggerFactory.getLogger(this.getClass());
            refIdMap = AppConstants.getHazelcastClient().getMap(GATEWAY_ID + "_REF_ID_MAP");

            try {

                // Connection connection =
                // AppConstants.getRabbitMqObject().newConnection();

                AppConstants.getRabbitMqConnection().addShutdownListener(new ShutdownListener() {
                    @Override
                    public void shutdownCompleted(ShutdownSignalException cause) {
                        // throw new UnsupportedOperationException("Not
                        // supported yet.");
                        if (cause.isHardError()) {
                            Connection conn;
                            conn = (Connection) cause.getReference();
                            if (!cause.isInitiatedByApplication()) {
                                Method reason = cause.getReason();
                                logger.info("REASON:" + reason.toString());
                            }

                        } else {
                            Channel ch = (Channel) cause.getReference();
                            logger.info("NO HARDSHUTDOWN");
                        }
                    }
                });

                Channel channel = AppConstants.getRabbitMqConnection().createChannel();

                channel.exchangeDeclare(AppConstants.getSmsReceiverExchangeName(), "direct");
                channel.queueDeclare(AppConstants.getSmsReceiverQueuePrefix() + GATEWAY_ID, true, false, false,
                        null);
                channel.queueBind(AppConstants.getSmsReceiverQueuePrefix() + GATEWAY_ID,
                        AppConstants.getSmsReceiverExchangeName(), GATEWAY_ID);
                channel.basicQos(1000);
                // channel.addShutdownListener(listener);
                logger.info(" [*] Waiting for messages from gateway " + GATEWAY_ID + ". To exit press CTRL+C");

                Consumer consumer;

                consumer = new DefaultConsumer(channel) {

                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope,
                            AMQP.BasicProperties properties, byte[] body) throws IOException {

                        ThreadContext.put("gatewayId", GATEWAY_ID);

                        String payload = new String(body, "UTF-8");

                        String payloadParts[] = payload.split(AppConstants.getPayloadGroupSeparator());

                        for (String payloadPart : payloadParts) {
                            String s[] = payloadPart.split(AppConstants.getPayloadKVSeparator());
                            DATA_POSTED.put(s[0], s[1]);
                        }
                        logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|START+++++++++++++++");
                        logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|PAYLOAD:" + payload);

                        long deliveryTag = envelope.getDeliveryTag();

                        if (invokeApiCall()) {
                            if (saveRequestData()) {
                                channel.basicAck(deliveryTag, false);
                            } else {
                                channel.basicNack(deliveryTag, false, true);
                            }

                        } else {
                            channel.basicNack(deliveryTag, false, true);
                        }

                        /**
                         * release memory
                         */
                        logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|END-----------------");
                        API_CALL_STATS.clear();
                        DATA_POSTED.clear();
                        payloadParts = null;

                    }
                };

                String cTag = channel.basicConsume(AppConstants.getSmsReceiverQueuePrefix() + GATEWAY_ID, false,
                        consumer);
                logger.info("CONSUMER TAG : " + cTag);

            } catch (IOException e) {
                logger.error("RMQ_ERROR:" + e.getMessage());
            }
        }

        private boolean invokeApiCall() {
            ThreadContext.put("gatewayId", GATEWAY_ID);

            Logger logger = LoggerFactory.getLogger(this.getClass());

            try {

                WebTarget webTarget = CLIENT.target(GATEWAY_URL + "?t=1");

                String payload = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:tns=\"urn:ems\"><SOAP-ENV:Body><SendSMS xmlns=\"\"><username xmlns=\"\">netcore.smarttech</username><password xmlns=\"\">8y23oklhdlf92s</password><source xmlns=\"\">"
                        + DATA_POSTED.get("sender_id") + "</source><destination xmlns=\"\">"
                        + DATA_POSTED.get("msisdn") + "</destination><message xmlns=\"\">"
                        + DATA_POSTED.get("message") + "</message></SendSMS></SOAP-ENV:Body></SOAP-ENV:Envelope>";

                InputStream iStream = new ByteArrayInputStream(payload.getBytes(StandardCharsets.UTF_8.name()));

                URI u = webTarget.getUri();

                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|URI:" + u.toString() + payload + "|LENGTH:"
                        + u.getQuery().length());

                Invocation.Builder invocationBuilder = webTarget.request(MediaType.TEXT_XML);

                invocationBuilder.header("Content-type", "text/xml");
                invocationBuilder.header("Content-length", payload.length());
                invocationBuilder.header("Connection", "Close");

                long startTime = System.currentTimeMillis();

                Response response = invocationBuilder.post(Entity.entity(iStream, MediaType.TEXT_XML));

                long elapsedTime = System.currentTimeMillis() - startTime;
                String responseText = response.readEntity(String.class);
                Integer responseStatus = response.getStatus();

                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|LATENCY:" + elapsedTime + "ms");

                API_CALL_STATS.put("ref_id", DATA_POSTED.get("ref_id"));
                API_CALL_STATS.put("gateway_id", DATA_POSTED.get("gateway_id"));
                API_CALL_STATS.put("uri", u.toString() + payload);
                API_CALL_STATS.put("latency", String.valueOf(elapsedTime));

                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|HTTP_STATUS:" + responseStatus);
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|RESPONSE_TEXT:" + responseText);

                API_CALL_STATS.put("http_status", responseStatus.toString());
                API_CALL_STATS.put("response_text", responseText);

                response.close();
                // CLIENT.close();

                return parseVendorApiResponse(responseStatus, responseText);

            } catch (ProcessingException e) {
                logger.error("REF_ID: " + DATA_POSTED.get("ref_id") + "|VENDOR_API_CALL_ERROR:" + e.getMessage()
                        + Arrays.toString(e.getStackTrace()));
                return false;

            } catch (Exception ex) {
                logger.error("REF_ID: " + DATA_POSTED.get("ref_id") + "|INVOKE_FUN_ERROR: " + ex.getMessage()
                        + Arrays.toString(ex.getStackTrace()));

                return false;
            }

        }

        private boolean parseVendorApiResponse(Integer responseStatus, String responseText) {
            ThreadContext.put("gatewayId", GATEWAY_ID);

            Logger logger = LoggerFactory.getLogger(this.getClass());

            JSONObject jsonObj = XML.toJSONObject(responseText.trim());

            JSONObject envObj = jsonObj.getJSONObject("SOAP-ENV:Envelope");
            JSONObject bodyObj = envObj.getJSONObject("SOAP-ENV:Body");
            JSONObject responseObj = bodyObj.getJSONObject("SendSMSResponse");

            Integer code = responseObj.getInt("code");

            if (API_SUCCESS_CALL_STATUS_VAL.equals(code.toString())) {

                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|API_CALL_STATUS:" + code);
                API_CALL_STATS.put("api_call_status", code.toString());

                Integer msgId = responseObj.getInt("messageId");
                Double price = responseObj.getDouble("price");
                Integer balance = responseObj.getInt("balance");

                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|MSG_ID:" + msgId);
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|PRICE:" + price);
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|BALANCE:" + balance);
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|MSG_COUNT:" + NULLSTR);
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|API_CALL_ERROR_TEXT:" + NULLSTR);

                API_CALL_STATS.put("msg_id", msgId.toString());
                API_CALL_STATS.put("price", price.toString());
                API_CALL_STATS.put("balance", balance.toString());
                API_CALL_STATS.put("msg_count", NULLSTR);
                API_CALL_STATS.put("api_call_error_text", NULLSTR);

                refIdMap.put(msgId.toString(), DATA_POSTED.get("ref_id"));

                forwardToDlrPullServiceQueue();

            } else {

                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|API_CALL_FAILED");
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|API_CALL_ERROR_TEXT:" + code + "_"
                        + responseObj.getString("codeMessage"));
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|MSG_ID:" + NULLSTR);
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|API_CALL_STATUS:" + code);
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|MSG_COUNT:" + NULLSTR);
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|PRICE:" + NULLSTR);
                logger.info("REF_ID:" + DATA_POSTED.get("ref_id") + "|BALANCE:" + NULLSTR);

                API_CALL_STATS.put("msg_count", NULLSTR);
                API_CALL_STATS.put("api_call_status", code.toString());
                API_CALL_STATS.put("price", NULLSTR);
                API_CALL_STATS.put("balance", NULLSTR);
                API_CALL_STATS.put("api_call_error_text", code + "_" + responseObj.getString("codeMessage"));
                API_CALL_STATS.put("msg_id", NULLSTR);

                callDlrApi();
            }

            return true;

        }

        private void callDlrApi() {
            ThreadContext.put("gatewayId", GATEWAY_ID);
            Logger logger = LoggerFactory.getLogger(this.getClass());

            Map<String, String> INSTANT_DLR_STATS = new HashMap<>();
            logger.info("REF_ID:" + API_CALL_STATS.get("ref_id") + "|SENDING_INSTANT_DLR");

            INSTANT_DLR_STATS.put("status", API_CALL_STATS.get("api_call_status"));
            INSTANT_DLR_STATS.put("gateway_id", GATEWAY_ID);
            INSTANT_DLR_STATS.put("ref_id", API_CALL_STATS.get("ref_id"));
            INSTANT_DLR_STATS.put("error_code", API_CALL_STATS.get("api_call_status"));
            INSTANT_DLR_STATS.put("dlr_type", "API");
            INSTANT_DLR_STATS.put("delivery_time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

            try {
                JSONObject jobj = new JSONObject(INSTANT_DLR_STATS);
                String g = Utilities.encrypt(jobj.toString());

                Channel channel = AppConstants.getRabbitMqConnection().createChannel();

                channel.exchangeDeclare(AppConstants.getDlrReceiverExchangeName(), "direct");
                channel.queueDeclare(AppConstants.getDlrReceiverQueuePrefix() + GATEWAY_ID, true, false, false,
                        null);
                channel.queueBind(AppConstants.getDlrReceiverQueuePrefix() + GATEWAY_ID,
                        AppConstants.getDlrReceiverExchangeName(), GATEWAY_ID);
                channel.basicPublish(AppConstants.getDlrReceiverExchangeName(), GATEWAY_ID, null, g.getBytes());
                channel.close();
                logger.info("REF_ID:" + API_CALL_STATS.get("ref_id") + "|INSTANT_DLR_DATA:" + g);
                g = null;
            } catch (Exception ex) {
                logger.info("REF_ID:" + API_CALL_STATS.get("ref_id") + "|ERROR_PUBLISHING_INSTANT_DLR_DATA:"
                        + ex.getMessage());
            }

        }

        private boolean saveRequestData() {
            ThreadContext.put("gatewayId", GATEWAY_ID);
            Logger logger = LoggerFactory.getLogger(this.getClass());

            try {
                JSONObject jobj = new JSONObject(API_CALL_STATS);
                String g = Utilities.encrypt(jobj.toString());

                Channel channel = AppConstants.getRabbitMqConnection().createChannel();

                channel.exchangeDeclare(AppConstants.getSmsDataExchangeName(), "direct");
                channel.queueDeclare(AppConstants.getSmsDataQueuePrefix() + GATEWAY_ID, true, false, false, null);
                channel.queueBind(AppConstants.getSmsDataQueuePrefix() + GATEWAY_ID,
                        AppConstants.getSmsDataExchangeName(), GATEWAY_ID);
                channel.basicPublish(AppConstants.getSmsDataExchangeName(), GATEWAY_ID, null, g.getBytes());
                channel.close();
                logger.info("REF_ID:" + API_CALL_STATS.get("ref_id") + "|DB_DATA:" + g);
                g = null;
            } catch (Exception ex) {
                logger.info(
                        "REF_ID:" + API_CALL_STATS.get("ref_id") + "|ERROR_PUBLISHING_SMS_DATA:" + ex.getMessage());
            }

            return true;

        }

        private void forwardToDlrPullServiceQueue() {
            ThreadContext.put("gatewayId", GATEWAY_ID);
            Logger logger = LoggerFactory.getLogger(this.getClass());
            logger.info("REF_ID:" + API_CALL_STATS.get("ref_id") + "|PUBLISHING_IN_DLRPULLSERVICE");
            try {

                // in case this grows in future
                Map<String, String> temp = new HashMap<>();
                temp.put("ref_id", API_CALL_STATS.get("ref_id"));
                temp.put("pull_id", API_CALL_STATS.get("msg_id"));

                JSONObject jobj = new JSONObject(temp);
                String g = Utilities.encrypt(jobj.toString());

                Channel channel = AppConstants.getRabbitMqConnection().createChannel();

                channel.exchangeDeclare(AppConstants.getDlrPullServiceExchangeName(), "direct");
                channel.queueDeclare(AppConstants.getDlrPullServiceQueuePrefix() + GATEWAY_ID, true, false, false,
                        null);
                channel.queueBind(AppConstants.getDlrPullServiceQueuePrefix() + GATEWAY_ID,
                        AppConstants.getDlrPullServiceExchangeName(), GATEWAY_ID);
                channel.basicPublish(AppConstants.getDlrPullServiceExchangeName(), GATEWAY_ID, null, g.getBytes());
                channel.close();
                logger.info("REF_ID:" + API_CALL_STATS.get("ref_id") + "|DLRPULLSERVICE_DATA:" + g);
                g = null;
            } catch (Exception ex) {
                logger.info("REF_ID:" + API_CALL_STATS.get("ref_id") + "|ERROR_PUBLISHING_DLRPULLSERVICE_DATA:"
                        + ex.getMessage());
            }

        }
    }
}