Quarkuså ¥é
GlassFish Users Group Japan åå¼·ä¼ 2019 Springã§Quarkusã«ã¤ãã¦ç´¹ä»ãã¾ããã話ããã¨æã£ã¦ããããã©ãã¹ã©ã¤ãã«å ¥ããªãã£ããã¨ãããã°ã§è£è¶³ãã¦ã¿ã¾ãã
Quarkusã¨ã¯ä½ã
ã¨ã«ããèµ·åãé«é㪠Java EE / MicroProfile ãã¼ã¹ã®APIã§ã³ã¼ããæ¸ãããã¬ã¼ã ã¯ã¼ã¯ã§ããã¹ã©ã¤ãä¸ã§ãè¨åãã¦ãã¾ãããGraalVMã®native-imageã³ãã³ãã«ãã£ã¦ãã¤ãã£ãã³ã³ãã¤ã«ããã¨100ããªãåãã¹ãã¼ãã§JAX-RS/CDI/JPAã§æ§æãããCRUDã¢ããªã±ã¼ã·ã§ã³ãèµ·åãã¾ãã
Javaã¯èµ·åãé ããGoã®ãããªã·ã³ã°ã«ãã¤ããªã«ããèµ·åã®æ¹ã便å©ã§Javaã¯æéãæããã¨è¨ããã課é¡ã解決ãã¦ãã¾ãã
ç¶ãã«ã¤ãã¦ã¯ã¹ã©ã¤ããåç
§ãã¦ãã ãããããããã¯ãã¹ã©ã¤ãã«å
¥ããªãã£ãå
容ãã彿¥è©±ããã¨æã£ã¦ãããã©å¿ãã¦ããå
容ãã¾ã¨ãã¾ãã
Quarkusããã«ãæã«èªåçæããã¯ã©ã¹
mvn clean package
ããã¨ãtarget/wiring-classes
ã«Quarkusããã«ãæã«ã¯ã©ã¹ãã¡ã¤ã«ãå±éãã¦uber-jarã®ä¸ã«å«ãããããªåãããã¾ããJAX-RS/CDI/JPAã®ãµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ã®å ´åãã¢ããªã±ã¼ã·ã§ã³ã®ããã±ã¼ã¸sample.quarkus.jpajaxrscdijta
ã ãã§ãªããã©ã³ã¿ã¤ã èªä½ã®ã¯ã©ã¹ãã¡ã¤ã«ãçæããã¦ããæ§åããããã¾ãã
$ tree target/wiring-classes target/wiring-classes âââ META-INF â  âââ build-config.properties â  âââ quarkus-default-config.properties â  âââ services â  âââ io.quarkus.arc.ComponentsProvider â  âââ io.quarkus.arc.ResourceReferenceProvider âââ io â  âââ quarkus â  âââ agroal â  â  âââ runtime â  â  âââ DataSourceProducer.class â  â  âââ DataSourceProducer_Bean$$function$$6.class â  â  âââ DataSourceProducer_Bean.class â  â  âââ DataSourceProducer_ClientProxy.class â  â  âââ DataSourceProducer_ProducerMethod_createDefaultDataSource_7c487e3ef869f878aa871e917c94f4d26d5d5c56_Bean.class â  âââ arc â  â  âââ ActivateRequestContextInterceptor_Bean.class â  â  âââ runtime â  â  â  âââ LifecycleEventRunner_Bean.class â  â  âââ runtimebean â  â  â  âââ RuntimeBeanProducers.class â  â  âââ setup â  â  âââ Default_ComponentsProvider.class â  âââ deployment â  â  âââ steps â  â  âââ AgroalProcessor$build3.class â  â  âââ AgroalProcessor$configureRuntimeProperties6.class â  â  âââ ArcAnnotationProcessor$build10.class â  â  âââ ConfigBuildStep$validateConfigProperties11.class â  â  âââ HibernateOrmProcessor$build8.class â  â  âââ HibernateOrmProcessor$build9.class â  â  âââ HibernateOrmProcessor$startPersistenceUnits14.class â  â  âââ LifecycleEventsBuildStep$startupEvent17.class â  â  âââ LoggingResourceProcessor$setupLoggingRuntimeInit5.class â  â  âââ LoggingResourceProcessor$setupLoggingStaticInit1.class â  â  âââ NarayanaJtaProcessor$build4.class â  â  âââ ResteasyScanningProcessor$setupInjection12.class â  â  âââ RuntimeBeanProcessor$build2.class â  â  âââ ThreadPoolSetup$createExecutor7.class â  â  âââ UndertowArcIntegrationBuildStep$integrateRequestContext13.class â  â  âââ UndertowBuildStep$boot16.class â  â  âââ UndertowBuildStep$build15.class â  âââ hibernate â  â  âââ orm â  â  âââ panache â  â  â  âââ PanacheEntity.class â  â  âââ runtime â  â  âââ DefaultEntityManagerProducer_Bean.class â  â  âââ DefaultEntityManagerProducer_ProducerField_entityManager_Bean.class â  â  âââ JPAConfig_Bean.class â  â  âââ RequestScopedEntityManagerHolder_Bean$$function$$7.class â  â  âââ RequestScopedEntityManagerHolder_Bean.class â  â  âââ RequestScopedEntityManagerHolder_ClientProxy.class â  â  âââ TransactionEntityManagers_Bean.class â  âââ narayana â  â  âââ jta â  â  âââ runtime â  â  âââ NarayanaJtaProducers_Bean.class â  â  âââ NarayanaJtaProducers_ProducerMethod_transactionManager_9989455b3b53ac81c17ca945c636473b7202fe4e_Bean$$function$$8.class â  â  âââ NarayanaJtaProducers_ProducerMethod_transactionManager_9989455b3b53ac81c17ca945c636473b7202fe4e_Bean.class â  â  âââ NarayanaJtaProducers_ProducerMethod_transactionManager_9989455b3b53ac81c17ca945c636473b7202fe4e_ClientProxy.class â  â  âââ NarayanaJtaProducers_ProducerMethod_transactionSynchronizationRegistry_ad29dd72d7aa0c9be8f98e90052c29fc262ea31a_Bean$$function$$9.class â  â  âââ NarayanaJtaProducers_ProducerMethod_transactionSynchronizationRegistry_ad29dd72d7aa0c9be8f98e90052c29fc262ea31a_Bean.class â  â  âââ NarayanaJtaProducers_ProducerMethod_transactionSynchronizationRegistry_ad29dd72d7aa0c9be8f98e90052c29fc262ea31a_ClientProxy.class â  â  âââ interceptor â  â  âââ TransactionalInterceptorMandatory_Bean.class â  â  âââ TransactionalInterceptorNever_Bean.class â  â  âââ TransactionalInterceptorNotSupported_Bean.class â  â  âââ TransactionalInterceptorRequired_Bean.class â  â  âââ TransactionalInterceptorRequiresNew_Bean.class â  â  âââ TransactionalInterceptorSupports_Bean.class â  âââ runner â  â  âââ ApplicationImpl1.class â  â  âââ AutoFeature.class â  â  âââ GeneratedMain.class â  âââ runtime â  âââ generated â  âââ BuildTimeConfig.class â  âââ BuildTimeConfigRoot.class â  âââ RunTimeConfig.class â  âââ RunTimeConfigRoot.class â  âââ RunTimeDefaultConfigSource.class âââ javax â  âââ enterprise â  â  âââ context â  â  â  âââ control â  â  â  âââ ActivateRequestContext_Shared_AnnotationLiteral.class â  â  âââ inject â  â  âââ Produces_Shared_AnnotationLiteral.class â  âââ persistence â  â  âââ PersistenceContext_Shared_AnnotationLiteral.class â  âââ transaction â  âââ Transactional_Shared_AnnotationLiteral.class âââ sample âââ quarkus âââ jpajaxrscdijta âââ EmployeeResource_Bean.class âââ EmployeeService_Bean$$function$$1.class âââ EmployeeService_Bean.class âââ EmployeeService_ClientProxy.class âââ EmployeeService_Subclass$$function$$2.class âââ EmployeeService_Subclass$$function$$3.class âââ EmployeeService_Subclass$$function$$4.class âââ EmployeeService_Subclass$$function$$5.class âââ EmployeeService_Subclass.class
ã¹ã©ã¤ãä¸ã§è¨åãã¦ãã以ä¸ã®ãããªã³ã¼ãã®@Injectã®è§£æ±ºã®å ´åã
package sample.quarkus. jpajaxrscdijta; @Path("/") public class EmployeeResource { @Inject private EmployeeService service;
wiring-classes/sample/quarkus/jpajaxrscdijta/EmployeeResource_Bean.class
ã«ã¤ã³ã¸ã§ã¯ã·ã§ã³å®è£
ãå«ã¾ãã¦ãããputfieldå½ä»¤ã§ã·ã³ãã«ã«ãã£ã¼ã«ãåservice
ã«å¤ãè¨å®ããã¯ã©ã¹ãã¡ã¤ã«ãèªåçæããã¦ããæ§åã確èªã§ãã¾ãã
javap -v wiring-classes/sample/quarkus/jpajaxrscdijta/EmployeeResource_Bean.class ... public sample.quarkus.jpajaxrscdijta.EmployeeResource create(javax.enterprise.context.spi.CreationalContext); descriptor: (Ljavax/enterprise/context/spi/CreationalContext;)Lsample/quarkus/jpajaxrscdijta/EmployeeResource; flags: ACC_PUBLIC ... 30: aload_3 31: checkcast #57 // class sample/quarkus/jpajaxrscdijta/EmployeeService 34: putfield #61 // Field sample/quarkus/jpajaxrscdijta/EmployeeResource.service:Lsample/quarkus/jpajaxrscdijta/EmployeeService;
ãããã®ã¯ã©ã¹ããããã¤ãã¦ããåçãã¤ãã³ã¼ãçæã§è¡ãã®ã§ã¯ãªããäºåã«å¯è½ãªå¦çã¯ãã«ãæã«å®è¡ãããããGraalVMã«ãã£ã¦ãã¤ãã£ããã¤ããªãçæããªãã¦ããjava -jarã§ã徿¥ã®Thorntail/WildFlyã¨æ¯è¼ãã¦é«éã«èµ·åãã¦ãã¾ãã
Quarkusã§ã¹ã¬ãããã³ã
GraalVM Community Editionã®native-imageã³ãã³ãã§çæãããå®è¡ãã¤ããªã§ã¯ãkill -3 (SIGQUIT) ãæããããã¨HotSpotJVMã¨ç°ãªãããã»ã¹ãçµäºãã¾ãã
Quarkusã§ã¯ã·ã°ãã«ãã³ãã©ãç¬èªã«å®è£
ãã¦ãããkill -3ãå®è¡ããã»ã¹ã«æããã¨ã³ã³ã½ã¼ã«ã«ã¹ã¬ãããã³ããåºåãã¾ããå
é¨çã«ã¯sun.misc.SignalHandler
ã使ã£ã¦å®è£
ãã¦ãã¾ãã
2019-05-21T14:22:58.915Z Thread dump follows: "XNIO-1 Accept" #22 prio=5 tid=0x7f6cb77e9700 java.lang.thread.State: RUNNABLE at com.oracle.svm.core.posix.headers.linux.LinuxEPoll.epoll_wait(LinuxEPoll.java) at sun.nio.ch.EPollArrayWrapper.epollWait(EPollArrayWrapper.java:326) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101) at org.xnio.nio.WorkerThread.run(WorkerThread.java:532) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:473) at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193) ...
ãã¼ããã³ãã¯GraalVM Enterprise Editionã«ããGraalVMã¬ã¤ã¤ã§å®ç¾ããã¦ãã¾ããç¡åã§å©ç¨å¯è½ãªGraalVM Community Editionã§ã¯ç¾ç¶ãã¼ããã³ããåå¾ãããã¨ã¯ã§ãã¾ããã
ã¾ã¨ã
Quarkusã¯MicroProfileãã¼ã¹ã®APIã§ã³ã¼ããæ¸ãããé«éèµ·åã®ãã¬ã¼ã ã¯ã¼ã¯ã§ããJBossç³»ã³ãã¥ããã£ç±æ¥ã¨ã®è£½åã¨ãã¦ã¯ãJava EEããJakarta EEã¸ã®ç§»ç®¡ã«ä¼´ãæ¨æºä»æ§ã®è¦³ç¹ã§ã¯å¤åããã£ããã«ãªã£ã¦ãã¾ããããMicroProfile仿§ã®ä¸é¨ãWildFlyã§å®è£ ããããQuarkusã®ãããªæ°ãã試ã¿ãè¡ããã¦ãã¾ãããã²è©¦ãã¦ã¿ãã®ã¯ãããã§ããããã