mirror of
https://github.com/apache/nifi.git
synced 2025-03-03 16:09:19 +00:00
NIFI-4864 - Additional improvements to additonal resource loading
This closes #2470. Signed-off-by: Bryan Bende <bbende@apache.org>
This commit is contained in:
parent
fad152f389
commit
9b098f3235
@ -139,26 +139,24 @@ public class ClassLoaderUtils {
|
||||
}
|
||||
|
||||
public static String generateAdditionalUrlsFingerprint(Set<URL> urls) {
|
||||
MessageDigest md;
|
||||
List<String> listOfUrls = urls.stream().map(Object::toString).collect(Collectors.toList());
|
||||
byte[] bytesOfAdditionalUrls, bytesOfDigest;
|
||||
StringBuffer urlBuffer = new StringBuffer();
|
||||
|
||||
//Sorting so that the order is maintained for generating the fingerprint
|
||||
Collections.sort(listOfUrls);
|
||||
try {
|
||||
md = MessageDigest.getInstance("MD5");
|
||||
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||
listOfUrls.forEach(url -> {
|
||||
urlBuffer.append(url).append("-").append(getLastModified(url)).append(";");
|
||||
});
|
||||
bytesOfAdditionalUrls = urlBuffer.toString().getBytes("UTF-8");
|
||||
bytesOfDigest = md.digest(bytesOfAdditionalUrls);
|
||||
byte[] bytesOfAdditionalUrls = urlBuffer.toString().getBytes("UTF-8");
|
||||
byte[] bytesOfDigest = md.digest(bytesOfAdditionalUrls);
|
||||
|
||||
return DatatypeConverter.printHexBinary(bytesOfDigest);
|
||||
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
|
||||
LOGGER.error("Unable to generate fingerprint for the provided additional resources {}", new Object[]{urls, e});
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static long getLastModified(String url) {
|
||||
@ -166,7 +164,7 @@ public class ClassLoaderUtils {
|
||||
try {
|
||||
file = new File(new URI(url));
|
||||
} catch (URISyntaxException e) {
|
||||
e.printStackTrace();
|
||||
LOGGER.error("Error getting last modified date for " + url);
|
||||
}
|
||||
return file != null ? file.lastModified() : 0;
|
||||
}
|
||||
|
@ -179,6 +179,8 @@ public abstract class AbstractConfiguredComponent implements ConfigurableCompone
|
||||
|
||||
// if at least one property with dynamicallyModifiesClasspath(true) was set, then reload the component with the new urls
|
||||
if (classpathChanged) {
|
||||
logger.info("Updating classpath for " + this.componentType + " with the ID " + this.getIdentifier());
|
||||
|
||||
final Set<URL> additionalUrls = getAdditionalClasspathResources(getComponent().getPropertyDescriptors());
|
||||
try {
|
||||
reload(additionalUrls);
|
||||
@ -303,24 +305,19 @@ public abstract class AbstractConfiguredComponent implements ConfigurableCompone
|
||||
* fingerprint value. If the fingerprint values don't match, the function calls the
|
||||
* component's reload() to load the newly found resources.
|
||||
*/
|
||||
public void reloadAdditionalResourcesIfNecessary(){
|
||||
String oldFingerprint, newFingerprint;
|
||||
|
||||
@Override
|
||||
public synchronized void reloadAdditionalResourcesIfNecessary() {
|
||||
final List<PropertyDescriptor> descriptors = new ArrayList<>(this.getProperties().keySet());
|
||||
final Set<URL> additionalUrls = this.getAdditionalClasspathResources(descriptors);
|
||||
|
||||
newFingerprint = ClassLoaderUtils.generateAdditionalUrlsFingerprint(additionalUrls);
|
||||
|
||||
if(this.hasAdditionalResourcesFingerprint()){
|
||||
oldFingerprint = this.getAdditionalResourcesFingerprint();
|
||||
if(!oldFingerprint.equals(newFingerprint)) {
|
||||
this.setAdditionalResourcesFingerprint(newFingerprint);
|
||||
try {
|
||||
logger.info("Adding new resources found to classpath for the component"+ this.componentType +" with the ID "+this.getIdentifier());
|
||||
reload(additionalUrls);
|
||||
} catch (Exception e) {
|
||||
logger.error("Error reloading component with id " + id + ": " + e.getMessage(), e);
|
||||
}
|
||||
final String newFingerprint = ClassLoaderUtils.generateAdditionalUrlsFingerprint(additionalUrls);
|
||||
if(!StringUtils.equals(additionalResourcesFingerprint, newFingerprint)) {
|
||||
setAdditionalResourcesFingerprint(newFingerprint);
|
||||
try {
|
||||
logger.info("Updating classpath for " + this.componentType + " with the ID " + this.getIdentifier());
|
||||
reload(additionalUrls);
|
||||
} catch (Exception e) {
|
||||
logger.error("Error reloading component with id " + id + ": " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -597,15 +594,7 @@ public abstract class AbstractConfiguredComponent implements ConfigurableCompone
|
||||
}
|
||||
}
|
||||
|
||||
public String getAdditionalResourcesFingerprint() {
|
||||
return additionalResourcesFingerprint;
|
||||
}
|
||||
|
||||
public boolean hasAdditionalResourcesFingerprint() {
|
||||
return !StringUtils.isEmpty(additionalResourcesFingerprint);
|
||||
}
|
||||
|
||||
public void setAdditionalResourcesFingerprint(String additionalResourcesFingerprint) {
|
||||
protected void setAdditionalResourcesFingerprint(String additionalResourcesFingerprint) {
|
||||
this.additionalResourcesFingerprint = additionalResourcesFingerprint;
|
||||
}
|
||||
|
||||
|
@ -81,12 +81,6 @@ public interface ConfiguredComponent extends ComponentAuthorizable {
|
||||
|
||||
void verifyCanUpdateBundle(BundleCoordinate bundleCoordinate) throws IllegalStateException;
|
||||
|
||||
boolean hasAdditionalResourcesFingerprint();
|
||||
|
||||
String getAdditionalResourcesFingerprint();
|
||||
|
||||
void setAdditionalResourcesFingerprint(String newFingerprint);
|
||||
|
||||
void reloadAdditionalResourcesIfNecessary();
|
||||
|
||||
/**
|
||||
|
@ -3447,8 +3447,8 @@ public class FlowController implements EventAccess, ControllerServiceProvider, R
|
||||
if (isTerminated()) {
|
||||
throw new IllegalStateException("Cannot start reporting task " + reportingTaskNode.getIdentifier() + " because the controller is terminated");
|
||||
}
|
||||
reportingTaskNode.reloadAdditionalResourcesIfNecessary();
|
||||
reportingTaskNode.verifyCanStart();
|
||||
reportingTaskNode.reloadAdditionalResourcesIfNecessary();
|
||||
processScheduler.schedule(reportingTaskNode);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user