ããã«ã¡ã¯ãïŒ ãŠãŒã¶ãŒåïŒ ã
ããã«èšããªããã°ãªããªãã®ã¯ããã®æçš¿ã®99ïŒ ãJava EEã³ãã¯ã¿ã¢ãŒããã¯ãã£ã«é¢ãããã®ã§ãããã³ãŒãäŸããããšããããšã§ãã Fidonetã«ã€ããŠ1ïŒ ãç²åŸããã®ã¯ãæåŸã«ç解ã§ããã§ãããã
æ ãè
ã®ããã«åé
JMSããã³JCA-å
åŒåä¿¡ããã¯ã¹ã¯MessageDrivenBeanãåãå
¥ããçºä¿¡éä¿¡è
ã¯ConnectionFactoryãä»ããŠéä¿¡ãããŸãã
ã€ã³ããŠã³ãæ¥ç¶ã®æå°ããã±ãŒãžã¯ãã¢ãŠãããŠã³ãæ¥ç¶ã®å Žåã¯4ã¯ã©ã¹-8ã¯ã©ã¹ã§ãããã¢ããã¿ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒåŽã§æ§æãããŸãã
ããã«-詳现ãšçã¿ã®ã¿
ã€ã³ããŠã³ãæ¥ç¶ã®æå°ããã±ãŒãžã¯ãã¢ãŠãããŠã³ãæ¥ç¶ã®å Žåã¯4ã¯ã©ã¹-8ã¯ã©ã¹ã§ãããã¢ããã¿ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒåŽã§æ§æãããŸãã
ããã«-詳现ãšçã¿ã®ã¿
ãããã-åé¡ã®æŽå²ãšããžãã¹äžã®åé¡ã®è§£æ±ºçã
åé¡ã®å£°æ
æ¢åã®ããžãã¹ã·ã¹ãã ïŒãã·ã¹ãã AãïŒããäœå¹Žãåã«éçºãããç¬èªã®ããŒã¿è»¢éãããã³ã«ïŒãã·ã¹ãã BãïŒã®ã¿ãç解ããå¥ã®ã·ã¹ãã ãšçµ±åããã¿ã¹ã¯ãäžããããŸããã ä»ã®äººã®ã·ã¹ãã ãå€æŽããããšã¯äžå¯èœã§ã;ãããã£ãŠãã¿ã¹ã¯ã¯ç¹å®ã®ãã¹/ãããã·ãæžãããšã«èŠçŽãããŸãã çµ±åã¯ãã¡ãã»ãŒãžããã圢åŒããå¥ã®åœ¢åŒã«å€æããããã»ã¹ã§ããåãããããšã«ãããŸãã
ã·ã¹ãã ãAãã«ã¯å€ãã®ææ°ã®çµ±åã¡ã«ããºã ããããæã䜿ãããããã®ã¯WebãµãŒãã¹ãšããŠèªèãããŠããŸããã JEEã®æšæºçãªçµ±åã¹ã±ã«ãã³-JAX-WS + EJB +ä¿èšŒãããã¡ãã»ãŒãžé ä¿¡ã®ããã®JMSãããã®å Žåã«éããã«æåºãããŸããã
ããããã·ã¹ãã ãBãã§åäœããæšæºããŒã«ã¯ãããŸããã§ããã EJBã³ã³ããã¹ããããããã¯ãŒã¯ãæäœããããšããTimidã®è©Šã¿ã¯å€±æã«çµãããŸãããGoogleã¯ãã®åé¡ã«å¯Ÿãã2ã€ã®è§£æ±ºçãææ¡ããŸããã 2çªç®ã®ãã¹ãéžæãããããšã¯æããã§ãã以åã¯JCAã§åããããšã¯ãªãã£ãã®ã§ãäœãæ°ããããšãåŠã¶ã®ã¯åžžã«é¢çœãã§ãã
ãªãµãŒã
Googleãæãå§ããŠãç§ã¯ããªãäžæããŸããã 圌ãã¯WHATãæžãããã¹ãŠã®å ŽæïŒã³ãã¯ã¿ãŒããããŒãžã£ãŒãã¢ããã¿ãŒãªã©ïŒãæ£ç¢ºã«è¡ãå¿ èŠããããŸããããããè¡ãæ¹æ³ãã»ãšãã©æžããŸããã§ããã ãä»ã®äººã®ã³ãŒããèŠãŠããã»ã¹ãç解ãããæšæºçãªæ¹æ³ã¯å€±æããŸãã-ä»ã®äººã®ã³ãŒãã¯éåžžã«è²§åŒ±ã§ãããããäœããç解ããããšãã§ããŸããã§ããã
JSR 322ãšgoogle codeã§å¯äžã®google adapterã®2ã€ãå©ãã«ãªããŸããã å®éããããåºçºç¹ã§ãããjca-socketsãããµã³ãã«ãå±éããpdfãéããšãå®éã®åäœãå®éã«ç解ããŠç解ãå§ããŸããã
調æ»ãšå®éšã«çŽ16æéãè²»ãããŠã次ã®ããšãããããŸããã
JCAã¢ãžã¥ãŒã«ã«ã¯ãå éšã«InboxãšOutboxã®2ã€ã®ç¬ç«ããéšåããããŸãã ãããã®ããŒãã¯ãäžç·ã«ããããšãå¥ã ã«ããããšãã§ããŸãã ããã«ãããã€ããããŸãã ã¢ãžã¥ãŒã«èªäœã¯javax.resource.spi.ResourceAdapterãå®è£ ããã¯ã©ã¹ã«ç»é²ããã META-INF / ra.xmlã§æå®ãããŸãã ãResourceAdapterã¯äž»ã«Inboxã§ã®äœæ¥ã«å¿ èŠã§ãã Outboxã®å Žåãã¢ããã¿ãŒã¯äœãããããã®ã¹ã±ã«ãã³ãåããããšããã§ããŸããã
åä¿¡ãã¬ã€
çä¿¡ãã£ãã«ã¯MessageEndpoint 'yïŒéåžžã¯@MessageDrivenBeanã§ããã¯ããJCAã¯JMSã®æ ¹æºã§ãïŒã«ãã€ã³ãã ã ActivationSpec ' ohmã«ãã£ãŠã¢ã¯ãã£ãåãããŸãã
META-INF / ra.xml -ResourceAdapterããã³ã€ã³ããŠã³ãã¹ããªãŒã ã®èª¬æ
ra.xml
<connector xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/connector_1_7.xsd" version="1.7" metadata-complete="true"> <vendor-name>xxx-services</vendor-name> <eis-type>FidoNet</eis-type> <resourceadapter-version>2.5</resourceadapter-version> <resourceadapter> <!-- , javax.resource.spi.ResourceAdapter; config-property - , / --> <resourceadapter-class>in.fidonode.binkp.ra.BinkpServerResourceAdapter</resourceadapter-class> <config-property> <config-property-name>version</config-property-name> <config-property-type>java.lang.String</config-property-type> <config-property-value>jnode-jee 2.5 binkp/1.1</config-property-value> </config-property> <!-- --> <inbound-resourceadapter> <messageadapter> <messagelistener> <!-- , @MessageDrivenBean , --> <messagelistener-type>in.fidonode.binkp.ra.BinkpMessageListener</messagelistener-type> <activationspec> <!-- - , @ActivationConfigProperty, --> <activationspec-class>in.fidonode.binkp.ra.BinkpActivationSpec</activationspec-class> <!-- --> <required-config-property> <config-property-name>listenPort</config-property-name> </required-config-property> <!-- --> <config-property> <config-property-name>listenPort</config-property-name> <config-property-type>java.lang.Integer</config-property-type> <config-property-value>24554</config-property-value> </config-property> </activationspec> </messagelistener> </messageadapter> </inbound-resourceadapter> </resourceadapter> </connector>
BinkpMessageListenerã€ã³ã¿ãŒãã§ã€ã¹ã¯ã¯ã©ã€ã¢ã³ãçšã§ãããã¯ã©ã¹ãã¹ã«ããå¿ èŠããããŸãã
ããã«æã£ãŠããŸãïŒ
public interface BinkpMessageListener { public void onMessage(FidoMessage message); }
次ã«ã ResourceAdapterã®æãåçŽãªå®è£ ãæ€èšããŸãã
BinkpServerResourceAdapter.java
public class BinkpServerResourceAdapter implements ResourceAdapter, Serializable { private static final long serialVersionUID = 1L; private static Logger log = Logger.getLogger(BinkpServerResourceAdapter.class .getName()); private ConcurrentHashMap<BinkpActivationSpec, BinkpEndpoint> activationMap = new ConcurrentHashMap<BinkpActivationSpec, BinkpEndpoint>(); private BootstrapContext ctx; private String version; @Override public void endpointActivation(MessageEndpointFactory endpointFactory, ActivationSpec spec) throws ResourceException { BinkpEndpoint activation = new BinkpEndpoint(ctx.getWorkManager(), (BinkpActivationSpec) spec, endpointFactory); activationMap.put((BinkpActivationSpec) spec, activation); activation.start(); log.info("endpointActivation(" + activation + ")"); } @Override public void endpointDeactivation(MessageEndpointFactory endpointFactory, ActivationSpec spec) { BinkpEndpoint activation = activationMap.remove(spec); if (activation != null) activation.stop(); log.info("endpointDeactivation(" + activation + ")"); } @Override public void start(BootstrapContext ctx) throws ResourceAdapterInternalException { this.ctx = ctx; log.info("start()"); } @Override public void stop() { for (BinkpEndpoint act : activationMap.values()) { act.stop(); } activationMap.clear(); log.info("stop()"); } @Override public XAResource[] getXAResources(ActivationSpec[] arg0) throws ResourceException { return null; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } }
ããã§äœãèµ·ãã£ãŠããŸããïŒ JCAã¢ãžã¥ãŒã«ãããŒãããããšãBinkpServerResourceAdapterã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããã®ãã©ã¡ãŒã¿ãŒïŒãã®å Žåã¯ããŒãžã§ã³ãã£ãŒã«ãïŒãå ¥åãããstartïŒïŒã¡ãœãããåŒã³åºãããŸãã
å®éãstartïŒïŒã¡ãœããå ã§å€ãã®ããšãã§ããŸããããã®äŸã§ã¯ãåŸã§WorkManagerãååŸããããã«ã³ã³ããã¹ããä¿åããã ãã§ãã
ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã@MessageDrivenBeanãèŠã€ãããšãBeanãå®è£ ããã€ã³ã¿ãŒãã§ãŒã¹ã«ã¡ãã»ãŒãžãéä¿¡ããã¢ããã¿ãŒãèŠã€ããããšããŸãã JMSã®å Žåãããã¯MessageListenerã§ããã BinkpMessageListenerããããŸãã ActivationSpecãäœæããïŒ javax.resource.spi.ActivationSpecãå®è£ ããBinkpActivationSpecããããŸãïŒãactivationConfigã®ããŒã¿ã«åŸã£ãŠå ¥åããããã£ãŒã«ããMessageEndpointFactoryãäœæãããResourceAdapter.endpointActivationïŒïŒãåŒã³åºãããŸãã ãã®æ©èœã§ã¯ãMDBã«ãã£ãæ§æã«åºã¥ããŠäœæããããã«ãtcp / ipãµãŒããŒãŸãã¯unix-socketã§åäœããã¹ããªãŒã ã®ãããã§ãã£ãŠããçä¿¡æ¥ç¶ãåãå ¥ããããµãŒããŒããäœæããå¿ èŠããããŸãã BinkpEndpointã¯ã©ã¹ã¯ããŸãã«ãã®ããµãŒããŒãã§ãã
Binkpendnd.java
public class BinkpEndpoint implements Work, FidoMessageListener { private static final Logger logger = Logger.getLogger(BinkpEndpoint.class .getName()); private BinkpServer server; private final WorkManager workManager; private final MessageEndpointFactory messageEndpointFactory; public BinkpEndpoint(WorkManager workManager, BinkpActivationSpec activationSpec, MessageEndpointFactory messageEndpointFactory) { this.workManager = workManager; this.messageEndpointFactory = messageEndpointFactory; server = new BinkpServer(activationSpec.getListenPort(), this); } public void start() throws ResourceException { workManager.scheduleWork(this); } public void stop() { if (server != null) { server.stop(); } } /** FidoMessageListener **/ @Override public Message incomingMessage(FidoMessage message) { String message = msg.encode(); BinkpMessageListener listener = (BinkpMessageListener) messageEndpointFactory .createEndpoint(null); listener.onMessage(message); } /** Work **/ @Override public void run() { server.start(); } /** Work **/ @Override public void release() { stop(); } }
äžéšã®ãšã³ããã€ã³ããã©ãã«ã§ã衚瀺ãããããšã«æ°ä»ããããããŸããã ç§ã¯ããã«ããã€ãã®ã®ã£ã°ããã£ãã®ã§ã解èªããŸãïŒ
ãšã³ããã€ã³ãã¯ãçä¿¡ã¹ããªãŒã ããªãã¹ã³ããŠãããã®ã§ãã ããã¯ãendpointActicationé¢æ°ãé©çšãããå Žæã§ãã
MessageEndpoint-ç¹å®ã®ã¡ãã»ãŒãžãåŠçããMDBã€ã³ã¹ã¿ã³ã¹ã MessageEndpointFactory.createEndpointïŒïŒãåŒã³åºããŠååŸããŸãïŒãã®é¢æ°ã¯ã¡ã€ã³ã¹ã¬ããããåŒã³åºãããšã¯ã§ããŸããïŒã MDBã€ã³ã¿ãŒãã§ãŒã¹ã«ç°¡åã«ãã£ã¹ãã§ããŸãã
å®éã«ã¯ãããã ãã§ãã äžèŠãªBinkpServerã®å®è£ ã¯çç¥ããŸãããååã¯æ確ã§ããå¿ èŠããããŸããæå°ã®ãã€ã³ããŠã³ããJCAã¯4ã€ã®ã¯ã©ã¹ïŒResourceAdapterãMessageListenerãActivationSpecãEndpointïŒã§æ§æãããŸãã
ãšã³ããã€ã³ãã®äœæãšçä¿¡ã®åŠçïŒ
@MessageDriven(messageListenerInterface = BinkpMessageListener.class, activationConfig = { @ActivationConfigProperty(propertyName = "listenPort", propertyValue = "24554") }) public class ReceiveMessageBean implements BinkpMessageListener { @Override public void onMessage(FidoMessage msg) { // do smth with mesaage } }
çºä¿¡
ãããŠããã§ã¯ããã¹ãŠããã£ãšæ¥œãããæå°ã®ãçºä¿¡ãJCAã¯æ倧8ã¯ã©ã¹ã§æ§æãããŠãããããã¯ãçä¿¡ãã®2åã§ãã ããããé çªã«èŠãŠã¿ãŸãããã
META-INF / ra.xml -ResourceAdapterããã³ã¢ãŠãããŠã³ãã¹ããªãŒã ã®èª¬æ
ra.xml
<connector xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/connector_1_7.xsd" version="1.7" metadata-complete="true"> <vendor-name>xxx-services</vendor-name> <eis-type>FidoNet</eis-type> <resourceadapter-version>2.5</resourceadapter-version> <resourceadapter> <!-- , javax.resource.spi.ResourceAdapter; config-property - , / --> <resourceadapter-class>in.fidonode.binkp.ra.BinkpServerResourceAdapter</resourceadapter-class> <config-property> <config-property-name>version</config-property-name> <config-property-type>java.lang.String</config-property-type> <config-property-value>jnode-jee 2.5 binkp/1.1</config-property-value> </config-property> <!-- . --> <outbound-resourceadapter> <connection-definition> <!-- JEE-, --> <managedconnectionfactory-class>in.fidonode.binkp.ra.ManagedConnectionFactory</managedconnectionfactory-class> <!-- , . classpath --> <connectionfactory-interface>in.fidonode.binkp.ra.ConnectionFactory</connectionfactory-interface> <connectionfactory-impl-class>in.fidonode.binkp.ra.ConnectionFactoryImpl</connectionfactory-impl-class> <!-- , . classpath --> <connection-interface>in.fidonode.binkp.ra.Connection</connection-interface> <connection-impl-class>in.fidonode.binkp.ra.ConnectionImpl</connection-impl-class> </connection-definition> <!-- , --> <transaction-support>NoTransaction</transaction-support> <reauthentication-support>false</reauthentication-support> </outbound-resourceadapter> <!-- --> <inbound-resourceadapter> <!-- ... --> </inbound-resourceadapter> </resourceadapter> </connector>
Connectionããã³ConnectionFactoryã€ã³ã¿ãŒãã§ãŒã¹ã¯ã¯ã©ã€ã¢ã³ãçšã§ãããã¯ã©ã¹ãã¹ã«ããå¿ èŠããããŸãã ããã«ããããããã«æã£ãŠããŠãã ãããé¢çœããã®ã¯äœããããŸããã
BinkpClientã¯æäŸããŸãã:-)
public interface Connection { public BinkpClient connect(String hostname, int port); } public interface ConnectionFactory { public Connection createConnection(); }
æ¥ç¶ã¯ç®¡ç察象ããã³ç®¡ç察象å€ã§ãã 1ã€ç®-ãã€ãã¹ã«ããªã¹ããŒããã®ä»ã2ã€ç®-ãªãã
ManagedConnectionFactoryãå®è£ ããã¯ã©ã¹ã¯ãäž¡æ¹ã®ã¿ã€ãã®æ¥ç¶ãäœæã§ããå¿ èŠããããŸãã
ManagedConnectionFactory.java
public class ManagedConnectionFactory implements javax.resource.spi.ManagedConnectionFactory { private PrintWriter logwriter; private static final long serialVersionUID = 1L; /** * unmanaged- */ @Override public Object createConnectionFactory() throws ResourceException { return new ConnectionFactoryImpl(); } /** * managed- managed-connection */ @Override public Object createConnectionFactory(ConnectionManager cxManager) throws ResourceException { return new ManagedConnectionFactoryImpl(this, cxManager); } /** * managed- */ @Override public ManagedConnection createManagedConnection(Subject subject, ConnectionRequestInfo cxRequestInfo) throws ResourceException { return new in.fidonode.binkp.ra.ManagedConnection(); } @Override public PrintWriter getLogWriter() throws ResourceException { return logwriter; } @SuppressWarnings("rawtypes") @Override public ManagedConnection matchManagedConnections(Set connectionSet, Subject subject, ConnectionRequestInfo cxRequestInfo) throws ResourceException { ManagedConnection result = null; Iterator it = connectionSet.iterator(); while (result == null && it.hasNext()) { ManagedConnection mc = (ManagedConnection) it.next(); if (mc instanceof in.fidonode.binkp.ra.ManagedConnection) { result = mc; } } return result; } @Override public void setLogWriter(PrintWriter out) throws ResourceException { logwriter = out; } }
ã¢ããªã±ãŒã·ã§ã³ãJEEãµãŒããŒããã³ãã¯ã¿ãèŠæ±ãããšãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã¯ManagedConnectionFactoryã«ConnectionFactoryãäœæããããèŠæ±ãããããã¢ããªã±ãŒã·ã§ã³ã«æž¡ããŸãã
ã芧ã®ãšããã ConnectionFactoryã管çããã³é管çã§ãã ååãšããŠãããã¯ãã¹ãŠ1ã€ã®ã¯ã©ã¹ã«æžããããšãã§ããŸãããäœãã©ã®ããã«è»¢éãããããã©ã³ã¶ã¯ã·ã§ã³ããããã©ãããªã©ã«å€§ããäŸåããŸãã
ConnectionFactoryImlã¯æ°ããConnectionImplïŒïŒãäœæããã ãã§ããã ManagedConnectionFactoryImplã¯ããå°ãè€éã§ãã
ManagedConnectionFactoryImpl.java
public class ManagedConnectionFactoryImpl implements ConnectionFactory { private ManagedConnectionFactory factory; private ConnectionManager manager; public ManagedConnectionFactoryImpl(ManagedConnectionFactory factory, ConnectionManager manager) { super(); this.factory = factory; this.manager = manager; } /** managed- -ManagedConnectionFactory **/ @Override public Connection createConnection() { try { return (Connection) manager.allocateConnection(factory, null); } catch (ResourceException e) { return null; } } }
javax.resource.spi.ManagedConnectionãå®è£ ããManagedConnectionã¯ããã€ãã¹ã«ãšãªã¹ããŒãè¿œå ããã ãã®Connectionã€ã³ã¿ãŒãã§ã€ã¹ã®ã©ãããŒã§ãã ManagedConnectionFactoryImpl.createConnectionïŒïŒããConnectionManager.allocateConnectionïŒïŒçµç±ã§æ¥ç¶ãäœæãããšãã«åŒã³åºãManagedConnectionFactory.createManagedConnectionïŒïŒãè¿ãã®ã¯ãã®ã¯ã©ã¹ã§ãã
ManagedConnection.java
public class ManagedConnection implements javax.resource.spi.ManagedConnection { private PrintWriter logWriter; private Connection connection; private List<ConnectionEventListener> listeners; public ManagedConnection() { listeners = Collections .synchronizedList(new ArrayList<ConnectionEventListener>()); } @Override public void associateConnection(Object connection) throws ResourceException { if (connection != null && connection instanceof Connection) { this.connection = (Connection) connection; } } @Override public Object getConnection(Subject subject, ConnectionRequestInfo cxRequestInfo) throws ResourceException { if (connection == null) { connection = new ManagedConnectionImpl(); } return connection; } @Override public void cleanup() throws ResourceException { } @Override public void destroy() throws ResourceException { } @Override public PrintWriter getLogWriter() throws ResourceException { return logWriter; } @Override public ManagedConnectionMetaData getMetaData() throws ResourceException { throw new NotSupportedException(); } @Override public XAResource getXAResource() throws ResourceException { throw new NotSupportedException(); } @Override public LocalTransaction getLocalTransaction() throws ResourceException { return null; } @Override public void setLogWriter(PrintWriter out) throws ResourceException { logWriter = out; } @Override public void addConnectionEventListener(ConnectionEventListener listener) { if (listener != null) { listeners.add(listener); } } @Override public void removeConnectionEventListener(ConnectionEventListener listener) { if (listener != null) { listeners.remove(listener); } } }
ããŠãä»ãç§ãã¡ã¯æãç°¡åãªããšã«ãªããŸã-æ¥ç¶ãå®è£ ãã:-)
public class ConnectionImpl implements Connection { @Override public BinkpClient connect(String hostname, int port) { return new BinkpClient(hostname, port); } }
ã¢ãŠãããŠã³ãæ¥ç¶ã確ç«ããçºä¿¡ã³ãŒã«ãã§ãŒã³
ManagedConnectionFactory.createConnectionFactoryïŒïŒ
-> ManagedConnectionFactoryImpl.createConnectionïŒïŒ
-> onnectionManager.allocateConnectionïŒïŒ
---> ManagedConnectionFactory.createManagedConnectionïŒïŒ
----> ManagedConnection.getConnectionïŒïŒ
-----> ManagedConnectionImpl.connectïŒïŒ
ããŠããã®ã¢ããã¿ã§åäœããããã«ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒãæ§æããããšãå¿ããªãã§ãã ããããŸããjndiãæå®ããŠãã ããã
åŒã³åºãã³ãŒãïŒ
private BinkpClient createBinkpClient(String host, int port) { ConnectionFactory cf = ((ConnectionFactory) new InitialContext().lookup("java:eis/BinkpConnectionFactory")); Connection conn = cf.getConnection(); return conn.connect(host, port); }
ãããŠããã£ãã¯ã©ãã«ããŸããïŒ
ãããŠãã»ãšãã©çç±ã¯ãããŸããã å®éã®ãšãããå ã®ã¿ã¹ã¯ã¯binkpã«é¢ãããã®ã§ã¯ãªããæ©èœããŠãããããNDAã®å¯Ÿè±¡ãšãªããŸããã ãããã£ãŠãJCAãç解ããHabréã«é¢ããèšäºãæžãããã«å¿ èŠãªãã®ã決å®ããåŸïŒæ¯ãè¿ã£ãŠã¿ããšã誰ããã®ãããªèšäºãæžããŠããªãçç±ãç解ãå§ããŸããããã¯ãã©ã³ã¶ã¯ã·ã§ã³ãªãã§ãïŒïŒããŒããåäžã®è³ãšããŠå®è¡ããŸãã ãã€ãŠãç§ããããžã§ã¯ããéå§ããã«ã¯JCAã®ç¥èã§ã¯äžååã§ãã:-)
ãã®ããã«ãç§ã¯äžèšã®äŸãæžããŸããããããŠã圌ãã¯åãããããŸããã ãããã£ãŠãäžè¬çã«Java eeãç·Žç¿ããç¹ã«Java seãããªãã¡ã¯ã¿ãªã³ã°ããå Žåã¯ãæåãæžããŠã³ãŒããã³ãããããŠãã ããã ã¯ããç§ã¯ãŸã ãã€ã³ããåããŸãã
ãéèŽããããšãããããŸããã ã¿ã€ããã¹ã¯ã³ã¡ã³ãã«æžãããšãã§ããŸããç§ã¯ããããããããããããšã¯ééããããŸããã