рдЬрд╛рд╡рд╛ NIO рдореЗрдВ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди SUN / ONCRPC рд╕рд░реНрд╡рд░

DCache рд▓реЗрдЦ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ NFS рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдкреНрд░рджрд░реНрд╢рди рднреА рд╢реАрд░реНрд╖ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред NFS рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдХрд╣реЙрд░реНрд╕ ONCRPC рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИред DCache рдореЗрдВ, рд╣рдо grizzly nio рдврд╛рдВрдЪреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпреБрд╡рд╛ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЗрддрд┐рд╣рд╛рд╕

ONC RPC (рдУрдкрди рдиреЗрдЯрд╡рд░реНрдХ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рд░рд┐рдореЛрдЯ рдкреНрд░реЛрд╕рд┐рдЬрд░ рдХреЙрд▓) рд╕рди рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрдореНрд╕ рджреНрд╡рд╛рд░рд╛ 80 рдХреЗ рджрд╢рдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рдФрд░ NFSv2 рдХреЗ рд╕рд╛рде 1995 рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИред ONCRPC рдиреЗ рддреЗрдЬреА рд╕реЗ рд╡рд┐рддрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ 2000 рдХреА рд╢реБрд░реБрдЖрдд рддрдХ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕реЗ CORBA, SOAP, рдФрд░ рдмрд╛рдж рдореЗрдВ REST рдФрд░ JSON-RPC рдЬреИрд╕реЗ рдлреИрд╢рдиреЗрдмрд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рджреНрд╡рд╛рд░рд╛ рджрдмрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрднреА рднреА ONCRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рд╛рджрдЧреА рдФрд░ рдЧрддрд┐ рдлреИрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдиреЗрдЯрд╡рд░реНрдХ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рджреВрд╕рд░реА рдмрд╛рдЗрдХ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдордиреЗ рд░рд┐рдореЛрдЯ рдЯреА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЬрд▓реНрдж рд╣реА рд╣рдо рдРрд╕реА рд╕реАрдорд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд▓рдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛: рдЖрдИрдкреАрд╡реА 6, рдЬреАрдПрд╕рдПрд╕рдПрдкреАрдЖрдИ, рдПрдирдЖрдИрдУред рдЗрд╕рд▓рд┐рдП рдмрд╛рдЗрдХ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЦрд░реЛрдВрдЪ рд╕реЗ рдирд╣реАрдВред рд╣рдордиреЗ рд░рд┐рдореЛрдЯрдЯреА рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЛ рдЕрдзрд┐рдХрддрдо рд░рдЦрд╛ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ред



рдЧреНрд░рд┐рдЬрд▓реА-NIO

рдЕрд╕рд▓ рдореЗрдВ, рд╣рдордиреЗ рдЧреНрд░рд┐рдЬрд╝рд▓реА-рдПрдирдЖрдИрдУ рд▓рд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдЧреНрд▓рд╛рд╕рдлрд┐рд╢ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рднреА рдЖрдзреБрдирд┐рдХ рдПрдирдЖрдИрдУ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рддрд░рд╣, рдЧреНрд░рд┐рдЬрд▓реА рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рдХрдорд╛рдВрдб рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдо рдЙрди рдлрд┐рд▓реНрдЯрд░ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдШрдЯрдирд╛ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

package org.glassfish.grizzly.filterchain; import java.io.IOException; public interface Filter { public void onAdded(FilterChain fc); public void onRemoved(FilterChain fc); public void onFilterChainChanged(FilterChain fc); public NextAction handleRead(FilterChainContext fcc) throws IOException; public NextAction handleWrite(FilterChainContext fcc) throws IOException; public NextAction handleConnect(FilterChainContext fcc) throws IOException; public NextAction handleAccept(FilterChainContext fcc) throws IOException; public NextAction handleEvent(FilterChainContext fcc, FilterChainEvent fce) throws IOException; public NextAction handleClose(FilterChainContext fcc) throws IOException; public void exceptionOccurred(FilterChainContext fcc, Throwable thrwbl); } 


рд╣реИрдВрдбрд▓рдПрдХреНрд╕рдПрдПрдирдПрдХреНрд╕рдПрдХреНрд╕ рдХреЗ рддрд░реАрдХреЗ рдиреЗрдХреНрд╕реНрдЯрдПрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдЯреЙрдкрдПрд╢рди рдпрд╛ рдХрдВрдЯрд┐рдиреНрдпреВрдПрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ StopAction рджреЗрддрд╛ рд╣реИ, рддреЛ рдЪреЗрди рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИред рд╣рдо рдореБрдЦреНрдп рд░реВрдк рд╕реЗ handleRead рдФрд░ handleWrite рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдкрдврд╝рддреЗ рдФрд░ рд▓рд┐рдЦрддреЗ рд╕рдордп рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  @Override public NextAction handleRead(FilterChainContext ctx) throws IOException { Buffer messageBuffer = ctx.getMessage(); if (!isMessageArrived(messageBuffer)) { //     //    return ctx.getStopAction(messageBuffer); } //    ctx.setMessage(getMessage(messageBuffer)); return ctx.getInvokeAction(); } 


рд▓рдбрд╝рд╛рдИ рдХреЛрдб
 import java.io.IOException; import java.nio.ByteOrder; import org.glassfish.grizzly.Buffer; import org.glassfish.grizzly.filterchain.BaseFilter; import org.glassfish.grizzly.filterchain.FilterChainContext; import org.glassfish.grizzly.filterchain.NextAction; import org.glassfish.grizzly.memory.BuffersBuffer; public class RpcMessageParserTCP extends BaseFilter { /** * RPC fragment record marker mask */ private final static int RPC_LAST_FRAG = 0x80000000; /** * RPC fragment size mask */ private final static int RPC_SIZE_MASK = 0x7fffffff; @Override public NextAction handleRead(FilterChainContext ctx) throws IOException { Buffer messageBuffer = ctx.getMessage(); if (messageBuffer == null) { return ctx.getStopAction(); } if (!isAllFragmentsArrived(messageBuffer)) { return ctx.getStopAction(messageBuffer); } ctx.setMessage(assembleXdr(messageBuffer)); final Buffer reminder = messageBuffer.hasRemaining() ? messageBuffer.split(messageBuffer.position()) : null; return ctx.getInvokeAction(reminder); } @Override public NextAction handleWrite(FilterChainContext ctx) throws IOException { Buffer b = ctx.getMessage(); int len = b.remaining() | RPC_LAST_FRAG; Buffer marker = GrizzlyMemoryManager.allocate(4); marker.order(ByteOrder.BIG_ENDIAN); marker.putInt(len); marker.flip(); marker.allowBufferDispose(true); b.allowBufferDispose(true); Buffer composite = GrizzlyMemoryManager.createComposite(marker, b); composite.allowBufferDispose(true); ctx.setMessage(composite); return ctx.getInvokeAction(); } private boolean isAllFragmentsArrived(Buffer messageBuffer) throws IOException { final Buffer buffer = messageBuffer.duplicate(); buffer.order(ByteOrder.BIG_ENDIAN); while (buffer.remaining() >= 4) { int messageMarker = buffer.getInt(); int size = getMessageSize(messageMarker); /* * fragmen size bigger than we have received */ if (size > buffer.remaining()) { return false; } /* * complete fragment received */ if (isLastFragment(messageMarker)) { return true; } /* * seek to the end of the current fragment */ buffer.position(buffer.position() + size); } return false; } private static int getMessageSize(int marker) { return marker & RPC_SIZE_MASK; } private static boolean isLastFragment(int marker) { return (marker & RPC_LAST_FRAG) != 0; } private Xdr assembleXdr(Buffer messageBuffer) { Buffer currentFragment; BuffersBuffer multipleFragments = null; boolean messageComplete; do { int messageMarker = messageBuffer.getInt(); int size = getMessageSize(messageMarker); messageComplete = isLastFragment(messageMarker); int pos = messageBuffer.position(); currentFragment = messageBuffer.slice(pos, pos + size); currentFragment.limit(size); messageBuffer.position(pos + size); if (!messageComplete & multipleFragments == null) { /* * we use composite buffer only if required * as they not for free. */ multipleFragments = GrizzlyMemoryManager.create(); } if (multipleFragments != null) { multipleFragments.append(currentFragment); } } while (!messageComplete); return new Xdr(multipleFragments == null ? currentFragment : multipleFragments); } } 


рдпрджрд┐ рд╣рдо рдбреЗрдЯрд╛ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ, рддреЛ рд╣реИрдВрдбрд▓ рдХреЛ рдЕрдЧрд▓реА рдХреЙрд▓ рдореЗрдВ рдПрдХ рд╕рдордЧреНрд░ рдмрдлрд░ (рдХрдИ рдмрдлрд╝рд░реНрд╕ рд╕реЗ рдорд┐рд▓рдХрд░) рд╣реЛрдЧрд╛ред

рдЖрджрд┐рдо рд╕рд░реНрд╡рд░ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
  public static void main(String[] args) throws IOException { FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless(); filterChainBuilder.add(new TransportFilter()); filterChainBuilder.add(new /*   */); filterChainBuilder.add(new /*   */); final TCPNIOTransport transport = TCPNIOTransportBuilder.newInstance().build(); transport.setProcessor(filterChainBuilder.build()); transport.bind(HOST, PORT); transport.start(); System.in.read(); } 

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреГрд╖реНрда рдкрд░ рдЖрдк рдХрдИ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЧреНрд░рд┐рдЬрд╝рд▓реА рдорд╢реАрди рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдмрдирд╛рдПрдВрдЧреЗред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЦреБрдж рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред 24 рдХреЛрд░ рд╡рд╛рд▓реА рдорд╢реАрди рдкрд░, рд╣рдорд╛рд░рд╛ рдПрдирдПрдлрдПрд╕ рд╕рд░реНрд╡рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рдЧрднрдЧ рдПрдХ рд╣рдЬрд╛рд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд╡рдпрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реА рд╣реИ, рдФрд░ рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдЬрд▓реНрджреА рд╕реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдФрд░ рднреЗрдЬреЗ рдЧрдП рдкреИрдЪ рдФрд░ рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рджреЛрдиреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреА рд╣реИред

oncrpc4j

рд╕рднреА ONCRPC рдХреЛрдб рдХреЛ рдПрдХ рдЖрд╕рд╛рди-рд╕реЗ-рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдХреАрдХрд░рдг рд╡рд┐рдХрд▓реНрдк рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ - рдПрдХ рд╕реЗрд╡рд╛ рдЬрд┐рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреАрди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд░рдВрднрд┐рдХ рд╕реЗрд╡рд╛ред

рдПрдВрдмреЗрдбреЗрдб рдЖрд╡реЗрджрди

 import org.dcache.xdr.RpcDispatchable; import org.dcache.xdr.RpcCall; import org.dcache.xdr.XdrVoid; import org.dcache.xdr.OncRpcException; public class Svcd { private static final int DEFAULT_PORT = 1717; private static final int PROG_NUMBER = 111017; private static final int PROG_VERS = 1; public static void main(String[] args) throws Exception { RpcDispatchable dummy = new RpcDispatchable() { @Override public void dispatchOncRpcCall(RpcCall call) throws OncRpcException, IOException { call.reply(XdrVoid.XDR_VOID); } }; OncRpcSvc service = new OncRpcSvcBuilder() .withTCP() .withAutoPublish() .withPort(DEFAULT_PORT) .withSameThreadIoStrategy() .build(); service.register(new OncRpcProgram(PROG_NUMBER, PROG_VERS), dummy); service.start(); } } 


рд╡рд╕рдВрдд рдПрдХрддрд╛

рдореИрдВ XML рд╕реЗ рдирд╣реАрдВ рдбрд░рддрд╛
 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="my-rpc-svc" class="me.mypackage.Svcd"> <description>My RPC service</description> </bean> <bean id="my-rpc" class="org.dcache.xdr.OncRpcProgram"> <description>My RPC program number</description> <constructor-arg index="0" value="1110001" /> <constructor-arg index="1" value="1" /> </bean> <bean id="rpcsvc-builder" class="org.dcache.xdr.OncRpcSvcFactoryBean"> <description>Onc RPC service builder</description> <property name="port" value="1717"/> <property name="useTCP" value="true"/> </bean> <bean id="oncrpcsvc" class="org.dcache.xdr.OncRpcSvc" init-method="start" destroy-method="stop"> <description>My RPC service</description> <constructor-arg ref="rpcsvc-builder"/> <property name="programs"> <map> <entry key-ref="my-rpc" value-ref="my-rpc-svc"/> </map> </property> </bean> </beans> 



рдЙрддреНрдкрд╛рджрдХрддрд╛



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЧреНрд░рд╛рдл рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреЛрдб рди рдХреЗрд╡рд▓ 'рд╕реА' рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╕реЗ рднреА рдЖрдЧреЗ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рдмрдЧ рдХреЗ рдХрд╛рд░рдг, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ)ред

рдХреЛрдб рдЪреЛрд░реА рдФрд░ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП


рдХреЛрдб LGPL рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

Source: https://habr.com/ru/post/In199196/


All Articles