From 92726bd4b993c518f2f208465390e90499af35a2 Mon Sep 17 00:00:00 2001 From: "Kajur, Harish (vk250x)" Date: Tue, 1 May 2018 19:55:48 -0400 Subject: Remove the client load balancer use http client Issue-ID: AAI-965 Change-Id: I68600c2a586faa5537ac58ca21b06e984413a8bc Signed-off-by: Kajur, Harish (vk250x) --- .../main/java/org/onap/aai/config/DmaapConfig.java | 12 +- .../org/onap/aai/config/EventClientPublisher.java | 95 +++++++++++++ .../onap/aai/dmaap/AAIDmaapEventJMSConsumer.java | 89 ++++-------- .../main/java/org/onap/aai/dmaap/JMSConsumer.java | 158 --------------------- .../main/java/org/onap/aai/dmaap/JMSProducer.java | 56 -------- .../org/onap/aai/util/StoreNotificationEvent.java | 36 +---- 6 files changed, 136 insertions(+), 310 deletions(-) create mode 100644 aai-core/src/main/java/org/onap/aai/config/EventClientPublisher.java delete mode 100644 aai-core/src/main/java/org/onap/aai/dmaap/JMSConsumer.java delete mode 100644 aai-core/src/main/java/org/onap/aai/dmaap/JMSProducer.java (limited to 'aai-core/src/main/java') diff --git a/aai-core/src/main/java/org/onap/aai/config/DmaapConfig.java b/aai-core/src/main/java/org/onap/aai/config/DmaapConfig.java index 29fac33a..7634b74c 100644 --- a/aai-core/src/main/java/org/onap/aai/config/DmaapConfig.java +++ b/aai-core/src/main/java/org/onap/aai/config/DmaapConfig.java @@ -22,8 +22,8 @@ package org.onap.aai.config; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.broker.BrokerService; import org.apache.activemq.command.ActiveMQQueue; -import org.onap.aai.dmaap.JMSConsumer; -import org.onap.aai.dmaap.JMSProducer; +import org.onap.aai.dmaap.AAIDmaapEventJMSConsumer; +import org.onap.aai.dmaap.AAIDmaapEventJMSProducer; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -85,13 +85,13 @@ public class DmaapConfig { } @Bean - public JMSProducer jmsProducer(){ - return new JMSProducer(); + public AAIDmaapEventJMSProducer jmsProducer(){ + return new AAIDmaapEventJMSProducer(); } @Bean - public JMSConsumer jmsConsumer() throws Exception { - return new JMSConsumer(); + public AAIDmaapEventJMSConsumer jmsConsumer() throws Exception { + return new AAIDmaapEventJMSConsumer(); } @Bean diff --git a/aai-core/src/main/java/org/onap/aai/config/EventClientPublisher.java b/aai-core/src/main/java/org/onap/aai/config/EventClientPublisher.java new file mode 100644 index 00000000..1268bf84 --- /dev/null +++ b/aai-core/src/main/java/org/onap/aai/config/EventClientPublisher.java @@ -0,0 +1,95 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ +package org.onap.aai.config; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.client.RestTemplate; + +import java.io.UnsupportedEncodingException; +import java.util.Base64; + +@Configuration +public class EventClientPublisher { + + private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(EventClientPublisher.class); + + @Value("${dmaap.ribbon.listOfServers}") + private String hosts; + + @Value("${dmaap.ribbon.username:}") + private String username; + + @Value("${dmaap.ribbon.password:}") + private String password; + + @Value("${dmaap.ribbon.topic:AAI-EVENT}") + private String topic; + + @Value("${dmaap.ribbon.batchSize:100}") + private int maxBatchSize; + + @Value("${dmaap.ribbon.maxAgeMs:250}") + private int maxAgeMs; + + @Value("${dmaap.ribbon.delayBetweenBatches:100}") + private int delayBetweenBatches; + + @Value("${dmaap.ribbon.protocol:http}") + private String protocol; + + @Value("${dmaap.ribbon.transportType:HTTPNOAUTH}") + private String tranportType; + + @Value("${dmaap.ribbon.contentType:application/json}") + private String contentType; + + @Bean + public RestTemplate dmaapRestTemplate(){ + return new RestTemplate(); + } + + @Bean + public HttpHeaders dmaapHeaders() throws UnsupportedEncodingException + { + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + + if(username != null && password != null){ + + if(!StringUtils.EMPTY.equals(username) && !StringUtils.EMPTY.equals(password)){ + + byte[] userPass = (username + ":" + password).getBytes("UTF-8"); + + httpHeaders.set("Authorization", "Basic " + Base64.getEncoder().encodeToString(userPass)); + } + } + + return httpHeaders; + } + +} diff --git a/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSConsumer.java b/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSConsumer.java index cc3afa62..5e28b3af 100644 --- a/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSConsumer.java +++ b/aai-core/src/main/java/org/onap/aai/dmaap/AAIDmaapEventJMSConsumer.java @@ -21,63 +21,53 @@ package org.onap.aai.dmaap; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.WebResource; import org.apache.log4j.MDC; import org.json.JSONException; import org.json.JSONObject; -import org.onap.aai.logging.ErrorLogHelper; -import org.onap.aai.util.AAIConstants; +import org.onap.aai.config.SpringContextAware; +import org.onap.aai.logging.LogFormatTools; import org.onap.aai.logging.LoggingContext; import org.onap.aai.logging.LoggingContext.LoggingField; import org.onap.aai.logging.LoggingContext.StatusCode; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.web.client.RestTemplate; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; -import javax.ws.rs.core.MediaType; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Properties; public class AAIDmaapEventJMSConsumer implements MessageListener { private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(AAIDmaapEventJMSConsumer.class); - private Client httpClient; + private RestTemplate restTemplate; - private Properties aaiEventProps; - private String aaiEventUrl = ""; + private HttpHeaders httpHeaders; - public AAIDmaapEventJMSConsumer() throws org.apache.commons.configuration.ConfigurationException { - super(); - try(FileReader reader = new FileReader(new File(AAIConstants.AAI_EVENT_DMAAP_PROPS))) { + private Environment environment; - if (this.httpClient == null) { - aaiEventProps = new Properties(); - aaiEventProps.load(reader); + public AAIDmaapEventJMSConsumer() { + ApplicationContext applicationContext = SpringContextAware.getApplicationContext(); - String host = aaiEventProps.getProperty("host"); - String topic = aaiEventProps.getProperty("topic"); - String protocol = aaiEventProps.getProperty("Protocol"); - - aaiEventUrl = protocol + "://" + host + "/events/" + topic; - httpClient = Client.create(); - } - - } catch (IOException e) { - ErrorLogHelper.logError("AAI_4000", "Error updating dmaap config file for aai event."); - LOGGER.error(e.getMessage(), e); + if(applicationContext != null){ + restTemplate = (RestTemplate) applicationContext.getBean("dmaapRestTemplate"); + httpHeaders = (HttpHeaders) applicationContext.getBean("dmaapHeaders"); + environment = applicationContext.getEnvironment(); } - } @Override public void onMessage(Message message) { + if(restTemplate == null){ + return; + } + String jsmMessageTxt = ""; String aaiEvent = ""; String eventName = ""; @@ -111,49 +101,28 @@ public class AAIDmaapEventJMSConsumer implements MessageListener { MDC.put(LoggingField.STATUS_CODE.toString(), StatusCode.COMPLETE.toString()); MDC.put(LoggingField.RESPONSE_CODE.toString(), "0"); LOGGER.info(eventName + "|" + aaiEvent); + HttpEntity httpEntity = new HttpEntity(aaiEvent, httpHeaders); + + String transportType = environment.getProperty("dmaap.ribbon.transportType", "http"); + String baseUrl = transportType + "://" + environment.getProperty("dmaap.ribbon.listOfServers"); + String endpoint = "/events/" + eventName; if ("AAI-EVENT".equals(eventName)) { - this.sentWithHttp(this.httpClient, this.aaiEventUrl, aaiEvent); + restTemplate.exchange(baseUrl + endpoint, HttpMethod.POST, httpEntity, String.class); } else { LoggingContext.statusCode(StatusCode.ERROR); LOGGER.error(eventName + "|Event Topic invalid."); } - } catch (java.net.SocketException e) { - if (!e.getMessage().contains("Connection reset")) { - MDC.put(LoggingField.STATUS_CODE.toString(), StatusCode.ERROR.toString()); - MDC.put(LoggingField.RESPONSE_CODE.toString(), "200"); - LOGGER.error("AAI_7304 Error reaching DMaaP to send event. " + aaiEvent, e); - } - } catch (IOException e) { - MDC.put(LoggingField.STATUS_CODE.toString(), StatusCode.ERROR.toString()); - MDC.put(LoggingField.RESPONSE_CODE.toString(), "200"); - LOGGER.error("AAI_7304 Error reaching DMaaP to send event. " + aaiEvent, e); } catch (JMSException | JSONException e) { MDC.put(LoggingField.STATUS_CODE.toString(), StatusCode.ERROR.toString()); MDC.put(LoggingField.RESPONSE_CODE.toString(), "200"); - LOGGER.error("AAI_7350 Error parsing aaievent jsm message for sending to dmaap. " + jsmMessageTxt, e); + LOGGER.error("AAI_7350 Error parsing aaievent jsm message for sending to dmaap. {} {}", jsmMessageTxt, LogFormatTools.getStackTop(e)); } catch (Exception e) { MDC.put(LoggingField.STATUS_CODE.toString(), StatusCode.ERROR.toString()); MDC.put(LoggingField.RESPONSE_CODE.toString(), "200"); - LOGGER.error("AAI_7350 Error sending message to dmaap. " + jsmMessageTxt, e); + LOGGER.error("AAI_7350 Error sending message to dmaap. {} {}" , jsmMessageTxt, LogFormatTools.getStackTop(e)); } } } - - private boolean sentWithHttp(Client client, String url, String aaiEvent) throws IOException { - - WebResource webResource = client.resource(url); - - ClientResponse response = webResource - .accept(MediaType.APPLICATION_JSON) - .type(MediaType.APPLICATION_JSON) - .post(ClientResponse.class, aaiEvent); - - if (response.getStatus() != 200) { - LOGGER.info("Failed : HTTP error code : " + response.getStatus()); - return false; - } - return true; - } } diff --git a/aai-core/src/main/java/org/onap/aai/dmaap/JMSConsumer.java b/aai-core/src/main/java/org/onap/aai/dmaap/JMSConsumer.java deleted file mode 100644 index 16092865..00000000 --- a/aai-core/src/main/java/org/onap/aai/dmaap/JMSConsumer.java +++ /dev/null @@ -1,158 +0,0 @@ -/** - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed 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. - * ============LICENSE_END========================================================= - */ -package org.onap.aai.dmaap; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; -import org.apache.log4j.MDC; -import org.json.JSONException; -import org.json.JSONObject; -import org.onap.aai.config.SpringContextAware; -import org.onap.aai.logging.LoggingContext.LoggingField; -import org.onap.aai.logging.LoggingContext.StatusCode; -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.web.client.RestTemplate; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.TextMessage; -import java.util.Base64; -import java.util.Collections; - -public class JMSConsumer implements MessageListener { - - private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(JMSConsumer.class); - - private static final int HTTPS_PORT = 3905; - private static final Base64.Encoder base64Encoder = Base64.getEncoder(); - - private HttpHeaders httpHeaders; - private RestTemplate restTemplate; - - private Environment environment; - private LoadBalancerClient loadBalancerClient; - - public JMSConsumer() throws Exception { - this((LoadBalancerClient)SpringContextAware.getApplicationContext().getBean("loadBalancerClient")); - } - - public JMSConsumer(LoadBalancerClient loadBalancerClient) throws Exception { - this.loadBalancerClient = loadBalancerClient; - this.httpHeaders = new HttpHeaders(); - this.httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); - this.environment = SpringContextAware.getApplicationContext().getEnvironment(); - - String username = this.environment.getProperty("dmaap.ribbon.username"); - String password = this.environment.getProperty("dmaap.ribbon.password"); - - if(username == null || password == null){ - throw new Exception("Unable to retrive username/password from the application properties"); - } - - String auth = String.format("%s:%s", username, password); - String authString = "Basic " + base64Encoder.encodeToString(auth.getBytes()); - httpHeaders.add("Authorization", authString); - - restTemplate = new RestTemplate(); - } - - @Override - public void onMessage(Message message) { - - String jsmMessageTxt = ""; - String aaiEvent = ""; - String eventName = ""; - - String environment = System.getProperty("lrmRO"); - if (environment == null) { - environment = ""; - } - - if (message instanceof TextMessage) { - try { - jsmMessageTxt = ((TextMessage) message).getText(); - JSONObject jo = new JSONObject(jsmMessageTxt); - - if (jo.has("aaiEventPayload")) { - aaiEvent = jo.getJSONObject("aaiEventPayload").toString(); - } else { - return; - } - if (jo.getString("transId") != null) { - MDC.put("requestId", jo.getString("transId")); - } - if (jo.getString("fromAppId") != null) { - MDC.put("partnerName", jo.getString("fromAppId")); - } - MDC.put("targetEntity", "DMAAP"); - if (jo.getString("event-topic") != null) { - eventName = jo.getString("event-topic"); - MDC.put("targetServiceName", eventName); - } - MDC.put("serviceName", "AAI"); - MDC.put(LoggingField.STATUS_CODE.toString(), StatusCode.COMPLETE.toString()); - MDC.put(LoggingField.RESPONSE_CODE.toString(), "0"); - LOGGER.info(eventName + "|" + aaiEvent); - - HttpEntity httpEntity = new HttpEntity<>(aaiEvent, httpHeaders); - ServiceInstance serviceInstance = loadBalancerClient.choose("dmaap"); - String url = serviceInstance.getHost() + ":" + serviceInstance.getPort(); - - if(serviceInstance.getPort() == HTTPS_PORT){ - url = "https://" + url; - } else { - url = "http://" + url; - } - - url += "/events/" + eventName; - - if ("AAI-EVENT".equals(eventName)) { - restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); - LOGGER.info(eventName + "|Event sent."); - } else if ("AAI-VCE-INTERFACE-DATA".equals(eventName)) { - restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); - String msg = ""; - LOGGER.info(eventName + "|Event sent. " + msg); - } else { - MDC.put(LoggingField.STATUS_CODE.toString(), StatusCode.ERROR.toString()); - MDC.put(LoggingField.RESPONSE_CODE.toString(), "900"); - LOGGER.error(eventName + "|Event Topic invalid."); - } - } catch (JMSException | JSONException e) { - MDC.put(LoggingField.STATUS_CODE.toString(), StatusCode.ERROR.toString()); - MDC.put(LoggingField.RESPONSE_CODE.toString(), "200"); - LOGGER.error("AAI_7350 Error parsing aaievent jms message for sending to dmaap. " + jsmMessageTxt, e); - } catch (Exception e) { - MDC.put(LoggingField.STATUS_CODE.toString(), StatusCode.ERROR.toString()); - MDC.put(LoggingField.RESPONSE_CODE.toString(), "200"); - LOGGER.error("AAI_7350 Error sending message to dmaap. " + jsmMessageTxt, e); - } - } - - } - -} \ No newline at end of file diff --git a/aai-core/src/main/java/org/onap/aai/dmaap/JMSProducer.java b/aai-core/src/main/java/org/onap/aai/dmaap/JMSProducer.java deleted file mode 100644 index 6ddb1411..00000000 --- a/aai-core/src/main/java/org/onap/aai/dmaap/JMSProducer.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed 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. - * ============LICENSE_END========================================================= - */ -package org.onap.aai.dmaap; - -import org.apache.activemq.ActiveMQConnectionFactory; -import org.apache.activemq.command.ActiveMQQueue; -import org.json.JSONObject; -import org.onap.aai.config.SpringContextAware; -import org.onap.aai.util.AAIConfig; -import org.springframework.context.ApplicationContext; -import org.springframework.jms.connection.CachingConnectionFactory; -import org.springframework.jms.core.JmsTemplate; - -public class JMSProducer implements MessageProducer { - - private JmsTemplate jmsTemplate; - - private ApplicationContext applicationContext; - - public JMSProducer() { - if(AAIConfig.get("aai.jms.enable", "true").equals("true")){ - applicationContext = SpringContextAware.getApplicationContext(); - if(applicationContext == null){ - this.jmsTemplate = new JmsTemplate(); - String activeMqTcpUrl = System.getProperty("activemq.tcp.url", "tcp://localhost:61547"); - this.jmsTemplate.setConnectionFactory(new CachingConnectionFactory(new ActiveMQConnectionFactory(activeMqTcpUrl))); - this.jmsTemplate.setDefaultDestination(new ActiveMQQueue("IN_QUEUE")); - } else { - jmsTemplate = (JmsTemplate) applicationContext.getBean("jmsTemplate"); - } - } - } - - public void sendMessageToDefaultDestination(JSONObject finalJson) { - if(jmsTemplate != null){ - jmsTemplate.convertAndSend(finalJson.toString()); - } - } -} diff --git a/aai-core/src/main/java/org/onap/aai/util/StoreNotificationEvent.java b/aai-core/src/main/java/org/onap/aai/util/StoreNotificationEvent.java index 375a2adc..6bde4823 100644 --- a/aai-core/src/main/java/org/onap/aai/util/StoreNotificationEvent.java +++ b/aai-core/src/main/java/org/onap/aai/util/StoreNotificationEvent.java @@ -19,31 +19,27 @@ */ package org.onap.aai.util; -import java.io.StringWriter; -import java.util.Iterator; -import java.util.UUID; - -import javax.xml.bind.Marshaller; - import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import org.eclipse.persistence.dynamic.DynamicEntity; import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext; import org.json.JSONException; import org.json.JSONObject; -import org.onap.aai.config.SpringContextAware; import org.onap.aai.dmaap.AAIDmaapEventJMSProducer; -import org.onap.aai.dmaap.JMSProducer; import org.onap.aai.dmaap.MessageProducer; import org.onap.aai.domain.notificationEvent.NotificationEvent; import org.onap.aai.exceptions.AAIException; import org.onap.aai.introspection.Introspector; import org.onap.aai.introspection.Loader; import org.onap.aai.introspection.exceptions.AAIUnknownObjectException; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.springframework.core.env.Environment; +import javax.xml.bind.Marshaller; +import java.io.StringWriter; +import java.util.Iterator; +import java.util.UUID; + public class StoreNotificationEvent { private static final EELFLogger logger = EELFManager.getInstance().getLogger(StoreNotificationEvent.class); @@ -60,27 +56,7 @@ public class StoreNotificationEvent { * Instantiates a new store notification event. */ public StoreNotificationEvent(String transactionId, String sourceOfTruth) { - this.context = SpringContextAware.getApplicationContext(); - // If the context is null then this is being invoked from - // non spring context so creating the jms producer each time - // Otherwise, get the jms producer from the spring context so - // no need to create a instance of this each time - // Also check if the environment has the dmaap profile - // TODO - Add the constants for profile so do this when adding the https two-way ssl and one way with basic auth - if(this.context == null){ - this.messageProducer = new AAIDmaapEventJMSProducer(); - } else { - env = context.getEnvironment(); - if(env.acceptsProfiles("dmaap")){ - try { - this.messageProducer = (JMSProducer)context.getBean("jmsProducer"); - } catch(NoSuchBeanDefinitionException ex){ - logger.error("Currently using the dmaap profile but still not able to find bean so check DmaapConfig", ex); - } - } else { - this.messageProducer = new AAIDmaapEventJMSProducer(); - } - } + this.messageProducer = new AAIDmaapEventJMSProducer(); this.transactionId = transactionId; this.sourceOfTruth = sourceOfTruth; } -- cgit 1.2.3-korg