You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2008/12/11 16:14:58 UTC
svn commit: r725709 - in /servicemix/smx4/nmr/trunk: ./
jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/
jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/
jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ jb...
Author: gnodet
Date: Thu Dec 11 07:14:57 2008
New Revision: 725709
URL: http://svn.apache.org/viewvc?rev=725709&view=rev
Log:
SMX4NMR-55: Ensure a clean shutdown of service assemblies
Added:
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AssemblyReferencesListener.java
Modified:
servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ShutdownCommand.java
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/Component.java
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ServiceAssembly.java
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java
servicemix/smx4/nmr/trunk/jbi/deployer/src/main/resources/META-INF/spring/servicemix-jbi-deployer.xml
servicemix/smx4/nmr/trunk/jbi/itests/pom.xml
servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/IntegrationTest.java
servicemix/smx4/nmr/trunk/jbi/itests/src/test/resources/org/apache/servicemix/MANIFEST.MF
servicemix/smx4/nmr/trunk/jbi/runtime/pom.xml
servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/internal/InternalEndpoint.java
servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ClientChannel.java
servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/EndpointRegistryImpl.java
servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/InternalEndpointWrapper.java
servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementEndpointRegistry.java
servicemix/smx4/nmr/trunk/pom.xml
Modified: servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ShutdownCommand.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ShutdownCommand.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ShutdownCommand.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/commands/src/main/java/org/apache/servicemix/jbi/commands/ShutdownCommand.java Thu Dec 11 07:14:57 2008
@@ -19,12 +19,27 @@
import javax.jbi.JBIException;
import javax.jbi.management.LifeCycleMBean;
+import org.apache.geronimo.gshell.clp.Option;
+import org.apache.servicemix.jbi.deployer.ServiceAssembly;
+import org.apache.servicemix.jbi.deployer.Component;
+
/**
* Shutdown a JBI artifact
*/
public class ShutdownCommand extends JbiLifeCycleCommandSupport {
+ @Option(name = "--force")
+ private boolean force;
+
protected void handle(LifeCycleMBean artifact) throws JBIException {
- artifact.shutDown();
+ if (force) {
+ if (artifact instanceof ServiceAssembly) {
+ ((ServiceAssembly) artifact).forceShutDown();
+ } else if (artifact instanceof Component) {
+ ((Component) artifact).forceShutDown();
+ }
+ } else {
+ artifact.shutDown();
+ }
}
}
\ No newline at end of file
Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/Component.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/Component.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/Component.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/Component.java Thu Dec 11 07:14:57 2008
@@ -17,6 +17,7 @@
package org.apache.servicemix.jbi.deployer;
import javax.jbi.management.ComponentLifeCycleMBean;
+import javax.jbi.JBIException;
/**
* Represents a JBI component.
@@ -45,4 +46,11 @@
* Retrieve the ServiceUnits deployed on this component
*/
ServiceUnit[] getServiceUnits();
+
+ /**
+ * Force a shutdown of this component
+ *
+ * @throws javax.jbi.JBIException
+ */
+ void forceShutDown() throws JBIException;
}
Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ServiceAssembly.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ServiceAssembly.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ServiceAssembly.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/ServiceAssembly.java Thu Dec 11 07:14:57 2008
@@ -43,4 +43,10 @@
*/
ServiceUnit[] getServiceUnits();
+ /**
+ * Force a shutdown of this service assembly
+ *
+ * @throws JBIException
+ */
+ void forceShutDown() throws JBIException;
}
Added: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AssemblyReferencesListener.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AssemblyReferencesListener.java?rev=725709&view=auto
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AssemblyReferencesListener.java (added)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/AssemblyReferencesListener.java Thu Dec 11 07:14:57 2008
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.servicemix.jbi.deployer.impl;
+
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.List;
+
+import org.apache.servicemix.nmr.api.event.EndpointListener;
+import org.apache.servicemix.nmr.api.event.ExchangeListener;
+import org.apache.servicemix.nmr.api.internal.InternalEndpoint;
+import org.apache.servicemix.nmr.api.internal.InternalExchange;
+import org.apache.servicemix.nmr.api.Exchange;
+import org.apache.servicemix.nmr.api.Status;
+import org.apache.servicemix.nmr.api.Role;
+import org.apache.servicemix.jbi.deployer.ServiceAssembly;
+
+/**
+ * This class will listen for endpoints activated and link them to service assemblies.
+ * This only work if the endpoint is activated synchronously during a call to the SU
+ * init() or start() method, but this should always be the case.
+ * When an exchange is sent or received, the source / destination endpoint of the exchange
+ * are retrieved, and their associated service assembly counter is incremented.
+ * When a SA is cleanly shutdown, we wait for the reference count to be 0.
+ */
+public class AssemblyReferencesListener implements EndpointListener, ExchangeListener {
+
+ private final ThreadLocal<ServiceAssembly> assembly = new ThreadLocal<ServiceAssembly>();
+ private final ConcurrentMap<InternalEndpoint, ServiceAssembly> endpoints =
+ new ConcurrentHashMap<InternalEndpoint, ServiceAssembly>();
+ private final ConcurrentMap<ServiceAssembly, AtomicInteger> references =
+ new ConcurrentHashMap<ServiceAssembly, AtomicInteger>();
+
+ public void setAssembly(ServiceAssembly assembly) {
+ this.assembly.set(assembly);
+ }
+
+ public void forget(ServiceAssembly assembly) {
+ for (ConcurrentMap.Entry<InternalEndpoint, ServiceAssembly> entry : endpoints.entrySet()) {
+ if (entry.getValue() == assembly) {
+ endpoints.remove(entry.getKey());
+ }
+ }
+ AtomicInteger count = references.remove(assembly);
+ if (count != null) {
+ count.set(0);
+ synchronized (assembly) {
+ assembly.notifyAll();
+ }
+ }
+ }
+
+ public void endpointRegistered(InternalEndpoint endpoint) {
+ ServiceAssembly assembly = this.assembly.get();
+ if (assembly != null) {
+ endpoints.put(endpoint, assembly);
+ if (references.get(assembly) == null) {
+ references.put(assembly, new AtomicInteger());
+ }
+ }
+ }
+
+ public void endpointUnregistered(InternalEndpoint endpoint) {
+ endpoints.remove(endpoint);
+ }
+
+ public void exchangeSent(Exchange exchange) {
+ // Check if this is a new exchange
+ if (exchange.getStatus() == Status.Active && exchange.getRole() == Role.Consumer &&
+ exchange.getOut(false) == null && exchange.getFault(false) == null) {
+ if (exchange instanceof InternalExchange) {
+ // Increment reference to the source SA
+ InternalExchange ie = (InternalExchange) exchange;
+ reference(endpoints.get(ie.getSource()));
+ }
+ }
+ }
+
+ public void exchangeDelivered(Exchange exchange) {
+ // Check if the exchange is finished
+ if (exchange.getStatus() != Status.Active) {
+ if (exchange instanceof InternalExchange) {
+ InternalExchange ie = (InternalExchange) exchange;
+ // Decrement references to source and destination SA
+ unreference(endpoints.get(ie.getSource()));
+ unreference(endpoints.get(ie.getDestination()));
+ }
+ // Check if this is a new exchange
+ } else if (exchange.getStatus() == Status.Active && exchange.getRole() == Role.Provider &&
+ exchange.getOut(false) == null && exchange.getFault(false) == null) {
+ if (exchange instanceof InternalExchange) {
+ // Increment reference to the destination SA
+ InternalExchange ie = (InternalExchange) exchange;
+ reference(endpoints.get(ie.getDestination()));
+ }
+ }
+ }
+
+ public void waitFor(ServiceAssembly assembly) throws InterruptedException{
+ if (assembly != null) {
+ AtomicInteger count = references.get(assembly);
+ if (count != null) {
+ if (count.get() != 0) {
+ synchronized (assembly) {
+ while (count.get() != 0) {
+ assembly.wait(Long.MAX_VALUE);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void reference(ServiceAssembly assembly) {
+ if (assembly != null) {
+ AtomicInteger count = references.get(assembly);
+ if (count != null) {
+ count.incrementAndGet();
+ }
+ }
+ }
+
+ private void unreference(ServiceAssembly assembly) {
+ if (assembly != null) {
+ AtomicInteger count = references.get(assembly);
+ if (count != null) {
+ if (count.decrementAndGet() == 0) {
+ synchronized (assembly) {
+ assembly.notifyAll();
+ }
+ }
+ }
+ }
+ }
+
+}
Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ComponentImpl.java Thu Dec 11 07:14:57 2008
@@ -151,10 +151,14 @@
}
public void shutDown() throws JBIException {
- shutDown(true);
+ shutDown(true, false);
}
- public void shutDown(boolean saveState) throws JBIException {
+ public void forceShutDown() throws JBIException {
+ shutDown(true, true);
+ }
+
+ public void shutDown(boolean saveState, boolean force) throws JBIException {
LOGGER.info("Shutting down component " + getName());
if (state == State.Started) {
stop(saveState);
@@ -164,7 +168,7 @@
for (ServiceAssemblyImpl sa : getServiceAssemblies()) {
if (sa.getState() == ServiceAssemblyImpl.State.Stopped
|| sa.getState() == ServiceAssemblyImpl.State.Initialized) {
- sa.shutDown(false);
+ sa.shutDown(false, force);
}
}
// Shutdown component
Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/Deployer.java Thu Dec 11 07:14:57 2008
@@ -95,6 +95,7 @@
private ServiceTracker tracker;
private ServiceTracker deployedAssembliesTracker;
+ private AssemblyReferencesListener endpointListener;
public Deployer() throws JBIException{
sharedLibraries = new ConcurrentHashMap<String, SharedLibraryImpl>();
@@ -124,6 +125,14 @@
this.autoStart = autoStart;
}
+ public void setEndpointListener(AssemblyReferencesListener endpointListener) {
+ this.endpointListener = endpointListener;
+ }
+
+ public AssemblyReferencesListener getEndpointListener() {
+ return endpointListener;
+ }
+
@Override
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
@@ -350,7 +359,7 @@
protected void registerSA(ServiceAssemblyDesc serviceAssembyDesc, Bundle bundle, List<ServiceUnitImpl> sus) throws JBIException {
// Now create the SA and initialize it
Preferences prefs = preferencesService.getUserPreferences(serviceAssembyDesc.getIdentification().getName());
- ServiceAssemblyImpl sa = new ServiceAssemblyImpl(serviceAssembyDesc, sus, prefs, autoStart);
+ ServiceAssemblyImpl sa = new ServiceAssemblyImpl(serviceAssembyDesc, sus, prefs, endpointListener, autoStart);
sa.init();
serviceAssemblies.put(sa.getName(), sa);
// populate props from the component meta-data
@@ -382,7 +391,7 @@
component.stop(false);
}
if (component.getState() == ComponentImpl.State.Stopped) {
- component.shutDown(false);
+ component.shutDown(false, false);
}
File file = new File(System.getProperty("servicemix.base"), "data/jbi/" + name);
FileUtil.deleteFile(file);
@@ -400,7 +409,7 @@
sa.stop(false);
}
if (sa.getState() == ServiceAssemblyImpl.State.Stopped) {
- sa.shutDown(false);
+ sa.shutDown(false, false);
}
for (ServiceUnit su : sa.getServiceUnits()) {
((ServiceUnitImpl) su).undeploy();
@@ -438,7 +447,7 @@
if (ci != null) {
try {
ci.stop(false);
- ci.shutDown(false);
+ ci.shutDown(false, false);
} catch (JBIException e) {
LOGGER.warn("Error when shutting down component", e);
}
Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/java/org/apache/servicemix/jbi/deployer/impl/ServiceAssemblyImpl.java Thu Dec 11 07:14:57 2008
@@ -18,6 +18,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
import javax.jbi.JBIException;
import javax.jbi.management.LifeCycleMBean;
@@ -27,6 +28,8 @@
import org.apache.servicemix.jbi.deployer.ServiceAssembly;
import org.apache.servicemix.jbi.deployer.ServiceUnit;
import org.apache.servicemix.jbi.deployer.descriptor.ServiceAssemblyDesc;
+import org.apache.servicemix.nmr.api.event.EndpointListener;
+import org.apache.servicemix.nmr.api.internal.InternalEndpoint;
import org.osgi.service.prefs.Preferences;
import org.osgi.service.prefs.BackingStoreException;
@@ -47,23 +50,27 @@
Shutdown,
}
- private ServiceAssemblyDesc serviceAssemblyDesc;
+ private final ServiceAssemblyDesc serviceAssemblyDesc;
- private List<ServiceUnitImpl> serviceUnits;
+ private final List<ServiceUnitImpl> serviceUnits;
- private State state = State.Unknown;
+ private final Preferences prefs;
- private Preferences prefs;
+ private final AssemblyReferencesListener listener;
private State runningState;
+ private State state = State.Unknown;
+
public ServiceAssemblyImpl(ServiceAssemblyDesc serviceAssemblyDesc,
List<ServiceUnitImpl> serviceUnits,
Preferences prefs,
+ AssemblyReferencesListener listener,
boolean autoStart) {
this.serviceAssemblyDesc = serviceAssemblyDesc;
this.serviceUnits = serviceUnits;
this.prefs = prefs;
+ this.listener = listener;
this.runningState = State.valueOf(this.prefs.get(STATE, (autoStart ? State.Started : State.Initialized).name()));
for (ServiceUnitImpl su : serviceUnits) {
su.setServiceAssemblyImpl(this);
@@ -100,15 +107,20 @@
}
}
- public void init() throws JBIException {
- transition(State.Initialized);
- if (runningState == State.Started) {
- transition(State.Started);
- } else if (runningState == State.Stopped) {
- transition(State.Started);
- transition(State.Stopped);
- } else if (runningState == State.Shutdown) {
- transition(State.Shutdown);
+ public synchronized void init() throws JBIException {
+ listener.setAssembly(this);
+ try {
+ transition(State.Initialized);
+ if (runningState == State.Started) {
+ transition(State.Started);
+ } else if (runningState == State.Stopped) {
+ transition(State.Started);
+ transition(State.Stopped);
+ } else if (runningState == State.Shutdown) {
+ transition(State.Shutdown);
+ }
+ } finally {
+ listener.setAssembly(null);
}
}
@@ -116,10 +128,21 @@
start(true);
}
- public void start(boolean persist) throws JBIException {
- transition(State.Started);
- if (persist) {
- saveState();
+ public synchronized void start(boolean persist) throws JBIException {
+ listener.setAssembly(this);
+ try {
+ if (state == State.Started) {
+ return;
+ }
+ if (state == State.Shutdown) {
+ transition(State.Initialized);
+ }
+ transition(State.Started);
+ if (persist) {
+ saveState();
+ }
+ } finally {
+ listener.setAssembly(null);
}
}
@@ -127,21 +150,59 @@
stop(true);
}
- public void stop(boolean persist) throws JBIException {
- transition(State.Stopped);
- if (persist) {
- saveState();
+ public synchronized void stop(boolean persist) throws JBIException {
+ listener.setAssembly(this);
+ try {
+ if (state == State.Stopped) {
+ return;
+ }
+ if (state == State.Shutdown) {
+ transition(State.Initialized);
+ }
+ if (state == State.Started) {
+ transition(State.Stopped);
+ }
+ if (persist) {
+ saveState();
+ }
+ } finally {
+ listener.setAssembly(null);
}
}
public void shutDown() throws JBIException {
- shutDown(true);
+ shutDown(true, false);
}
- public void shutDown(boolean persist) throws JBIException {
- transition(State.Shutdown);
- if (persist) {
- saveState();
+ public void forceShutDown() throws JBIException {
+ shutDown(true, true);
+ }
+
+ public synchronized void shutDown(boolean persist, boolean force) throws JBIException {
+ listener.setAssembly(this);
+ try {
+ if (state == State.Shutdown) {
+ return;
+ }
+ if (state == State.Started) {
+ transition(State.Stopped);
+ }
+ if (!force) {
+ for (;;) {
+ try {
+ listener.waitFor(this);
+ break;
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ transition(State.Shutdown);
+ if (persist) {
+ saveState();
+ }
+ } finally {
+ listener.setAssembly(null);
+ listener.forget(this);
}
}
Modified: servicemix/smx4/nmr/trunk/jbi/deployer/src/main/resources/META-INF/spring/servicemix-jbi-deployer.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/deployer/src/main/resources/META-INF/spring/servicemix-jbi-deployer.xml?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/deployer/src/main/resources/META-INF/spring/servicemix-jbi-deployer.xml (original)
+++ servicemix/smx4/nmr/trunk/jbi/deployer/src/main/resources/META-INF/spring/servicemix-jbi-deployer.xml Thu Dec 11 07:14:57 2008
@@ -33,8 +33,12 @@
<bean id="deployer" class="org.apache.servicemix.jbi.deployer.impl.Deployer">
<property name="preferencesService" ref="preferencesService" />
<property name="autoStart" value="true" />
+ <property name="endpointListener" ref="endpointListener" />
</bean>
+ <!-- Endpoint listener -->
+ <bean id="endpointListener" class="org.apache.servicemix.jbi.deployer.impl.AssemblyReferencesListener" />
+
<!-- Deployment listener -->
<bean id="listener" class="org.apache.servicemix.jbi.deployer.handler.JBIDeploymentListener" />
@@ -53,4 +57,12 @@
<osgi:service ref="listener" interface="org.apache.servicemix.kernel.filemonitor.DeploymentListener" />
+ <osgi:service ref="endpointListener">
+ <osgi:interfaces>
+ <value>org.apache.servicemix.nmr.api.event.Listener</value>
+ <value>org.apache.servicemix.nmr.api.event.EndpointListener</value>
+ <value>org.apache.servicemix.nmr.api.event.ExchangeListener</value>
+ </osgi:interfaces>
+ </osgi:service>
+
</beans>
Modified: servicemix/smx4/nmr/trunk/jbi/itests/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/itests/pom.xml?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/itests/pom.xml (original)
+++ servicemix/smx4/nmr/trunk/jbi/itests/pom.xml Thu Dec 11 07:14:57 2008
@@ -70,8 +70,8 @@
</dependency>
<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
- <artifactId>org.apache.servicemix.bundles.ant</artifactId>
- <version>${ant.version}</version>
+ <artifactId>org.apache.servicemix.bundles.woodstox</artifactId>
+ <version>${woodstox.version}</version>
</dependency>
<dependency>
<groupId>org.apache.servicemix.nmr</groupId>
@@ -141,8 +141,8 @@
</dependency>
<dependency>
<groupId>org.apache.servicemix</groupId>
- <artifactId>servicemix-shared-compat</artifactId>
- <version>${servicemix3.shared.compat.version}</version>
+ <artifactId>servicemix-shared</artifactId>
+ <version>${servicemix.shared.version}</version>
<classifier>installer</classifier>
<type>zip</type>
<exclusions>
@@ -163,14 +163,14 @@
<dependency>
<groupId>org.apache.servicemix</groupId>
<artifactId>servicemix-eip</artifactId>
- <version>${servicemix3.component.version}</version>
+ <version>${servicemix.eip.version}</version>
<classifier>installer</classifier>
<type>zip</type>
</dependency>
<dependency>
<groupId>org.apache.servicemix</groupId>
<artifactId>servicemix-jsr181</artifactId>
- <version>${servicemix3.component.version}</version>
+ <version>${servicemix.jsr181.version}</version>
<classifier>installer</classifier>
<type>zip</type>
<exclusions>
@@ -187,7 +187,7 @@
<dependency>
<groupId>org.apache.servicemix</groupId>
<artifactId>servicemix-http</artifactId>
- <version>${servicemix3.component.version}</version>
+ <version>${servicemix.http.version}</version>
<classifier>installer</classifier>
<type>zip</type>
</dependency>
@@ -213,6 +213,11 @@
<version>${geronimo.jta.version}</version>
</dependency>
<dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-javamail_1.4_spec</artifactId>
+ <version>${geronimo.javamail.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.apache.servicemix.specs</groupId>
<artifactId>org.apache.servicemix.specs.stax-api-1.0</artifactId>
<version>${servicemix.specs.version}</version>
@@ -252,29 +257,29 @@
<artifactItems>
<artifactItem>
<groupId>org.apache.servicemix</groupId>
- <artifactId>servicemix-shared-compat</artifactId>
- <version>${servicemix3.shared.compat.version}</version>
+ <artifactId>servicemix-shared</artifactId>
+ <version>${servicemix.shared.version}</version>
<classifier>installer</classifier>
<type>zip</type>
</artifactItem>
<artifactItem>
<groupId>org.apache.servicemix</groupId>
<artifactId>servicemix-eip</artifactId>
- <version>${servicemix3.component.version}</version>
+ <version>${servicemix.eip.version}</version>
<classifier>installer</classifier>
<type>zip</type>
</artifactItem>
<artifactItem>
<groupId>org.apache.servicemix</groupId>
<artifactId>servicemix-jsr181</artifactId>
- <version>${servicemix3.component.version}</version>
+ <version>${servicemix.jsr181.version}</version>
<classifier>installer</classifier>
<type>zip</type>
</artifactItem>
<artifactItem>
<groupId>org.apache.servicemix</groupId>
<artifactId>servicemix-http</artifactId>
- <version>${servicemix3.component.version}</version>
+ <version>${servicemix.http.version}</version>
<classifier>installer</classifier>
<type>zip</type>
</artifactItem>
Modified: servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/IntegrationTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/IntegrationTest.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/IntegrationTest.java (original)
+++ servicemix/smx4/nmr/trunk/jbi/itests/src/test/java/org/apache/servicemix/jbi/IntegrationTest.java Thu Dec 11 07:14:57 2008
@@ -18,11 +18,18 @@
import java.io.File;
import java.util.Properties;
+import java.util.concurrent.CountDownLatch;
+import java.net.URL;
+import java.net.URLConnection;
import javax.jbi.component.Component;
import org.apache.servicemix.nmr.api.NMR;
import org.apache.servicemix.kernel.testing.support.AbstractIntegrationTest;
+import org.apache.servicemix.jbi.deployer.ServiceAssembly;
+import org.apache.servicemix.jbi.deployer.handler.JBIDeploymentListener;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
public class IntegrationTest extends AbstractIntegrationTest {
@@ -59,6 +66,7 @@
getBundle("org.apache.servicemix.specs", "org.apache.servicemix.specs.stax-api-1.0"),
getBundle("org.apache.servicemix.specs", "org.apache.servicemix.specs.jbi-api-1.0"),
getBundle("org.apache.geronimo.specs", "geronimo-activation_1.1_spec"),
+ getBundle("org.apache.geronimo.specs", "geronimo-javamail_1.4_spec"),
getBundle("org.apache.geronimo.specs", "geronimo-jta_1.1_spec"),
getBundle("org.apache.felix", "org.apache.felix.prefs"),
getBundle("org.apache.xbean", "xbean-classloader"),
@@ -71,7 +79,7 @@
getBundle("org.apache.servicemix.jbi", "org.apache.servicemix.jbi.deployer"),
getBundle("org.apache.servicemix.jbi", "org.apache.servicemix.jbi.osgi"),
getBundle("org.apache.servicemix.kernel", "org.apache.servicemix.kernel.filemonitor"),
- getBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.ant"),
+ getBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.woodstox"),
};
}
@@ -79,26 +87,72 @@
System.out.println("Waiting for NMR");
NMR nmr = getOsgiService(NMR.class);
assertNotNull(nmr);
- installBundle("org.apache.servicemix", "servicemix-shared-compat", "installer", "zip");
- installBundle("org.apache.servicemix", "servicemix-eip", "installer", "zip");
+ installJbiBundle("org.apache.servicemix", "servicemix-shared", "installer", "zip");
+ installJbiBundle("org.apache.servicemix", "servicemix-eip", "installer", "zip");
System.out.println("Waiting for JBI Component");
- Component cmp = (Component) getOsgiService(Component.class);
+ Component cmp = getOsgiService(Component.class);
assertNotNull(cmp);
}
- /*
public void testServiceAssembly() throws Exception {
System.out.println("Waiting for NMR");
NMR nmr = getOsgiService(NMR.class);
assertNotNull(nmr);
- installBundle("org.apache.servicemix", "servicemix-shared-compat", "installer", "zip");
- installBundle("org.apache.servicemix", "servicemix-jsr181", "installer", "zip");
- installBundle("org.apache.servicemix", "servicemix-http", "installer", "zip");
- installBundle("org.apache.servicemix.samples.wsdl-first", "wsdl-first-sa", null, "zip");
+ installJbiBundle("org.apache.servicemix", "servicemix-shared", "installer", "zip");
+ installJbiBundle("org.apache.servicemix", "servicemix-jsr181", "installer", "zip");
+ installJbiBundle("org.apache.servicemix", "servicemix-http", "installer", "zip");
+ Bundle saBundle = installJbiBundle("org.apache.servicemix.samples.wsdl-first", "wsdl-first-sa", null, "zip");
System.out.println("Waiting for JBI Service Assembly");
- ServiceAssembly sa = (ServiceAssembly) getOsgiService(ServiceAssembly.class);
+ ServiceAssembly sa = getOsgiService(ServiceAssembly.class);
assertNotNull(sa);
+
+ final CountDownLatch latch = new CountDownLatch(50);
+ for (int i = 0; i < 2; i++) {
+ new Thread() {
+ public void run() {
+ try {
+ for (;;) {
+ URL url = new URL("http://localhost:8192/PersonService/");
+ URLConnection connection = url.openConnection();
+ connection.setDoInput(true);
+ connection.setDoOutput(true);
+ connection.getOutputStream().write(
+ ("<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"\n" +
+ " xmlns:tns=\"http://servicemix.apache.org/samples/wsdl-first/types\">\n" +
+ " <env:Body>\n" +
+ " <tns:GetPerson>\n" +
+ " <tns:personId>world</tns:personId>\n" +
+ " </tns:GetPerson>\n" +
+ " </env:Body>\n" +
+ "</env:Envelope>").getBytes());
+ byte[] buffer = new byte[8192];
+ int len = connection.getInputStream().read(buffer);
+ String result = new String(buffer, 0, len);
+ System.out.println(result);
+ latch.countDown();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }.start();
+ }
+
+ latch.await();
+ //Thread.sleep(500);
+ saBundle.uninstall();
+ //sa.stop();
+ //sa.shutDown();
}
- */
+ protected Bundle installJbiBundle(String groupId, String artifactId, String classifier, String type) throws BundleException {
+ String version = getBundleVersion(groupId, artifactId);
+ File loc = localMavenBundle(groupId, artifactId, version, classifier, type);
+ File tmpDir = new File("target/temp/");
+ tmpDir.mkdirs();
+ File out = new JBIDeploymentListener().handle(loc, tmpDir);
+ Bundle bundle = bundleContext.installBundle(out.toURI().toString());
+ bundle.start();
+ return bundle;
+ }
}
Modified: servicemix/smx4/nmr/trunk/jbi/itests/src/test/resources/org/apache/servicemix/MANIFEST.MF
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/itests/src/test/resources/org/apache/servicemix/MANIFEST.MF?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/itests/src/test/resources/org/apache/servicemix/MANIFEST.MF (original)
+++ servicemix/smx4/nmr/trunk/jbi/itests/src/test/resources/org/apache/servicemix/MANIFEST.MF Thu Dec 11 07:14:57 2008
@@ -28,6 +28,7 @@
org.apache.servicemix.nmr.api,
org.apache.servicemix.nmr.core,
org.apache.servicemix.jbi.deployer,
+ org.apache.servicemix.jbi.deployer.handler,
org.apache.servicemix.kernel.testing.support,
org.springframework.osgi.util,
javax.jbi.component
Modified: servicemix/smx4/nmr/trunk/jbi/runtime/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/jbi/runtime/pom.xml?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/jbi/runtime/pom.xml (original)
+++ servicemix/smx4/nmr/trunk/jbi/runtime/pom.xml Thu Dec 11 07:14:57 2008
@@ -55,7 +55,7 @@
<dependency>
<groupId>org.apache.servicemix</groupId>
<artifactId>servicemix-eip</artifactId>
- <version>${servicemix3.component.version}</version>
+ <version>${servicemix.eip.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
@@ -79,7 +79,7 @@
<dependency>
<groupId>org.apache.servicemix</groupId>
<artifactId>servicemix-common</artifactId>
- <version>${servicemix3.component.version}</version>
+ <version>${servicemix.shared.version}</version>
<scope>test</scope>
</dependency>
<dependency>
Modified: servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/internal/InternalEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/internal/InternalEndpoint.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/internal/InternalEndpoint.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/api/src/main/java/org/apache/servicemix/nmr/api/internal/InternalEndpoint.java Thu Dec 11 07:14:57 2008
@@ -16,6 +16,8 @@
*/
package org.apache.servicemix.nmr.api.internal;
+import java.util.Map;
+
import org.apache.servicemix.nmr.api.Endpoint;
/**
@@ -35,6 +37,13 @@
String getId();
/**
+ * Retrieve the metadata associated with this endpoint
+ *
+ * @return a non null map containing the metadata
+ */
+ Map<String,?> getMetaData();
+
+ /**
* Retrieve the channel associated with this endpoint.
* This method is usually used by {@link Flow}s to deliver
* exchanges to this endpoint.
Modified: servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ClientChannel.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ClientChannel.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ClientChannel.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/ClientChannel.java Thu Dec 11 07:14:57 2008
@@ -17,6 +17,8 @@
package org.apache.servicemix.nmr.core;
import java.util.UUID;
+import java.util.Map;
+import java.util.Collections;
import java.util.concurrent.Executors;
import org.apache.servicemix.nmr.api.Channel;
@@ -46,6 +48,10 @@
return id;
}
+ public Map<String, ?> getMetaData() {
+ return Collections.emptyMap();
+ }
+
public Endpoint getEndpoint() {
return this;
}
Modified: servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/EndpointRegistryImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/EndpointRegistryImpl.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/EndpointRegistryImpl.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/EndpointRegistryImpl.java Thu Dec 11 07:14:57 2008
@@ -97,7 +97,7 @@
* @see org.apache.servicemix.nmr.api.Endpoint
*/
public void register(Endpoint endpoint, Map<String, ?> properties) {
- InternalEndpointWrapper wrapper = new InternalEndpointWrapper(endpoint);
+ InternalEndpointWrapper wrapper = new InternalEndpointWrapper(endpoint, properties);
if (endpoints.putIfAbsent(endpoint, wrapper) == null) {
Executor executor = Executors.newCachedThreadPool();
ChannelImpl channel = new ChannelImpl(wrapper, executor, nmr);
Modified: servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/InternalEndpointWrapper.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/InternalEndpointWrapper.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/InternalEndpointWrapper.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/core/src/main/java/org/apache/servicemix/nmr/core/InternalEndpointWrapper.java Thu Dec 11 07:14:57 2008
@@ -17,6 +17,8 @@
package org.apache.servicemix.nmr.core;
import java.util.UUID;
+import java.util.Map;
+import java.util.Collections;
import org.apache.servicemix.nmr.api.Channel;
import org.apache.servicemix.nmr.api.Endpoint;
@@ -31,10 +33,12 @@
private final Endpoint endpoint;
private final String id;
+ private final Map<String,?> metadata;
private InternalChannel channel;
- public InternalEndpointWrapper(Endpoint endpoint) {
+ public InternalEndpointWrapper(Endpoint endpoint, Map<String,?> metadata) {
this.endpoint = endpoint;
+ this.metadata = metadata;
this.id = UUID.randomUUID().toString();
}
@@ -50,6 +54,10 @@
return id;
}
+ public Map<String, ?> getMetaData() {
+ return Collections.unmodifiableMap(metadata);
+ }
+
/**
* Set the channel so that the endpoint can send exchanges back
* when they are processed or act as a consumer itself.
Modified: servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementEndpointRegistry.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementEndpointRegistry.java?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementEndpointRegistry.java (original)
+++ servicemix/smx4/nmr/trunk/nmr/management/src/main/java/org/apache/servicemix/nmr/management/ManagementEndpointRegistry.java Thu Dec 11 07:14:57 2008
@@ -21,15 +21,12 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.servicemix.nmr.api.Endpoint;
import org.apache.servicemix.nmr.api.Exchange;
import org.apache.servicemix.nmr.api.Role;
import org.apache.servicemix.nmr.api.Status;
import org.apache.servicemix.nmr.api.event.ExchangeListener;
import org.apache.servicemix.nmr.api.internal.InternalEndpoint;
import org.apache.servicemix.nmr.api.internal.InternalExchange;
-import org.apache.servicemix.nmr.api.service.ServiceRegistry;
-import org.apache.servicemix.nmr.core.ServiceRegistryImpl;
import org.springframework.beans.factory.InitializingBean;
/**
@@ -85,14 +82,18 @@
public void exchangeSent(Exchange exchange) {
try {
- LOG.info("Sending exchange: " + exchange);
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Sending exchange: " + exchange);
+ }
if (exchange.getStatus() == Status.Active &&
exchange.getRole() == Role.Consumer &&
exchange.getOut(false) == null &&
exchange.getFault(false) == null &&
exchange instanceof InternalExchange) {
String id = ((InternalExchange) exchange).getSource().getId();
- LOG.info("Source endpoint: " + id + " (known endpoints: " + endpoints + ")");
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Source endpoint: " + id + " (known endpoints: " + endpoints + ")");
+ }
ManagedEndpoint me = endpoints.get(id);
if (me == null) {
LOG.warn("No managed endpoint registered with id: " + id);
@@ -107,14 +108,18 @@
public void exchangeDelivered(Exchange exchange) {
try {
- LOG.info("Receiving exchange: " + exchange);
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Receiving exchange: " + exchange);
+ }
if (exchange.getStatus() == Status.Active &&
exchange.getRole() == Role.Provider &&
exchange.getOut(false) == null &&
exchange.getFault(false) == null &&
exchange instanceof InternalExchange) {
String id = ((InternalExchange) exchange).getDestination().getId();
- LOG.info("Dest endpoint: " + id + " (known endpoints: " + endpoints + ")");
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Dest endpoint: " + id + " (known endpoints: " + endpoints + ")");
+ }
ManagedEndpoint me = endpoints.get(id);
if (me == null) {
LOG.warn("No managed endpoint registered with id: " + id);
Modified: servicemix/smx4/nmr/trunk/pom.xml
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/pom.xml?rev=725709&r1=725708&r2=725709&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/pom.xml (original)
+++ servicemix/smx4/nmr/trunk/pom.xml Thu Dec 11 07:14:57 2008
@@ -76,14 +76,17 @@
<geronimo.javamail.version>1.5</geronimo.javamail.version>
<geronimo.jta.version>1.1.1</geronimo.jta.version>
<geronimo.servlet.version>1.1.2</geronimo.servlet.version>
+ <geronimo.stax.version>1.0.1</geronimo.stax.version>
<jbi.api.version>1.1.0</jbi.api.version>
<jline.version>0.9.94</jline.version>
<junit.version>4.4_1</junit.version>
<log4j.version>1.2.14</log4j.version>
<pax.logging.version>1.1.1</pax.logging.version>
- <servicemix3.component.version>2008.01</servicemix3.component.version>
<servicemix3.version>3.3</servicemix3.version>
- <servicemix3.shared.compat.version>3.2.3</servicemix3.shared.compat.version>
+ <servicemix.eip.version>2008.01</servicemix.eip.version>
+ <servicemix.http.version>2008.02-SNAPSHOT</servicemix.http.version>
+ <servicemix.jsr181.version>2008.01</servicemix.jsr181.version>
+ <servicemix.shared.version>2008.01</servicemix.shared.version>
<servicemix.kernel.version>1.1.0-SNAPSHOT</servicemix.kernel.version>
<servicemix.legal.version>1.0</servicemix.legal.version>
<servicemix.specs.version>1.1.0</servicemix.specs.version>