小编Iho*_* M.的帖子

无法在 Spring Boot 中拦截 ApplicationEnvironmentPreparedEvent

我需要以编程方式设置一些系统属性,我认为最好的方法是在事件侦听器ApplicationEnvironmentPreparedEvent被拦截后进行设置。但问题是我无法在我的听众中捕捉到那个事件。

@Component
public class AppListener {

    @EventListener
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ApplicationEnvironmentPreparedEvent) {
            System.setProperty("java.util.concurrent.ForkJoinPool.common.threadFactory", MyThreadFactory.class.getName());
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我做错了什么,为什么我不能赶上那个事件?

spring-boot

5
推荐指数
2
解决办法
2412
查看次数

微服务架构中的 Elasticsearch,设计问题

我正在设计一个系统,其中有几个通过中间件进行通信的微服务。

现在,每一个关于微服务的蓝图都强调微服务必须是自治的,并且每个服务都必须处理自己的数据。目前,我系统中的每个微服务都将数据存储在关系数据库中。

我有一个实现全文搜索的新要求,我的每个微服务都存储可能可搜索的实体。

我正在考虑使用 ElasticSearch 集群,其中有多个索引,索引将作为分隔来自各种微服务的数据的边界。我想强调的是,我计划仅将 ES 用作搜索引擎,而不是用作记录系统。

这是我的困境: 1. 我应该允许每个微服务直接处理 ES 交互(如缓存和持久化)吗?2. 或者我应该创建一个单独的微服务(我们称之为“搜索”),它是与 ES 集群交互的微服务?我倾向于 1.b/c,因为每个微服务都必须在持久性、缓存方面是自主的,它还可以处理全文搜索。

听到不同的意见将会很有趣。


更新:

这就是为什么我认为每个微服务应该单独处理它们的搜索:

  1. 对我来说,全文搜索功能类似于持久层和缓存层,每个微服务都更好地了解业务模型,并负责单独实现这些层。

  2. 如果我再引入一个微服务只是为了进行搜索,那么我将有一个额外的可能的故障点,如果我们不希望search微服务与包的其余部分之间直接交互,那么使用 PubSub 作为中间人也是如此。相反,直接使用ES这种高可用的SaaS,可以消除单点故障。所有写入请求都会很快并且不会有延迟。信息将立即可搜索。这将保证无缝的用户体验。

  3. 我不认为搜索是另一个业务流程(也许我的理解有缺陷)。对我来说,这只是一个锦上添花的功能,而不是核心功能的一部分。然而,一旦实施,我希望它能够提供出色的用户体验。

这种拥有单独search微服务的模型让人想起 CQRS(命令查询责任分离)架构模式。我首先将数据推送到微服务 A 中的数据库,然后将其发布到消息代理(命令),消费者将从队列中获取一条消息并将其推送到 ES。然后前端在读取路径(查询)上将直接进入search微服务。

我从未见过这种用于搜索的模式,在大数据世界中这样做是有意义的,其中一个微服务将摄取数据,然后工作进程将其聚合以进行分析并将其推送到聚合数据表或单独的数据存储中只有这样,数据才能通过单独的微服务进行查询,从而能够获取分析数据。

是否有任何出版物或 ES 的 CQRS 模式的成功实现(考虑到 ES 不用作主要记录系统,而是用作全文搜索引擎)?

elasticsearch microservices

5
推荐指数
1
解决办法
2288
查看次数

Tomcat7 不等待异步请求在关闭时完成其工作

汤姆猫版本:7.0.92

我在 Tomcat 7 上运行的应用程序中大量使用异步 API。我的要求之一是允许当前正在进行的所有请求在终止之前完成其工作。

我为每个连接器设置了以下属性server.xml asyncTimeout="40000" executorTerminationTimeoutMillis="60000"

另外,unloadDelay在 中设置为 60 秒context.xml

我已经让我的一项服务休眠 10 秒,并向我的服务器发出了一个 curl 请求,然后立即请求关闭 tomcat 服务。

curl 在那里停留大约 10 秒,然后502从 tomcat 返回。

此外,在 中catalina.out,我看到以下堆栈跟踪:

INFO: Waiting for 1 instance(s) to be deallocated for Servlet [jersey-servlet]
Dec 05, 2018 7:13:37 PM org.apache.catalina.connector.CoyoteAdapter checkRecycled
INFO: Encountered a non-recycled request and recycled it forcedly.
org.apache.catalina.connector.CoyoteAdapter$RecycleRequiredException
    at org.apache.catalina.connector.CoyoteAdapter.checkRecycled(CoyoteAdapter.java:634)
    at org.apache.coyote.http11.AbstractHttp11Processor.recycle(AbstractHttp11Processor.java:1909)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.release(Http11NioProtocol.java:220)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:720)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1775)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1734)
    at …
Run Code Online (Sandbox Code Playgroud)

tomcat tomcat7

4
推荐指数
1
解决办法
4710
查看次数

为什么SpringBootTests不调用SpringBootApplication类的主方法

我试图弄清楚为什么会这样。我的main()方法包含一些对于应用程序启动至关重要的初始化过程,而Spring Boot集成测试并未调用它。有人可以解释这种行为吗?

spring-boot

3
推荐指数
1
解决办法
39
查看次数

如何验证弹性搜索中特定索引的快照是否正在进行?

我有业务需要删除和重新创建具有新映射的索引。我一直在成功地做到这一点,直到遇到以下问题:

Cannot delete indices that are being snapshotted. Try again after snapshot finishes or cancel the currently running snapshot.

  1. 如何检查快照是否正在进行?
  2. 如何取消当前正在运行的快照?

有它的 Java API 吗?我使用的是 6.01 版。

java elasticsearch

3
推荐指数
1
解决办法
1939
查看次数

spring-boot/spring cloud 升级后,Spring Cloud Sleuth 停止将 X-B3-TraceId 推送到 MDC

我已将 Spring boot 依赖项从2.1to2.4.5和 spring cloud升级到2020.0.2. 升级后,我的 MDC 上下文未填充。

关于这里应该做什么有什么想法吗?

spring-boot spring-cloud spring-cloud-sleuth

3
推荐指数
1
解决办法
7255
查看次数

ActiveMQ 故障转移似乎不起作用

我有一个超级简单的场景:一名经纪人和一名具有持久订阅的消费者。这是我的消费者应用程序的代码:

package test;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import pojo.Event;
import pojo.StockUpdate;

public class Consumer
{

    private static transient ConnectionFactory factory;
    private transient Connection connection;
    private transient Session session;
    public static int counter = 0;

    public Consumer(String brokerURL) throws JMSException
    {
        factory = new ActiveMQConnectionFactory(brokerURL);
        connection = factory.createConnection();
        connection.setClientID("CLUSTER_CLIENT_1");
        connection.start();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    }

    public void close() throws JMSException
    {
        if (connection …
Run Code Online (Sandbox Code Playgroud)

activemq-classic mom

2
推荐指数
1
解决办法
5110
查看次数

如何将所有用@RequestParam 注释的字段收集到一个对象中

我想将所有查询参数收集到一个 pojo 中,并对字段执行额外的验证。

我读过我可以简单地创建一个对象,spring-boot 会自动在它上面设置这些请求参数。

@GetMaping public ResponseEntity<?> listEntities(@RequestParam(value = "page-number", defaultValue = "0") @Min(0) Integer pageNumber, @RequestParam(value = "page-size", defaultValue = "100") @Min(1) Integer pageSize ... )

我正在考虑创建一个名为 的类RequestParamsDTO,其中我的查询参数负责分页。

但是为了在 上设置这些字段RequestParamsDTO,我必须将请求参数的名称与字段名称相匹配。但它不会是一个有效的变量名:page-size.

必须有一些解决方法,类似于@RequestParam的 value 属性,可以在 DTO 中的我的字段上设置给定的请求参数。

请指教。

spring-mvc spring-boot

2
推荐指数
1
解决办法
1731
查看次数

Tomcat6和JRE7的兼容性问题.不支持的major.minor版本51.0

我有一个用JRE7编译的Web应用程序,现在我想在Tomcat6上运行它.当我启动我的应用程序时,我在日志中看到异常:

Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
Run Code Online (Sandbox Code Playgroud)

此异常来自实现ServletContextListener的类.

这是否意味着我必须将Tomcat7用于使用JRE7编译的代码?有解决方法吗?任何信息都是有价值的.

java tomcat tomcat6

1
推荐指数
1
解决办法
3037
查看次数

Java Streams:按列表中不存在的值对列表进行分组会返回一个包含非退出值作为键并将原始列表作为值的映射?

这可能是一个愚蠢的问题但是,我试图理解为什么以下代码:

public static void main(String[] args) {
    List<String> testData = Lists.newArrayList("a", "b", "c");
    Map<String, List<String>> grouped = testData.stream().collect(Collectors.groupingBy(item -> "z"));
    System.out.println(grouped);
}
Run Code Online (Sandbox Code Playgroud)

会返回一张地图:

{z=[a, b, c]}
Run Code Online (Sandbox Code Playgroud)

我正在尝试按列表中没有的值对列表进行分段.因此,我希望回到以下方面:

{z=[]}
Run Code Online (Sandbox Code Playgroud)

在我的情况下,分类器函数并不那么简单,但简而言之,它可能会产生一个不在列表值之间的分类器值.

我在这里错过了什么?

java java-stream

1
推荐指数
1
解决办法
63
查看次数

如何获取 JWK 并在 JWT 签名中使用它们?

我正在阅读这篇关于 JWT 的博客,以及如何使用它的签名部分来验证令牌实际上是由受信任方颁发的。

https://hackernoon.com/json-web-tokens-jwt-demystified-f7e202249640

JSON Web Key (JWK) 是一个 JSON 对象,它包含一个众所周知的公钥,可用于验证已签名 JWT 的签名。

如果您的 JWT 的颁发者使用非对称密钥来签署 JWT,它可能会托管一个名为 JSON Web 密钥集 (JWKS) 的文件。JWKS 是一个包含属性键的 JSON 对象,而该键又包含一组 JWK 对象。

这是我的代码库中为我生成 JWT 的 Java 代码片段:

new JwtBuilder().setClaims(claims).setExpiration(expiration).signWith(signatureAlgorithm, sharedSecret).compact();
Run Code Online (Sandbox Code Playgroud)

我不太明白我如何获得 JWK 以及如何使用它们进行签名?我还没有在网上找到任何例子。

任何帮助将不胜感激。

java authentication jwt jwk

1
推荐指数
1
解决办法
7050
查看次数