下面是我尝试使用 Apache Camel 反应流解决方案将发布者连接到订阅者(骆驼路由的代码如下所示)跨 JVM 的
为了使通信能够跨越 JVM,似乎需要一个“代理”服务器。因此,我已经实现了 Artemis 代理并相应地修改了 application.properties 文件(根据我对如何这样做的最佳理解)。
此外,为了缩小焦点,选择使用 smallrye-ampq 连接器。
问题:
订阅者应该接收并记录字符串值(来自正文):
-
-
-
:blahblahblah
:blahblahblah
:blahblahblah
-
-
-
Run Code Online (Sandbox Code Playgroud)
--相反,它正在记录值,如下所示:
-
-
-
:Exchange[ID-LAPTOP-4LR4PMVQ-1576639597494-0-289]
:Exchange[ID-LAPTOP-4LR4PMVQ-1576639597494-0-292]
:Exchange[ID-LAPTOP-4LR4PMVQ-1576639597494-0-295]
-
-
-
Run Code Online (Sandbox Code Playgroud)
题:
为什么发布者发送的有效负载没有到达订阅者,我可以修改哪些代码/配置来修复它?
提前感谢您的帮助!
“出版商”路线
package aaa.bbb.ccc.jar;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.eclipse.microprofile.reactive.messaging.Outgoing;
import org.reactivestreams.Publisher;
import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.reactive.streams.api.CamelReactiveStreamsService;
import org.apache.camel.component.reactive.streams.api.CamelReactiveStreams;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
@ApplicationScoped
public class CamelPub extends RouteBuilder {
@Inject
CamelContext ctx;
CamelReactiveStreamsService crss;
static int x = 0; …Run Code Online (Sandbox Code Playgroud) java apache-camel reactive-programming activemq-artemis smallrye
我想使用这个扩展:[Quarkus Smallrye Reactive Messaging Kafka]
但在我的应用程序中,主题的名称是事先未知的,它是根据运行时从用户收到的消息指定的。如何在没有注释的情况下以编程方式指定主题名称和与主题相关的设置?(仅用于向 Kafka 发送消息 -> Produce)
@ApplicationScoped
public class PriceGenerator {
private Random random = new Random();
// Don't want to use this
// "generated-price" not known at build time
@Outgoing("generated-price")
public Multi<Integer> generate() {
return Multi.createFrom().ticks().every(Duration.ofSeconds(5))
.onOverflow().drop()
.map(tick -> random.nextInt(100));
}
}
Run Code Online (Sandbox Code Playgroud)
或者这些配置应该在运行时以编程方式设置
mp.messaging.outgoing.generated-price.connector=smallrye-kafka
mp.messaging.outgoing.generated-price.topic=prices
mp.messaging.outgoing.generated-price.value.serializer=org.apache.kafka.common.serialization.IntegerSerializer
Run Code Online (Sandbox Code Playgroud)
因为不认识路,所以使用了原生的Kafka驱动
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kafka-client</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
Properties props = new Properties();
props.put("bootstrap.servers", "85.93.89.115:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("linger.ms", 1);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new …Run Code Online (Sandbox Code Playgroud) java apache-kafka quarkus smallrye-reactive-messaging smallrye
我正在尝试使用 quarkus-smallrye-graphql 扩展。而现在似乎我不能使用任何安全注解如@Authenticated与注释的类@GraphQLApi。我之前尝试过直接使用 smallrye-graphql 项目,并且能够使用安全性。但是现在在 quarkus 中使用提供的扩展时,它不起作用。
api 类的一个简单示例是
@GraphQLApi
public class SomeApi {
@Query
@Authenticated
public String testQuery() {
return "hello...";
}
}
Run Code Online (Sandbox Code Playgroud)
这不适用于扩展程序,我总是收到未经授权的异常。有谁知道如何做到这一点?
当为带有连字符的属性设置环境变量时,例如:
quarkus.datasource.db-kind=postgresql
Run Code Online (Sandbox Code Playgroud)
我希望它被设置为:
export QUARKUS_DATASOURCE_DB_KIND=postgresql
Run Code Online (Sandbox Code Playgroud)
但是,这会导致以下消息:
Unrecognized configuration key "quarkus.datasource.db.kind" was provided; it will be ignored;
Run Code Online (Sandbox Code Playgroud)
所有其他属性(不带连字符)都会正确传递。
其他属性也会发生这种情况:
export QUARKUS_DATASOURCE_JDBC_MIN_SIZE=10
export QUARKUS_DATASOURCE_JDBC_INITIAL_SIZE=20
export QUARKUS_DATASOURCE_JDBC_MAX_SIZE=1000
...
Unrecognized configuration key "quarkus.datasource.jdbc.max.size" was provided;
Unrecognized configuration key "quarkus.datasource.jdbc.min.size" was provided;
Unrecognized configuration key "quarkus.datasource.jdbc.initial.size" was provided;
Run Code Online (Sandbox Code Playgroud)
解决方法:重命名环境变量并将其传递到 application.properties,并使用连字符名称:
quarkus.datasource.jdbc.initial-size=${DATASOURCE_JDBC_INITIAL_SIZE}
quarkus.datasource.jdbc.min-size=${DATASOURCE_JDBC_MIN_SIZE}
quarkus.datasource.jdbc.max-size=${DATASOURCE_JDBC_MAX_SIZE}
Run Code Online (Sandbox Code Playgroud)
什么是正确的转换?它记录在某处吗?
有没有办法允许来自多个来源的 JWT?
我有一个 REST API,只允许通过不记名令牌身份验证进行访问,而且我实际上只需要验证这些令牌,因此我并不真正需要 OIDC 带来的所有附加功能。
假设我将 Keycloak 设置为身份提供者。我会相应地配置 quarkous-oidc 。但现在我还想允许我在另一个服务中创建 JWT,用于服务到服务的通信。这不是身份提供者,但我只是使用 Smallrye-jwt 来创建一些“内部”令牌。
所以实际上我似乎更愿意使用 quarkus-smallrye-jwt,但我无法为多个租户配置它。
我认为合并 JWKS 中的密钥并将其提供给 quarkus-smallrye-jwt 最终会起作用。但也许有一个我没有看到的更优雅的解决方案。
我正在使用 Quarkus (1.3.2.Final) 开发一个新的 REST 服务,并且尝试将 Firebase 身份验证与 Smallrye-Jwt 集成,但失败了。
我的第一次尝试是将 publickey.location 指向 Google 的 URL,但失败了,因为有两个密钥,并且检查签名的正确 publicKey 取决于 jwt“kid”标头值:
mp.jwt.verify.publickey.location=https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
mp.jwt.verify.issuer=https://securetoken.google.com/<projectId>
quarkus.smallrye-jwt.auth-mechanism=MP-JWT
quarkus.smallrye-jwt.enabled=true
Run Code Online (Sandbox Code Playgroud)
我的第二次尝试是创建一个服务(类似于“PublicKeyResolver”)来请求谷歌的网址并根据“kid”声明值提取正确的公钥:
mp.jwt.verify.publickey.location=http://localhost:8080/api/certs/publicKey
Run Code Online (Sandbox Code Playgroud)
该策略失败了,因为“授权”http 标头未包含在公钥请求中。
有没有办法集成 Quarkus 和 Firebase 身份验证?
我试图测试 vertx munity web 客户端提供的反应式 web 客户端。
我遵循了官方指南Quarkus - Getting Started with Reactive。
并在依赖项中添加了以下内容。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>
<dependency>
<groupId>io.smallrye.reactive</groupId>
<artifactId>smallrye-mutiny-vertx-web-client</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是当我Vertx像文章中提到的那样注入时,得到了 CDI 不满意的依赖异常。Vertx不可用。
Caused by: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type io.vertx.mutiny.core.Vertx and qualifiers [@Default]
- java member: com.example.PostResourceClient#vertx
Run Code Online (Sandbox Code Playgroud)
完整的代码在这里。
reactive-programming vert.x quarkus smallrye quarkus-rest-client
我在Quarks 应用程序中使用 Smallrye Mutiniy 反应库,因为 Quarks 应用程序本身支持它。
我正在尝试为服务类编写单元测试。我不确定如何为返回Uni / Multi的方法编写单元测试。
一个方法返回Uni<String>
public Uni<String> hello(final String name) {
final String message = "Hello " + name;
return Uni.createFrom().item(message);
}
Run Code Online (Sandbox Code Playgroud)
上述方法的实现单元
@Test
void testHello() {
final Uni<String> casePass = hello("Ram");
// assertion passes and all good with this.
casePass.subscribe().with(message -> Assertions.assertEquals("Hello Ram", message));
final Uni<String> caseFail = hello("Ravan");
// It is expected to fail the assertion, and it does. But the test is not failing, instead aseertion …Run Code Online (Sandbox Code Playgroud) 我正在尝试让上下文传播在 Quarkus 本机模式下工作。
下面的代码在 JVM 模式下按预期工作,但MDC value: null在本机模式下返回。
我所说的“如预期”是指:
响应curl http://localhost:8080/thread-context是MDC value: from-thread-context
@Inject
ManagedExecutor managedExecutor;
@Inject
ThreadContext threadContext;
private final Supplier<String> mdcValueSupplier =
() -> "MDC value: " + MDC.get("foo") + "\n";
@GET
@Path("thread-context")
public String get() throws ExecutionException, InterruptedException {
MDC.put("foo", "from-thread-context");
Supplier<String> ctxSupplier = threadContext.contextualSupplier(mdcValueSupplier);
return managedExecutor.supplyAsync(ctxSupplier).get();
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个github 存储库,其中包含演示应用程序的完整代码和重现问题的分步说明。
io.quarkus:quarkus-smallrye-context-propagation存在依赖性。
夸库斯版本:1.9.2
问:是我的代码有问题,还是 Quarkus 有问题?
smallrye ×9
quarkus ×8
java ×4
jwt ×2
smallrye-reactive-messaging ×2
apache-camel ×1
apache-kafka ×1
graalvm ×1
graphql ×1
jwk ×1
mutiny ×1
vert.x ×1