我有一个Spring Boot应用程序,它需要处理一些Kafka流数据。我向CommandLineRunner将在启动时运行的类添加了无限循环。那里有一个可以唤醒的卡夫卡消费者。我添加了一个关闭钩子Runtime.getRuntime().addShutdownHook(new Thread(consumer::wakeup));。我会遇到任何问题吗?在春季,有没有更惯用的方法?我应该@Scheduled改用吗?下面的代码删除了特定的Kafka实现内容,但另有说明。
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.errors.WakeupException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.util.Properties;
@Component
public class InfiniteLoopStarter implements CommandLineRunner {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void run(String... args) {
Consumer<AccountKey, Account> consumer = new KafkaConsumer<>(new Properties());
Runtime.getRuntime().addShutdownHook(new Thread(consumer::wakeup));
try {
while (true) {
ConsumerRecords<AccountKey, Account> records = consumer.poll(Duration.ofSeconds(10L));
//process records
}
} catch (WakeupException e) {
logger.info("Consumer woken up for exiting."); …Run Code Online (Sandbox Code Playgroud) 在带有 Hibernate 5 的 Spring Boot 2 中,我们有一个如下查询:
@Query("""
SELECT m FROM ProjectMember m
ORDER BY m.lastActive ASC NULLS LAST
""")
List<ProjectMember> sortLastActiveDesc();
Run Code Online (Sandbox Code Playgroud)
(在类中定义public interface ProjectMemberRepository extends JpaRepository<ProjectMember, UUID> {)
该查询与真实查询相比略有删减,只是为了得到一个小的复制案例。
这是必需的,因为我们需要重写空值的排序方式。这里的底层数据库是PostgreSQL。
然而,在带有 Hibernate 6 的 Spring Boot 3.1.0 中,这不再起作用。应用程序将启动并且在启动时不会抛出异常,但是在执行此查询时它将抛出此异常:
org.springframework.dao.InvalidDataAccessApiUsageException
...
... (huge stack trace here)
...
Caused by: org.springframework.data.jpa.repository.query.BadJpqlGrammarException: Line 2:26 mismatched input 'NULLS' expecting {<EOF>, ',', EXCEPT, FETCH, INTERSECT, LIMIT, OFFSET, UNION}; Bad JPQL grammar [select m from ProjectMember m
ORDER BY m.lastActive ASC NULLS …Run Code Online (Sandbox Code Playgroud) JPQL / JPA / Hibernate等价于数据库功能是date_trunc('day', (entity.date AT TIME ZONE 'UTC'))什么?
我需要在Spring Boot应用程序中四舍五入到整天(和几周等),并使Hibernate运行在Postgresql数据库之上。这个查询可以在本地postgresql中进行,但是我还没有弄清楚如何在Hibernate中进行查询。时区(如“ UTC”,“欧洲/阿姆斯特丹”)和日期部分(如“日”,“年”)可能会有所不同,因此我不能仅将其设置为默认值。
我在Hibernate论坛上发现了一个古老的帖子,没有任何回复:https : //forum.hibernate.org/viewtopic.php? f =1& t =990451
我还发现了一个与StackOverflow相关的问题,发帖人直接希望在日期上选择某个时区。但是没有答复:HQL等同于Postgres的“时区的日期时间”
我的整个查询(没有where)看起来像这样,因此采用另一种方法也可以。
"SELECT NEW " + AggregateQueryEntity.class.getName() +
"(date_trunc('" + aggregationPeriod.toString() +
"', a.date), a.alertConfiguration.id.id, a.alertConfiguration.name, a.alertLevel, count(*)) from Alert a" +
whereClause.toString() +
" GROUP BY 1, a.alertConfiguration.id.id, a.alertConfiguration.name, a.alertLevel" + //column 1 is the truncated date
" ORDER BY 1, alertLevel DESC"
Run Code Online (Sandbox Code Playgroud)
编辑:对答案的评论。
弗拉德的答案很好,我对其进行了一些修改,以便将日期部分也作为变量。另外,我必须重写标准的Hibernate行为,该行为Date将按生成列,timestamp without timezone并timestamp with timezone通过将其放在我的列定义中来显式地创建它们: …
Spring JPA 具有 Pageable 接口。我可以将其传递给存储库方法。它的一些实现如PageRequest包含 a page、 asize和 a sort。但是,还有一个unpaged我可以创建的实例,Pageable.unpaged()它返回一个org.springframework.data.domain.Unpaged实现 Pageable 的枚举。
当您想利用这个可分页对象的排序能力,但又不想分页时,问题就来了。在这种情况下,您应该希望Pageable.isPaged()返回 false,但是您通常可以创建的唯一实例是 PageRequest(带有Pagerequest.of(size, page, sort)),它始终为该方法返回 true。
如果您有这样的 JPA 存储库方法:
Page<EventTriggerVersion> findByProjectIdAndEventTriggerId(
@Param("projectId") UUID projectId, @Param("eventTriggerId") UUID eventTriggerId, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)
然后你不能为它创建一个 Pageable ,它可以排序但不页面,即只返回 1 页的所有结果。
但是,您也可以不只是给它一个未分页的 Pageable 和一个 Sort 参数,如果你这样做,它会抛出这个异常: java.lang.IllegalStateException: Method must not have Pageable *and* Sort parameter. Use sorting capabilities on Pageable instead!
那么我应该如何在不复制我所有的存储库方法(主要有自定义查询)的情况下做到这一点,以获得带有 Pageable 和 Sort 的版本?
我们的用户只是想传递size=0他们的请求,然后获取所有数据(不限于某个任意的最大值,而是一个真正的未分页请求)。这很烦人,因为这意味着我需要从控制器中删除 …
我试图在MimeMultiPart中获取MimePart的base64内容,但我正在努力使用Javamail包.我只想要某个内嵌图像的base64编码字符串,但似乎没有一种简单的方法可以做到这一点.我写了一个方法,将mime内容(作为字符串)和图像名称作为参数,并搜索包含该图像名称的base64内容的部分,并在最后返回此base64字符串(以及内容类型但与此问题无关)
以下是相关代码(包括相关导入):
import javax.activation.DataSource;
import javax.mail.MessagingException;
import javax.mail.Part;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimePart;
import javax.mail.util.ByteArrayDataSource;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import com.sun.mail.util.BASE64DecoderStream;
private static String[] getBase64Content(String imageName, String mimeString) throws MessagingException, IOException
{
System.out.println("image name: " + imageName + "\n\n");
System.out.println("mime string: " + mimeString);
String[] base64Content = new String[2];
base64Content[0] = "";
base64Content[1] = "image/jpeg"; //some default value
DataSource source = new ByteArrayDataSource(new ByteArrayInputStream(mimeString.getBytes()), "multipart/mixed");
MimeMultipart mp = new MimeMultipart(source);
for (int i = 0; i < mp.getCount(); i++)
{
MimePart …Run Code Online (Sandbox Code Playgroud) java ×5
spring ×4
jpa ×3
hibernate ×2
spring-boot ×2
apache-kafka ×1
base64 ×1
jakarta-mail ×1
jpql ×1
mime ×1
spring-data ×1
spring-mvc ×1