You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ma...@apache.org on 2008/03/10 11:35:07 UTC
svn commit: r635513 - in /mina/trunk/core/src:
main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java
test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java
Author: maarten
Date: Mon Mar 10 03:35:00 2008
New Revision: 635513
URL: http://svn.apache.org/viewvc?rev=635513&view=rev
Log:
fixed DIRMINA-544 : ConcurrentModificationException in MdcInjectionFilter
+use ConcurrentHashMap instead of HashMap
+ updated javadoc about using only one instance
Modified:
mina/trunk/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java
mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java
Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java?rev=635513&r1=635512&r2=635513&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java Mon Mar 10 03:35:00 2008
@@ -21,10 +21,11 @@
import java.net.InetSocketAddress;
import java.util.EnumSet;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
+import java.util.Arrays;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.mina.common.AttributeKey;
import org.apache.mina.common.IoFilterEvent;
@@ -61,7 +62,10 @@
*
* If you want the MDC to be set for ALL code, you should
* add an MdcInjectionFilter to the start of the chain
- * and add one after EVERY ExecutorFilter in the chain
+ * and add that same MdcInjectionFilter instance after EVERY ExecutorFilter in the chain
+ *
+ * Thus it's ok to have one instance of the MdcInjectionFilter and add it multiple times to the chain
+ * but you should avoid adding multiple instances to the chain.
*
* @author The Apache MINA Project (dev@mina.apache.org)
* @version $Rev: 566952 $, $Date: 2007-08-17 09:25:04 +0200 (vr, 17 aug 2007) $
@@ -105,10 +109,7 @@
* @see #setProperty(org.apache.mina.common.IoSession, String, String)
*/
public MdcInjectionFilter(MdcKey... keys) {
- Set<MdcKey> keySet = new HashSet<MdcKey>();
- for (MdcKey key : keys) {
- keySet.add(key);
- }
+ Set<MdcKey> keySet = new HashSet<MdcKey>(Arrays.asList(keys));
this.mdcKeys = EnumSet.copyOf(keySet);
}
@@ -159,7 +160,7 @@
private static Map<String, String> getContext(final IoSession session) {
Map<String, String> context = (Map<String, String>) session.getAttribute(CONTEXT_KEY);
if (context == null) {
- context = new HashMap<String, String>();
+ context = new ConcurrentHashMap<String, String>();
session.setAttribute(CONTEXT_KEY, context);
}
return context;
Modified: mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java?rev=635513&r1=635512&r2=635513&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java Mon Mar 10 03:35:00 2008
@@ -146,7 +146,9 @@
chain.addLast("protocol", new ProtocolCodecFilter(new DummyProtocolCodecFactory()));
chain.addLast("dummy", new DummyIoFilter());
chain.addLast("executor2" , new ExecutorFilter());
- chain.addLast("mdc-injector2", mdcInjectionFilter);
+ // add the MdcInjectionFilter instance after every ExecutorFilter
+ // it's important to use the same MdcInjectionFilter instance
+ chain.addLast("mdc-injector2", mdcInjectionFilter);
test(chain);
}
@@ -163,9 +165,8 @@
// create some clients
NioSocketConnector connector = new NioSocketConnector();
connector.setHandler(new IoHandlerAdapter());
- SocketAddress remoteAddressClients[] = new SocketAddress[2];
- remoteAddressClients[0] = connectAndWrite(connector,0);
- remoteAddressClients[1] = connectAndWrite(connector,1);
+ connectAndWrite(connector,0);
+ connectAndWrite(connector,1);
// wait until Iohandler has received all events
simpleIoHandler.messageSentLatch.await();
simpleIoHandler.sessionIdleLatch.await();
@@ -315,7 +316,7 @@
String user = "user-" + message;
MdcInjectionFilter.setProperty(session, "user", user);
logger.info("messageReceived-2");
- session.write(message);
+ session.getService().broadcast(message);
throw new RuntimeException("just a test, forcing exceptionCaught");
}