рдХреНрд╡рд╛рд░реНрдХрд╕ рдФрд░ рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрдб рд╣реИрдЯ рдУрдкрдирд╢рд┐рдлреНрдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдХреНрд▓рд╛рдЙрдб-рдиреЗрдЯрд┐рд╡ рдореИрд╕реЗрдЬрд┐рдВрдЧ

рдирдорд╕реНрддреЗ! рдпрд╣ рдпрд╣рд╛рдБ рд╣реИ - рдХреНрд╡рд╛рд░реНрдХрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╣рдорд╛рд░реА рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ! (рд╡реИрд╕реЗ, рд╣рдорд╛рд░рд╛ рд╡реЗрдмрд┐рдирд╛рд░ рджреЗрдЦреЗрдВ "рдпрд╣ рдХреНрд╡рд╛рд░реНрдХрд╕ - рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореВрд▓ рдЬрд╛рд╡рд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ". рд╣рдо рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рд╢реБрд░реБрдЖрдд рд╕реЗ рдХреИрд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ рдпрд╛ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ)

рдХреНрд╡рд╛рд░реНрдХрд╕ рдФрд░ рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрдб рд╣реИрдЯ рдУрдкрдирд╢рд┐рдлреНрдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдХреНрд▓рд╛рдЙрдб-рдиреЗрдЯрд┐рд╡ рдореИрд╕реЗрдЬрд┐рдВрдЧ

╨Т рдкрд╣рд▓реЗ рдХрд╛ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдордиреЗ рдЙрди рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рджреЗрдЦрд╛ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдЖрдзреБрдирд┐рдХреАрдХрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рд╛рдкреНрдд рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрд╕реНрдХрд░рдг 0.17.0 рдХреЗ рдмрд╛рдж рд╕реЗ, рдХреНрд╡рд╛рд░реНрдХрд╕ рдЙрдиреНрдирдд рд╕рдВрджреЗрд╢ рдХрддрд╛рд░рдмрджреНрдз рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдПрдПрдордХреНрдпреВрдкреА), рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рд╕рдВрдЧрдардиреЛрдВ рдХреЗ рдмреАрдЪ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рдорд╛рдирдХ рд╣реИред

рд░реЗрдб рд╣реИрдЯ рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╕реЗрд╡рд╛ рд╣реИ рд╕рд╛рдореВрд╣рд┐рдХ рдФрд░ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдЖрдзрд╛рд░рд┐рдд рдореИрд╕реЗрдЬрд┐рдВрдЧ рддрдВрддреНрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд░реЗрдб рд╣реИрдЯ рдУрдкрдирд╢рд┐рдлреНрдЯ. рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ рдпрд╣рд╛рдБ (рдПрди). рдЖрдЬ рд╣рдо рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рджреЛ рдирдИ рдореИрд╕реЗрдЬрд┐рдВрдЧ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЖрдзреБрдирд┐рдХ рдУрдкрдирд╢рд┐рдлреНрдЯ-рдЖрдзрд╛рд░рд┐рдд рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдФрд░ рдХреНрд╡рд╛рд░реНрдХрд╕ рдХреЛ рдХреИрд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдУрдкрдирд╢рд┐рдлреНрдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рддреИрдирд╛рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ (рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рджреЗрдЦреЗрдВ)ред рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди рдЧрд╛рдЗрдб).

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╣реЛрдЧрд╛ред рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдСрд░реНрдбрд░ рдЬреЗрдирд░реЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдкрд░ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдХреЛ рдСрд░реНрдбрд░ рднреЗрдЬрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЬреЛ рдХрддрд╛рд░ рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред

рдПрдХ рдмрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХреИрд╕реЗ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреНрд░рд╛рд╡рдзрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдХреНрд╡рд╛рд░реНрдХрд╕ рдРрдк

рд╣рдорд╛рд░рд╛ рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдУрдкрдирд╢рд┐рдлреНрдЯ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдПрдПрдордХреНрдпреВрдкреА-рдХреНрд╡рд┐рдХрд╕реНрдЯрд╛рд░реНрдЯ. рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╣рд╛рдВ.

рдЬреЗрдирд░реЗрдЯрд░ рдСрд░реНрдбрд░ рдХрд░реЗрдВ

рдЬрдирд░реЗрдЯрд░ рдмрд╕ рд╣рд░ 5 рд╕реЗрдХрдВрдб рдореЗрдВ рдмрдврд╝рддреЗ рдСрд░реНрдбрд░ рдЖрдИрдбреА рдХреЛ "рдСрд░реНрдбрд░" рдкрддреЗ рдкрд░ рднреЗрдЬрддрд╛ рд╣реИред

@ApplicationScoped
public class OrderGenerator {
 
    private int orderId = 1;
 
    @Outgoing("orders")
    public Flowable<Integer> generate() {
        return Flowable.interval(5, TimeUnit.SECONDS)
        .map(tick -> orderId++);
    }
}

рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд░

рдСрд░реНрдбрд░ рд╣реИрдВрдбрд▓рд░ рдФрд░ рднреА рд╕рд░рд▓ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ "рдкреБрд╖реНрдЯрд┐" рдкрддреЗ рдкрд░ рдПрдХ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдЖрдИрдбреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // ╨Ш╨┤╨╡╨╜╤В╨╕╤Д╨╕╨║╨░╤В╨╛╤А ╨┐╨╛╨┤╤В╨▓╨╡╤А╨╢╨┤╨╡╨╜╨╕╤П ╤А╨░╨▓╨╡╨╜ ╤Г╨┤╨▓╨╛╨╡╨╜╨╜╨╛╨╝╤Г ╨╕╨┤╨╡╨╜╤В╨╕╤Д╨╕╨║╨░╤В╨╛╤А╤Г ╨╖╨░╨║╨░╨╖╨░ <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

рдкреБрд╖реНрдЯрд┐рдХрд░рдг рд╕рдВрд╕рд╛рдзрди

рдкреБрд╖реНрдЯрд┐рдХрд░рдг рд╕рдВрд╕рд╛рдзрди рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдкреБрд╖реНрдЯрд┐рдХрд░рдгреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ HTTP рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реИред

@Path("/confirmations")
public class ConfirmationResource {
 
    @Inject
    @Stream("confirmations") Publisher<Integer> orders;
 
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
 
 
    @GET
    @Path("/stream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public Publisher<Integer> stream() {
        return orders;
    }
}

рд╕рдорд╛рдпреЛрдЬрди

рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЕрд░реНрдерд╛рддреН: рдХреНрд╡рд╛рд░реНрдХрд╕ рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдПрдПрдордХреНрдпреВрдкреА рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ред рдмреЗрд╢рдХ, рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░ рджреЗрдВрдЧреЗред

рдХрдиреЗрдХреНрдЯрд░реНрд╕

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЧреБрдг рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp

рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ "рдСрд░реНрдбрд░" рдкрддреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдФрд░ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ "рдкреБрд╖реНрдЯрд┐рдХрд░рдг" рдкрддрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рдПрдПрдордХреНрдпреВрдкреА рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ

рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░, рдПрдПрдордХреНрдпреВрдкреА рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╣реЛрд╕реНрдЯрдирд╛рдо рдФрд░ рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдЕрдЬреНрдЮрд╛рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдХреЙрдиреНрдлрд┐рдЧрдореИрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ:

spec:
  template:
    spec:
      containers:
      - env:
        - name: AMQP_HOST
          valueFrom:
            configMapKeyRef:
              name: quarkus-config
              key: service.host
        - name: AMQP_PORT
          valueFrom:
            configMapKeyRef:
              name: quarkus-config
              key: service.port.amqp

рд╕рд╛рдЦ

рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдУрдкрдирд╢рд┐рдлреНрдЯ рдкрд░ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдХрд╕реНрдЯрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд╕реЛрд░реНрд╕ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдкреЙрдб рдХреЗ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЯреЛрдХрди рдХреЛ рдкрдврд╝реЗрдЧрд╛:

public class MessagingCredentialsConfigSource implements ConfigSource {
    private static final Set<String> propertyNames;
 
    static {
        propertyNames = new HashSet<>();
        propertyNames.add("amqp-username");
        propertyNames.add("amqp-password");
    }
 
    @Override
    public Set<String> getPropertyNames() {
        return propertyNames;
    }
 
    @Override
    public Map<String, String> getProperties() {
        try {
            Map<String, String> properties = new HashMap<>();
            properties.put("amqp-username", "@@serviceaccount@@");
            properties.put("amqp-password", readTokenFromFile());
            return properties;
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }
 
    @Override
    public String getValue(String key) {
        if ("amqp-username".equals(key)) {
            return "@@serviceaccount@@";
        }
        if ("amqp-password".equals(key)) {
            try {
                return readTokenFromFile();
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }
        return null;
    }
 
    @Override
    public String getName() {
        return "messaging-credentials-config";
    }
 
    private static String readTokenFromFile() throws IOException {
        return new String(Files.readAllBytes(Paths.get("/var/run/secrets/kubernetes.io/serviceaccount/token")), StandardCharsets.UTF_8);
    }
}

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рддреИрдирд╛рдд рдХрд░реЗрдВ

рдЪреВрдБрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП GraalVM рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рддрд╛рд╡рд░рдг рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреЗрдВ рдХреНрд╡рд╛рд░реНрдХрд╕ рдЧрд╛рдЗрдб.

рдлрд┐рд░, рд╡рд╣рд╛рдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рдФрд░ рддреИрдирд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

git clone https://github.com/EnMasseProject/enmasse-example-clients
cd enmasse-example-clients/quarkus-example-client
oc new-project myapp
mvn -Pnative -Dfabric8.mode=openshift -Dfabric8.build.strategy=docker package fabric8:build fabric8:resource fabric8:apply

рдЗрди рдЖрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рдж, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рддрдм рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рд╣рдо рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░ рд▓реЗрддреЗред

рд╕рдВрджреЗрд╢ рдкреНрд░рдгрд╛рд▓реА рдХреА рд╕реНрдерд╛рдкрдирд╛

рдЕрдм рдЬреЛ рдХреБрдЫ рдмрдЪрд╛ рд╣реИ рд╡рд╣ рдЙрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рдирдХреА рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: 1) рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрддрд╛ рд╕реНрдерд╛рди; 2) рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрддреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрддрд╛; 3) рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ред

рдкрддрд╛ рд╕реНрдерд╛рди

рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдореЗрдВ рдПрдбреНрд░реЗрд╕рд╕реНрдкреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрддреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдПрдВрдбрдкреЙрдЗрдВрдЯ рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдиреАрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдЖрдк рдПрдХ рдкрддрд╛ рд╕реНрдерд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдВрдЧреЗ:

apiVersion: enmasse.io/v1beta1
kind: AddressSpace
metadata:
  name: quarkus-example
spec:
  type: brokered
  plan: brokered-single-broker
  endpoints:
  - name: messaging
    service: messaging
    exports:
    - name: quarkus-config
      kind: configmap

рдкрддрд╛

рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрддреЗ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЙрд╕рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдпреЛрдЬрдирд╛ рднреА рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрддрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
  name: quarkus-example.orders
spec:
  address: orders
  type: queue
  plan: brokered-queue

рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЗрд╡рд▓ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реА рдЖрдкрдХреЗ рдкрддреЗ рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ OpenShift рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛" рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

apiVersion: user.enmasse.io/v1beta1
kind: MessagingUser
metadata:
  name: quarkus-example.app
spec:
  username: system:serviceaccount:myapp:default
  authentication:
    type: serviceaccount
  authorization:
  - operations: ["send", "recv"]
    addresses: ["orders"]

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐рдпрд╛рдВ

рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд┐рдЧрдореИрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ рдПрдПрдордХреНрдпреВрдкреА рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛, рднреВрдорд┐рдХрд╛ рдФрд░ рд░реЛрд▓рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реЗрдЯ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: quarkus-config
spec:
  rules:
  - apiGroups: [ "" ]
    resources: [ "configmaps" ]
    verbs: [ "create" ]
  - apiGroups: [ "" ]
    resources: [ "configmaps" ]
    resourceNames: [ "quarkus-config" ]
    verbs: [ "get", "update", "patch" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: quarkus-config
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: quarkus-config
subjects:
- kind: ServiceAccount
  name: address-space-controller
  namespace: amq-online-infra

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдЖрдк рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

cd enmasse-example-clients/quarkus-example-client
oc project myapp
oc apply -f src/main/resources/k8s/addressspace
oc apply -f src/main/resources/k8s/address

рдЖрд╡реЗрджрди рд╕рддреНрдпрд╛рдкрди

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдкрддреЗ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ рдФрд░ рд╕рдХреНрд░рд┐рдп рд╣реИрдВ:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done

рддреЛ рдлрд┐рд░ рдЖрдЗрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░реВрдЯ рдпреВрдЖрд░рдПрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ (рдмрд╕ рдЗрд╕ рдкрддреЗ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреЛрд▓реЗрдВ):

echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЯрд┐рдХрдЯ рд╕рдордп-рд╕рдордп рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджреЗрд╢ рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЙрдкрд╕рдВрд╣рд╛рд░

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

рдпрд╣ рдХреНрд╡рд╛рд░реНрдХрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕рдорд╛рдкрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдмрд╣реБрдд рд╕реА рдирдИ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдмрдиреЗ рд░рд╣реЗрдВ!

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ