真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用Quarkus/GraalVM將JGroups編譯成可執(zhí)行文件

本篇內(nèi)容主要講解“如何使用Quarkus/GraalVM將JGroups編譯成可執(zhí)行文件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何使用Quarkus/GraalVM將JGroups編譯成可執(zhí)行文件”吧!

成都創(chuàng)新互聯(lián)公司主營柏鄉(xiāng)網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都APP應(yīng)用開發(fā),柏鄉(xiāng)h5微信平臺小程序開發(fā)搭建,柏鄉(xiāng)網(wǎng)站營銷推廣歡迎柏鄉(xiāng)等地區(qū)企業(yè)咨詢

What?

Quarkus 是一個(gè)將 Java 代碼編譯為本機(jī)代碼(使用GraalVM)并刪除運(yùn)行時(shí)不需要的代碼的框架。

Quarkus 在構(gòu)建階段分析代碼,并刪除在運(yùn)行時(shí)未使用的代碼,以便擁有一個(gè)可以快速啟動的小型可執(zhí)行文件。不過這意味著無法在運(yùn)行時(shí)使用反射,因?yàn)樵跇?gòu)建時(shí)刪除了所有未使用的類。 但是,可以在構(gòu)建時(shí)使用反射。

影響 JGroups 的其他限制是線程和套接字的創(chuàng)建。 兩者都無法在構(gòu)建時(shí)完成,但必須在運(yùn)行時(shí)完成。 

那么為Quarkus提供JGroups擴(kuò)展的重點(diǎn)是什么呢?

雖然JGroups應(yīng)用程序可以直接編譯為本機(jī)代碼(使用GraalVM的本機(jī)映像),但它很麻煩,并且必須重新構(gòu)建應(yīng)用程序以適應(yīng)本機(jī)編譯的限制。

相反,JGroups 擴(kuò)展提供了一個(gè)可以注入應(yīng)用程序的JChannel。 已根據(jù)配置文件創(chuàng)建通道,并通過擴(kuò)展連接(=加入群集)。 擴(kuò)展負(fù)責(zé)在正確的時(shí)間(構(gòu)建或運(yùn)行時(shí))執(zhí)行反射,套接字創(chuàng)建和線程啟動,用戶無需擔(dān)心這一點(diǎn)。

How?

接下來讓我們看一個(gè)具體的例子。

POM 引入擴(kuò)展 groupId=org.jgroups.quarkus.extension 和 artifactId=quarkus-jgroups. 這樣就可以提供一個(gè)可注入的 JChannel。

主類是 ChatResource,代碼如下:

@ApplicationScoped 
@Path("/chat")
public class ChatResource extends ReceiverAdapter implements Publisher {
    protected final Set> subscribers=new HashSet<>();

    @Inject JChannel channel;

    protected void init(@Observes StartupEvent evt) throws Exception {
        channel.setReceiver(this);
        System.out.printf("-- view: %s\n", channel.getView());
    }

    protected void destroy(@Observes ShutdownEvent evt) {
        Util.close(channel);
        subscribers.forEach(Subscriber::onComplete);
        subscribers.clear();
    }

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("/send/{msg}")
    public String sendMessage(@PathParam("msg") String msg) throws Exception {
        channel.send(null, Objects.requireNonNull(msg).getBytes());
        return String.format("message \"%s\" was sent on channel \n", msg);
    }

    @GET
    @Produces(MediaType.SERVER_SENT_EVENTS)
    @Path("/subscribe")
    public Publisher greeting() {
        return this;
    }

    public void receive(Message msg) {
        onNext(msg);
    }

    public void receive(MessageBatch batch) {
        for(Message msg: batch)
            onNext(msg);
    }

    public void viewAccepted(View view) {
        System.out.printf("-- new view: %s\n", view);
    }

    public void subscribe(Subscriber s) {
        if(s != null)
            subscribers.add(s);
    }

    protected void onNext(Message msg) {
        String s=new String(msg.getRawBuffer(), msg.getOffset(), msg.getLength());
        System.out.printf("-- from %s: %s\n", msg.src(), s);
        subscribers.forEach(sub -> sub.onNext(s));
    }
}

它有一個(gè)由Arc注入的JChannel通道(Quarkus中使用的依賴機(jī)制)。 該通道在注入時(shí)已經(jīng)完全創(chuàng)建并連接。

receive(Message) 和 receive(MessageBatch) 方法接收由其自身或集群中的其他成員發(fā)送的消息。 它反過來通過Publisher接口發(fā)布它們。 因此,所有訂戶都將收到群集中發(fā)送的所有消息。

當(dāng)收到格式為http://localhost:8080/chat/send/mymessage 的 URL 時(shí),將調(diào)用 sendMessage() 方法。 它接受字符串參數(shù)(“mymessage”)并使用注入的通道將其發(fā)送給集群的所有成員。

URL http://localhost:8080/chat/subscribe (或者在瀏覽器中的 http://localhost:8080/streaming.html) 可用來訂閱消息。

演示

接下來我們運(yùn)行兩個(gè)實(shí)例的集群,打開兩個(gè)命令行窗口,并輸入如下的命令:

Shell1:
[belasmac] /Users/bela/quarkus-jgroups-chat$ mvn compile quarkus:dev 
...
[INFO] --- quarkus-maven-plugin:0.18.0:dev (default-cli) @ quarkus-jgroups-chat ---
2019-07-03 14:12:05,025 DEBUG [org.jgr.qua.ext.JChannelTemplate] (main) creating channel based on config config=chat-tcp.xml, bind_addr=, initial_hosts=, cluster=quarkus-jgroups-chat
 
-------------------------------------------------------------------
GMS: address=belasmac-19612, cluster=quarkus-jgroups-chat, physical address=127.0.0.1:7800
-------------------------------------------------------------------
-- view: [belasmac-19612|0] (1) [belasmac-19612]

Shell2:
[belasmac] /Users/bela/quarkus-jgroups-chat$ mvn compile quarkus:dev -Dquarkus.http.port=8081
...
[INFO] --- quarkus-maven-plugin:0.18.0:dev (default-cli) @ quarkus-jgroups-chat ---
2019-07-03 14:15:02,463 DEBUG [org.jgr.qua.ext.JChannelTemplate] (main) creating channel based on config config=chat-tcp.xml, bind_addr=, initial_hosts=, cluster=quarkus-jgroups-chat

-------------------------------------------------------------------
GMS: address=belasmac-25898, cluster=quarkus-jgroups-chat, physical address=127.0.0.1:7801
-------------------------------------------------------------------
-- view: [belasmac-19612|1] (2) [belasmac-19612, belasmac-25898]

這里我們需要一個(gè)系統(tǒng)屬性設(shè)置 quarkus.http.port=8081 ,否則會產(chǎn)生端口沖突,因?yàn)槟J(rèn)的 8080 端口已經(jīng)被第一個(gè)應(yīng)用占用。

輸出信息顯示集群共有兩個(gè)成員。

我們可以通過調(diào)用 curl http://localhost:8080/chat/send/hello%20world 和 curl http://localhost:8081/chat/send/message2 來發(fā)送消息。

兩個(gè)命令行窗口都顯示接收到同樣的消息:

-- view: [belasmac-19612|1] (2) [belasmac-19612, belasmac-25898]
-- from belasmac-19612: hello world
-- from belasmac-25898: message2

當(dāng)然我們也可以使用瀏覽器來發(fā)送 HTTP GET 請求。

當(dāng)在瀏覽器中訂閱消息時(shí) (http://localhost:8081/streaming.html),會有如下效果:

如何使用Quarkus/GraalVM將JGroups編譯成可執(zhí)行文件

注意這些頻道都是綁定到本機(jī) loopback (127.0.0.1) 地址上。可以通過 application.properties 配置中的 bind_addr 和 initial_hosts 來進(jìn)行修改。

quarkus.channel.config=chat-tcp.xml
quarkus.channel.cluster=quarkus-jgroups-chat
# quarkus.channel.bind_addr=192.168.1.105
# quarkus.channel.initial_hosts=192.168.1.105[7800]

另外我們也可以通過系統(tǒng)屬性來進(jìn)行設(shè)置,例如:

[belasmac] /Users/bela/quarkus-jgroups-chat$ mvn compile quarkus:dev -Dbind_addr=192.168.1.105 -Dinitial_hosts=192.168.1.105[7800],192.168.1.105[7801]
...
[INFO] --- quarkus-maven-plugin:0.18.0:dev (default-cli) @ quarkus-jgroups-chat ---
2019-07-03 14:38:28,258 DEBUG [org.jgr.qua.ext.JChannelTemplate] (main) creating channel based on config config=chat-tcp.xml, bind_addr=, initial_hosts=, cluster=quarkus-jgroups-chat

-------------------------------------------------------------------
GMS: address=belasmac-10738, cluster=quarkus-jgroups-chat, physical address=192.168.1.105:7800
-------------------------------------------------------------------
-- view: [belasmac-10738|0] (1) [belasmac-10738]

編譯本機(jī)可執(zhí)行程序

要將應(yīng)用編譯成可執(zhí)行程序,可以使用 mvn package -Pnative 命令:

[belasmac] /Users/bela/quarkus-jgroups-chat$ mvn package -Pnative
[INFO] Building jar: /Users/bela/quarkus-jgroups-chat/target/quarkus-jgroups-chat-1.0.0-SNAPSHOT.jar
[INFO] 
[INFO] --- quarkus-maven-plugin:0.18.0:build (default) @ quarkus-jgroups-chat ---
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Beginning quarkus augmentation
[INFO] [org.jboss.threads] JBoss Threads version 3.0.0.Beta4
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 1343ms
[INFO] [io.quarkus.creator.phase.runnerjar.RunnerJarPhase] Building jar: /Users/bela/quarkus-jgroups-chat/target/quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner.jar
[INFO] 
[INFO] --- quarkus-maven-plugin:0.18.0:native-image (default) @ quarkus-jgroups-chat ---
[INFO] [io.quarkus.creator.phase.nativeimage.NativeImagePhase] Running Quarkus native-image plugin on OpenJDK 64-Bit Server VM
[INFO] [io.quarkus.creator.phase.nativeimage.NativeImagePhase] /Users/bela/graalvm/Contents/Home/bin/native-image -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager --initialize-at-build-time= -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy$BySpaceAndTime -jar quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner.jar -J-Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -H:FallbackThreshold=0 -H:+ReportUnsupportedElementsAtRuntime -H:+ReportExceptionStackTraces -H:+PrintAnalysisCallTree -H:-AddAllCharsets -H:EnableURLProtocols=http -H:-SpawnIsolates -H:+JNI --no-server -H:-UseServiceLoaderFeature -H:+StackTrace
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]    classlist:   6,857.25 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]        (cap):   4,290.72 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]        setup:   6,430.30 ms
14:43:05,540 INFO  [org.jbo.threads] JBoss Threads version 3.0.0.Beta4
14:43:06,468 INFO  [org.xnio] XNIO version 3.7.2.Final
14:43:06,528 INFO  [org.xni.nio] XNIO NIO Implementation Version 3.7.2.Final
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]   (typeflow):  17,331.26 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]    (objects):  24,511.12 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]   (features):   1,194.16 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]     analysis:  44,204.65 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]     (clinit):     579.00 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]     universe:   1,715.40 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]      (parse):   3,315.80 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]     (inline):   4,563.11 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]    (compile):  24,906.58 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]      compile:  34,907.28 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]        image:   4,557.78 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]        write:   2,531.16 ms
[quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner:93574]      [total]: 109,858.54 ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:58 min
[INFO] Finished at: 2019-07-03T14:44:40+02:00

這使用的是 GraalVM 的本地應(yīng)用映像來生成一個(gè)本地可執(zhí)行程序。生成完成后將在 ./target 目錄產(chǎn)生一個(gè)可執(zhí)行文件:

其大小約為 27MB ,在 MacOS 的可執(zhí)行程序如下:

[belasmac] /Users/bela/quarkus-jgroups-chat/target$ ls -lh quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner
-rwxr-xr-x  1 bela  staff    27M Jul  3 14:44 quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner
[belasmac] /Users/bela/quarkus-jgroups-chat/target$ file quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner
quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner: Mach-O 64-bit executable x86_64

接下來可以運(yùn)行這個(gè)程序:

[belasmac] /Users/bela/quarkus-jgroups-chat/target$ ./quarkus-jgroups-chat-1.0.0-SNAPSHOT-runner 

-------------------------------------------------------------------
GMS: address=belasmac-55106, cluster=quarkus-jgroups-chat, physical address=127.0.0.1:7800
-------------------------------------------------------------------
-- view: [belasmac-55106|0] (1) [belasmac-55106]

當(dāng)您自己運(yùn)行時(shí),您會注意到第二個(gè)及后續(xù)成員的快速啟動時(shí)間。 為什么不是第一個(gè)成員? 第一個(gè)成員必須等待GMS.join_timeout millis(在chat-tcp.xml中定義)以查看它是否發(fā)現(xiàn)任何其他成員,因此它總是會遇到此超時(shí)。

要改動 bind_addr 和 initial_hosts 的話,application.properties 必須在編譯成本機(jī)代碼之前進(jìn)行修改。

注意事項(xiàng)

quarkus-jgroups擴(kuò)展依賴于JGroups-4.1.2-SNAPSHOT,除非已將快照存儲庫添加到POM(或settings.xml),否則它可能無法找到。 或者通過如下命令在您的本地maven倉庫中生成并安裝此工件:

git clone https://github.com/belaban/JGroups.git; 
cd JGroups; 
mvn install

當(dāng)前的版本只支持 TCP 通訊,UDP 需要在 GraalVM 支持 MulticastSockets 后才可以使用。

出于某些不明原因,必須在 POM 中啟用 enableJni ,否則編譯成本機(jī)代碼時(shí)會失敗。 

true

希望我能快速理解這個(gè)原因并解決問題。

總結(jié)

這是快速將 JGroups 移植到本機(jī)代碼的方法。 有關(guān)反饋和問題,請使用JGroups郵件列表。

接下來的計(jì)劃:

  • 通過擴(kuò)展提供更多 JGroups 類的支持,例如 RpcDispatcher (用以執(zhí)行遠(yuǎn)程方法調(diào)用)

  • 提供本地可執(zhí)行程序的 Docker 映像

  • 支持 UDP

  • 降低可執(zhí)行文件的體積

到此,相信大家對“如何使用Quarkus/GraalVM將JGroups編譯成可執(zhí)行文件”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


分享題目:如何使用Quarkus/GraalVM將JGroups編譯成可執(zhí)行文件
URL分享:http://weahome.cn/article/gidppp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部