Ich benutze Executor-Kanal für parallele Anrufe.Executor-Kanal - InheritableThreadLocal Problem
<task:executor id="taskExecutor" pool-size="5"/>
<int:channel id="executorChannel">
<int:dispatcher task-executor="taskExecutor"/>
</int:channel>
ich InheritableThreadLocal Variable verwenden, ist es wieder auf den Ausgangswert nach dem 6. Anruf wegen der Pool-Größe deklariert als 5.
Mit anderen Worten, von 1-10 lokalen Wert Thread gelesen als 1-5 und wieder 1-5. Abgesehen von ThreadLocal-Variablenproblem funktioniert alles einwandfrei.
informieren Sie bitte über die Lösung.
Hier ist die Probe Klassen: 1. HeaderContext - InheritableThreadLocal Variable
public final class HeaderContext {
private HeaderContext() {}
private static final InheritableThreadLocal<String> GID = new InheritableThreadLocal<String>() {
@Override
protected String initialValue() {
return new String();
}
};
public static void clear() {
GID.remove();
}
public static void setGID(String gid) {
GID.set(gid);
}
public static String getGID() {
return GID.get();
}
}
2. TestGateway speichern
@Component
public interface TestGateway {
String testMethod(String name);
}
3. TestActivator
@Component
public class TestActivator {
public String testMethod(String name){
System.out.println("GID from Inheritable thread local ->"+HeaderContext.getGID());
return name;
}
}
4. Testklasse
@ContextConfiguration(locations = { "classpath:exec-channel-si.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class ThreadLocalGatewayTest {
@Autowired
TestGateway testGateway;
@Test
public void testBrokerageGateway() throws InterruptedException {
for(int i=1;i<=5;i++){
try {
HeaderContext.setGID("gid"+i);
System.out.println("done->" + testGateway.testMethod("name"+i));
} finally {
HeaderContext.clear();
}
Thread.sleep(2000);
}
}
}
5. SI Kontext
<task:executor id="taskExecutor" pool-size="2"/>
<context:component-scan base-package="sample.test"/>
<int:channel id="executorChannel">
<int:dispatcher task-executor="taskExecutor"/>
</int:channel>
<int:gateway id="testGateway"
service-interface="sample.test.TestGateway"
default-request-channel="executorChannel">
</int:gateway>
<int:service-activator input-channel="executorChannel" ref="testActivator"/>
Ausgabe
GID from Inheritable thread local ->gid1
output->name1
GID from Inheritable thread local ->gid2
output->name2
GID from Inheritable thread local ->gid1
output->name3
GID from Inheritable thread local ->gid2
output->name4
GID from Inheritable thread local ->gid1
output->name5
Wäre toll, wenn Sie etwas Code-Spiel von unserer Seite teilen würden. –
Ich habe den Beitrag mit einem einfachen Beispiel bearbeitet ... Ihre Hilfe wird sehr geschätzt. –