[SNMP4J] DefaultUdpTransportMapping class and ListenThread
Frank Fock
fock at agentpp.com
Tue Feb 3 01:31:59 CET 2009
Hi,
Since Socket.receive blocks until a packet is received,
I do not see any advantage of the suggested code.
Best regards,
Frank
Vivi Zhang wrote:
> Hi,
>
> I am looking at ways to tuning my application with embedded SNMP agent
> with SNMP4J and SNMP4J-Agent.
>
> I have two questions about the implementation of inner class
> ListernThread.
> Q1) Line 315 * try {
> socket.receive(packet);
> }
> catch (InterruptedIOException iiox) {
> if (iiox.bytesTransferred <= 0) {
> continue;
> }*
> If we see SocketTimeoutException since there is no packet to read, can
> we put the thread to a small break before it goes for another
> socket.receive() call? The suggestion is intended to ease some
> pressure on the CPU and network resource. Do you see any potential
> drawback from this change?
>
> Q2) Line 307 *DatagramPacket packet = new DatagramPacket(buf, buf.length,
> udpAddress.getInetAddress(),
> udpAddress.getPort());**
> *A DatagramPacket object is created repeatedly within the while
> loop. What is the drawback if we move the stmt outiside while loop. The
> logic behind this suggestion is avoiding object creating repeatedly
> withing the loop.
>
> Thanks.
>
> Vivi
>
> P.S.
>
> I am using SNMP4J 1.9.3c.
>
> Following is a section of code I cut from DefaultUdpTransportMapping.java.
> ============================================================================
>
>
> while (!stop) {
> * DatagramPacket packet = new DatagramPacket(buf, buf.length,
> udpAddress.getInetAddress(),
> udpAddress.getPort());*
> try {
> try {
> socket.receive(packet);
> }
> catch (InterruptedIOException iiox) {
> if (iiox.bytesTransferred <= 0) {
> * continue;*
> }
> }
> if (logger.isDebugEnabled()) {
> logger.debug("Received message from "+packet.getAddress()+"/"+
> packet.getPort()+
> " with length "+packet.getLength()+": "+
> new OctetString(packet.getData(), 0,
> packet.getLength()).toHexString());
> }
> ByteBuffer bis;
> // If messages are processed asynchronously (i.e. multi-threaded)
> // then we have to copy the buffer's content here!
> if (isAsyncMsgProcessingSupported()) {
> byte[] bytes = new byte[packet.getLength()];
> System.arraycopy(packet.getData(), 0, bytes, 0, bytes.length);
> bis = ByteBuffer.wrap(bytes);
> }
> else {
> bis = ByteBuffer.wrap(packet.getData());
> }
> fireProcessMessage(new UdpAddress(packet.getAddress(),
> packet.getPort()), bis);
> }
> catch (SocketTimeoutException stex) {
> // ignore
> }
> catch (PortUnreachableException purex) {
> synchronized (DefaultUdpTransportMapping.this) {
> listener = null;
> }
> logger.error(purex);
> if (logger.isDebugEnabled()) {
> purex.printStackTrace();
> }
> if (SNMP4JSettings.isFowardRuntimeExceptions()) {
> throw new RuntimeException(purex);
> }
> break;
> }
> catch (SocketException soex) {
> logger.error("Socket for transport mapping "+toString()+
> " error: "+soex.getMessage(), soex);
> stop = true;
> }
> catch (IOException iox) {
> logger.warn(iox);
> if (logger.isDebugEnabled()) {
> iox.printStackTrace();
> }
> if (SNMP4JSettings.isFowardRuntimeExceptions()) {
> throw new RuntimeException(iox);
> }
> }
> }
> synchronized (DefaultUdpTransportMapping.this) {
> listener = null;
> stop = true;
> if (socket != null) {
> socket.close();
> }
> }
> _______________________________________________
> SNMP4J mailing list
> SNMP4J at agentpp.org
> http://lists.agentpp.org/mailman/listinfo/snmp4j
--
AGENT++
http://www.agentpp.com
http://www.mibexplorer.com
http://www.mibdesigner.com
More information about the SNMP4J
mailing list