[
https://issues.apache.org/jira/browse/DIRMINA-1149?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Zhang Hua closed DIRMINA-1149.
------------------------------
Resolution: Not A Problem
> IoSession.write under multi-thread enviroment, lose message order
> -----------------------------------------------------------------
>
> Key: DIRMINA-1149
> URL: https://issues.apache.org/jira/browse/DIRMINA-1149
> Project: MINA
> Issue Type: Bug
> Components: Core
> Affects Versions: 2.0.21
> Environment: Java 1.8
> Windows 10
> Reporter: Zhang Hua
> Priority: Minor
> Attachments: minatest.zip
>
>
> I am writing a stress-test that tests multi-thread safetyness of
> IoSession.write method, and find lose message order.
> My test method is as follows
> 1. The client test code starts 50 threads, sharing the same IoSession object
> 2. Each test thread simulates a user and sends data in sequence
> I believe that the IoFilter I use meets the thread safety conditions
> The result I expect is that the server receives the data of each user in an
> orderly manner, but not
> Synchronizing on the session.write makes the problem go away;
> Do I really have to synchronize on the session to solve this issue?
>
> ClientDemo.java
> {code:java}
> public class ClientDemo {
> public static void main(String[] args) throws Exception {
> NioSocketConnector connector = new NioSocketConnector();
> DefaultIoFilterChainBuilder chain = connector.getFilterChain();
> chain.addLast("mdc", new MdcInjectionFilter());
> chain.addLast("codec", new ProtocolCodecFilter(new
> MessagePackCodecFactory()));
> TcpRPCHandler responseHandler = new TcpRPCHandler();
> connector.setHandler(responseHandler);
> connector.setConnectTimeoutCheckInterval(30);
> ConnectFuture cf = connector.connect(new
> InetSocketAddress("127.0.0.1", 9999));
> IoSession session = cf.awaitUninterruptibly().getSession();
> ExecutorService executor = Executors.newFixedThreadPool(50);
> for (int i = 0; i < 50; ++i) {
> executor.execute(new SenderWorker(i, session));
> }
> while (true) {
> Thread.sleep(5000);
> System.out.println("client alive......");
> // responseHandler.printProgress();
> } }
> }
> class SenderWorker implements Runnable {
> private int userId;
> private IoSession session; public SenderWorker(int userId, IoSession
> session) {
> this.userId = userId;
> this.session = session;
> } @Override
> public void run() {
> for (int i = 0; i < 100; ++i) {
> MessageData data = new MessageData(userId, i);
> /*synchronized (session)*/ {
> session.write(data);
> }
> if (i % 5 == 0) {
> try {
> Thread.sleep(10);
> } catch (Exception e) {
> }
> }
> }
> }
> }
> {code}
> See the attachment for the complete code, I use maven to manage the project
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]