Hey Krishan, You should probably consider using a CodecFilter as described
here -
https://mina.apache.org/mina-project/userguide/ch9-codec-filter/ch9-codec-filter.html

On Tue, Sep 18, 2018 at 11:11 PM Krishan Babbar <kb00449...@techmahindra.com>
wrote:

> Hi All,
>
> We are working on an IoT project and using "org.apache.mina" library
> (Version - 2.0.16) in our gateway adaptor (GA - Java Code).
> Device connects to our GA and GA send acknowledgement back to device for
> each message.
> We are using multi-threading for handling each packet from a device(s). It
> is also possible to have multiple messages in a single packet from device.
> It would be based on some delimiter.
>
> E.g. Following packet is having 5 messages. Here delimiter is "Header"
> HeaderMsg1HeaderMsg2HeaderMsg3HeaderMsg4HeaderMsg5
>
> Now Device is expecting 5 Acknowledgements one at a time like given below
> ACK1
> ACK2
> ACK3
> ACK4
> ACK5
>
> But we found following acknowledgements on device side. It is combining 2
> or more ACKs sometimes.
> ACK1ACK2
> ACK3
> ACK4ACK5
>
> Our code is given below. Acknowledgement code is highlighted. Kindly
> review and let us know what are we doing wrong?
> How does "session.write()" work? Will it not write immediately? I mean is
> it using some buffer and appending multiple ACKs before sending message
> back to device?
>
> Kindly suggest the solution.
>
>
> public abstract class AbstractListener {
>                 protected static final int BUFFER_SIZE = 1024;
>                 public void init(String portKey) throws IOException {
>                                 AbstractIoAcceptor acceptor =
> initInternal();
>                                 acceptor.setHandler(new RequestHandler());
>
> acceptor.getFilterChain().addLast("logger", new LoggingFilter());
>
> acceptor.getSessionConfig().setReadBufferSize(BUFFER_SIZE);
>
> acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
>                                 if (acceptor instanceof
> NioDatagramAcceptor) {
>                                                 ((NioDatagramAcceptor)
> acceptor).getSessionConfig().setReuseAddress(true);
>                                 }
>                                 acceptor.bind(new
> InetSocketAddress(Integer.parseInt(ServerConfigLoader.getInstance().getProperty(portKey))));
> }
> }
>
> public class RequestHandler extends IoHandlerAdapter {
>                 public RequestHandler() {
>                                 super();
>                 }
>
>                 @Override
>                 public void exceptionCaught(IoSession session, Throwable
> cause) throws Exception {
>                                 LOGGER.error("Exception caught in
> RequestHandler.exceptionCaught()", cause);
>                                 session.closeNow();
>                 }
>
>                 @Override
>                 public void messageReceived(IoSession session, Object
> message) throws Exception {
>                                 try {
>                                                 SocketAddress
> remoteAddress = session.getRemoteAddress();
>                                                 String msg =
> ((IoBuffer)message).getHexDump().replaceAll(" ", "");
>                                                 String strArray[] =
> remoteAddress.toString().split(":");
>
> ThreadAllocator.getInstance().allocateThread(session, msg);
>                                 } catch (Exception e) {
>                                                 throw e;
>                                 }
>                 }
> }
>
> public class ThreadAllocator {
>
>                 /** The thread pool. */
>                 private ExecutorService executorService = Executors
>
> .newWorkStealingPool(Integer.parseInt(ServerConfigLoader.getInstance().getProperty("threadPoolSize")));
>
>                 public void allocateThread(IoSession session, String
> message) {
>                                 executorService.execute(new
> HelperThread(null,session, message));
>                 }
> }
>
>
> public class HelperThread implements Runnable {
> private String message;
>                 private IoSession session;
>                 private SocketChannel socketSession;
>
>                 public HelperThread(SocketChannel socketSession, IoSession
> session, String message) {
>                                 if (session != null) {
>                                                 this.session = session;
>
> this.session.getConfig().setBothIdleTime(1800);
>                                 } else if (socketSession != null) {
>                                                 this.socketSession =
> socketSession;
>                                 }
>                                 this.message = message;
>                 }
>
>                 public void run() {
>                                 // E.g. message =
> "HeaderMsg1HeaderMsg2HeaderMsg3HeaderMsg4HeaderMsg5"
>
>                                 List<String> multiMessage =
> handleMultipleMessage(message);
>                                 for (String singleMessage : multiMessage) {
>                                                 byte[] response =
> AckBuilderFactory.getBuilderFactory(singleMessage)
>
>       .getBuilder(singleMessage).build(singleMessage);
>                                                 if (response != null) {
>                                                                 IoBuffer
> ioBuffer = IoBuffer.wrap(response);
>
> session.write(ioBuffer);
>                                                 }
>                                 }
>                 }
> }
>
> Thanks & Regards,
> Krishan Babbar
>
>
>
> ============================================================================================================================
> Disclaimer: This message and the information contained herein is
> proprietary and confidential and subject to the Tech Mahindra policy
> statement, you may review the policy at
> http://www.techmahindra.com/Disclaimer.html externally
> http://tim.techmahindra.com/tim/disclaimer.html internally within
> TechMahindra.
>
> ===========================================================================================================================
>
>
> ============================================================================================================================
>
> Disclaimer:  This message and the information contained herein is
> proprietary and confidential and subject to the Tech Mahindra policy
> statement, you may review the policy at
> http://www.techmahindra.com/Disclaimer.html <
> http://www.techmahindra.com/Disclaimer.html> externally
> http://tim.techmahindra.com/tim/disclaimer.html <
> http://tim.techmahindra.com/tim/disclaimer.html> internally within
> TechMahindra.
>
>
> ============================================================================================================================
>


-- 
Raghavendra Balgi
Bangalore
Phone: +91 7795816719
Email : rkba...@gmail.com <http://rkba...@gmail.com/rkba...@yahoo.com>

Reply via email to