You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by am...@apache.org on 2013/08/15 20:23:55 UTC
svn commit: r1514423 - in /cxf/dosgi/trunk/dsw/cxf-topology-manager/src:
main/java/org/apache/cxf/dosgi/topologymanager/exporter/
test/java/org/apache/cxf/dosgi/topologymanager/exporter/
Author: amichai
Date: Thu Aug 15 18:23:55 2013
New Revision: 1514423
URL: http://svn.apache.org/r1514423
Log:
Fix handling of failed exports and service unregistration during export
Modified:
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifier.java
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java
cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/ExportServiceTest.java
Modified: cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifier.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifier.java?rev=1514423&r1=1514422&r2=1514423&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifier.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifier.java Thu Aug 15 18:23:55 2013
@@ -90,6 +90,9 @@ public class EndpointListenerNotifier {
* @param endpoints the endpoints the listeners should be notified about
*/
void notifyListeners(boolean added, Collection<EndpointDescription> endpoints) {
+ if (endpoints.isEmpty()) { // a little optimization to prevent unnecessary processing
+ return;
+ }
ServiceReference[] listeners = stEndpointListeners.getServiceReferences();
if (listeners != null) {
for (ServiceReference eplReference : listeners) {
@@ -150,7 +153,7 @@ public class EndpointListenerNotifier {
LOG.debug("Filter {} matches endpoint {}", filter, dict);
matchingFilters.add(filter);
} else {
- LOG.debug("Filter {} does not match endpoint {}", filter, dict);
+ LOG.trace("Filter {} does not match endpoint {}", filter, dict);
}
}
return matchingFilters;
Modified: cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java?rev=1514423&r1=1514422&r2=1514423&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java Thu Aug 15 18:23:55 2013
@@ -149,7 +149,7 @@ public class TopologyManagerExport {
}
protected void doExportService(final ServiceReference sref) {
- LOG.debug("Exporting service");
+ LOG.debug("Exporting service {}", sref);
endpointRepo.addService(sref); // mark for future export even if there are currently no RSAs
List<RemoteServiceAdmin> rsaList = remoteServiceAdminTracker.getAllServices();
if (rsaList.isEmpty()) {
@@ -172,22 +172,50 @@ public class TopologyManagerExport {
private void exportServiceUsingRemoteServiceAdmin(final ServiceReference sref,
final RemoteServiceAdmin remoteServiceAdmin) {
+ // abort if the service was unregistered by the time we got here
+ // (we check again at the end, but this optimization saves unnecessary heavy processing)
+ if (sref.getBundle() == null) {
+ LOG.info("TopologyManager: export aborted for {} since it was unregistered", sref);
+ endpointRepo.removeService(sref);
+ return;
+ }
+ // do the export
+ LOG.debug("exporting {}...", sref);
// TODO: additional parameter Map?
- LOG.debug("exporting...");
Collection<ExportRegistration> exportRegs = remoteServiceAdmin.exportService(sref, null);
- List<EndpointDescription> endpoints = new ArrayList<EndpointDescription>();
- // note: endpoints list may contain ExportRegistrations with an exception, not only successful ones
if (exportRegs.isEmpty()) {
- // TODO export failed -> What should be done here?
- LOG.error("export failed");
- } else {
- for (ExportRegistration exportReg : exportRegs) {
- endpoints.add(getExportedEndpoint(exportReg));
+ LOG.warn("TopologyManager: nothing was exported for {}", sref);
+ return;
+ }
+ // process successful/failed registrations
+ List<EndpointDescription> endpoints = new ArrayList<EndpointDescription>();
+ for (ExportRegistration reg : exportRegs) {
+ if (reg.getException() == null) {
+ EndpointDescription endpoint = getExportedEndpoint(reg);
+ LOG.info("TopologyManager: export succeeded for {}, endpoint ", sref, endpoint);
+ endpoints.add(endpoint);
+ } else {
+ // TODO: what should we do with failed exports?
+ LOG.error("TopologyManager: export failed for {}", sref);
+ reg.close();
+ }
+ }
+ // abort export if service was unregistered in the meanwhile (since we have a race
+ // with the unregister event which may have already been handled, so we'll miss it)
+ if (sref.getBundle() == null) {
+ LOG.info("TopologyManager: export reverted for {} since service was unregistered", sref);
+ endpointRepo.removeService(sref);
+ for (ExportRegistration reg : exportRegs) {
+ reg.close();
}
- LOG.info("TopologyManager: export successful Endpoints: {}", endpoints);
+ return;
+ }
+ // add the new exported endpoints
+ if (!endpoints.isEmpty()) {
+ LOG.info("TopologyManager: export successful for {}, endpoints: {}", sref, endpoints);
epListenerNotifier.notifyListeners(true, endpoints);
+ endpointRepo.addEndpoints(sref, remoteServiceAdmin, endpoints);
}
- endpointRepo.addEndpoints(sref, remoteServiceAdmin, endpoints);
}
/**
Modified: cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/ExportServiceTest.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/ExportServiceTest.java?rev=1514423&r1=1514422&r2=1514423&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/ExportServiceTest.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/ExportServiceTest.java Thu Aug 15 18:23:55 2013
@@ -115,6 +115,7 @@ public class ExportServiceTest {
ExportRegistration exportRegistration = c.createMock(ExportRegistration.class);
ExportReference exportReference = c.createMock(ExportReference.class);
EasyMock.expect(exportRegistration.getExportReference()).andReturn(exportReference).anyTimes();
+ EasyMock.expect(exportRegistration.getException()).andReturn(null).anyTimes();
EasyMock.expect(exportReference.getExportedEndpoint()).andReturn(endpoint).anyTimes();
return exportRegistration;
}