- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
---更新---
事实证明,堆在一段时间后会被清空。然而,线程的数量只会无休止地增长。在我有 8Gb RAM 的 Mac 上我很好,但是在有 1Gb 的生产机器上我得到:
Exception in thread "Thread-341" java.lang.OutOfMemoryError: unable to create new native thread
我确实使用 Spring Boot (1.2.7.RELEASE) 和 Apache Camel (2.15.0) 编写了一个简单的应用程序。该应用程序很简单,只有 1 个路由:计时器将每隔 1 秒调用一个 bean 上的方法。调用的方法将使用 ProducerTemplate
通过 ssh 连接到远程机器,执行一个小脚本,并将输出打印到控制台。很简单吧?
但是,在对此进行分析时,我可以看到线程数,并且堆通过了屋顶!似乎为 ssh 创建的任何线程都不会被杀死,而是被停放。因此,我运行 OOM 的速度非常快。
让我向您展示一些探查器输出:
如您所见,线程/堆的增长速度非常快。应用程序代码很少,所以我会在这里全部提供以供引用。
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>tests</groupId>
<artifactId>camel-producer-template-testing</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<start-class>app.Application</start-class>
<camel.version>2.15.0</camel.version>
<spring-boot.version>1.2.7.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-boot</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ftp</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ssh</artifactId>
<version>${camel.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
应用程序.java:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import java.util.TimeZone;
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
SpringApplication application = new SpringApplication(Application.class);
application.run(args);
}
}
MyAppContext.java:
import org.apache.camel.CamelContext;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.spring.SpringCamelContext;
import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("application.properties")
public class MyAppContext {
private final String sshKeyPath = "/Users/gruszd/.ssh/id_rsa";
@Autowired
private ApplicationContext applicationContext;
@Bean
public CamelContext camelContext() {
return new SpringCamelContext(applicationContext);
}
@Bean
FileKeyPairProvider keyPairProvider() {
return new FileKeyPairProvider(new String[]{sshKeyPath});
}
@Bean
RoutesBuilder myRouter() {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("timer://foo?period=1000").to("bean:sftpStager?method=stage");
}
};
}
}
SftpStager.java:
import org.apache.camel.ProducerTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class SftpStager {
@Autowired
private ProducerTemplate producerTemplate;
public void stage() throws Exception {
String response = producerTemplate.requestBody(
"ssh://_remote.machine.url.here_?username=_username_&keyPairProvider=#keyPairProvider",
"/home/_username_/some_temp_script.sh",
String.class);
System.out.println("----");
System.out.println(response);
System.out.println("----");
}
}
如您所见,该应用非常精简,而且可以正常运行(我可以在运行该应用的控制台中看到远程脚本的输出)。但正如我所说,它会像新鲜 cookies 一样消耗内存!
现在我读了this .但是,在我的应用程序中,ProducerTemplate
是由 Camelcontext
本身实例化的 bean。因此我不能 producerTemplate.stop()
因为下一个触发器会抛出一个异常,说明模板没有启动...
所以我的主要问题是:我是否以错误的方式使用了 ProducerTemplate
?如果我这样做,我应该如何使用它?
如果我没有做错什么,那是错误吗?我应该报告吗?
最佳答案
如原发帖者所述:
Turns out it is a bug in Apache Camel itself, should be [and was] fixed in 2.16.2: Jira Issue here
关于Spring-Boot + Camel + producerTemplate = 千线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33671567/
我们在 Web 应用程序中使用 Spring 和 Camel。在我们的一个 Controller 中,我们使用 ProducerTemplate 在路由上发送消息,现在我想添加另一个 Controll
在某种程度上,这有点像在黑暗中开枪,但我们有一个过程会在一天内显着减慢。我们发现在 Fuse 上运行的所有内容都开始拖延,但只有在我们运行特定进程时才会如此。运行 JProfiler,我发现 org.
ProducerTemplate的常见用法是声明一个成员并用@Produce注解 @Produce(uri = "direct:start") protected ProducerTemplate t
---更新--- 事实证明,堆在一段时间后会被清空。然而,线程的数量只会无休止地增长。在我有 8Gb RAM 的 Mac 上我很好,但是在有 1Gb 的生产机器上我得到: Exception in t
我想使用 Camel 作为我正在开发的应用程序的集成点。我的目的是从我的应用程序将消息注入(inject) Camel ,并从 Camel 接收消息,并通过 Camel 上下文路由在应用程序启动时如何
编辑:我的领导告诉我,调用我的类的测试在使用 BPMS 时遇到问题,并且 BPMS 不再用于该项目。谢谢大家的回复。 背景: 我正在使用现有的代码库,但它仍然无法完全发挥作用。具体来说,我的任务是完成
我正在开发一个应用程序(使用 Camel 2.13.2),需要使用 ProducerTemplate 将不同的消息发送到不同的端点。最初,我们为每条消息创建一个新的 ProducerTemplate,
我的 Camel 路线是: from("direct:start") .to("http://myhost/mypath"); 我用过: ProducerTemplate template; temp
我正在使用 Apache Camel HTTP 组件,我能够发送请求并接收响应。 在失败的情况下,我会遇到异常,如果我尝试从 header 获取 HTTP 响应代码,则响应为 null。 if(exc
在我的camel项目中,我需要向网关发送一些消息(网关将以JMS消息的形式接收它)。 对于网关来说,除了消息文本之外,还有一些其他的字符串属性,使用jmsMessage.getStringProper
可以这样做吗? 我正在尝试使用以下命令发送到队列: producerTemplate.sendBodyAndProperty("activemq:queue.queue", message, "JMS
Camel 版本:2.15.6 我使用 ProducerTemplate 发送 http 请求并获得如下响应。 from("direct:getContact") .process(new Proce
首先,我知道有非常相似的问题( Camel producerTemplate is not injected in spring MVC 和 Initializing camel from Sprin
我想在单元测试中模拟邮件发送不发送邮件。 我的代码如下: @Component("utilityRoutes") public class UtilityRoutes extends RouteBui
我正在尝试为 Camel CXF-RS 组件设置“connectionTimeout”here 它在 3rd 方服务上产生 RESTful 请求。默认的 30000 毫秒太长了。 Exchange e
我正在使用 Apache Camel 使用 SOAP 服务,并且出于开发目的,该服务托管在自签名证书上。 我尝试将证书导入 keystore 但失败了,因为证书没有有效的 CN。 我正在尝试忽略证书错
我在我的项目中使用了 Spring MVC 和 Camel,但遇到了 producerTemplate 无法 Autowiring 的问题。请检查下面的详细信息, 文件 web.xml: cont
我正在尝试使用 @EndpointInject 注释来创建一个 ProducerTemplate 来将我的 POJO 连接到 CamelContext(如此处所述 http://camel.apach
ProducerTemplate 在单元测试中用于在新 JndiContext 中构造 bean 时为 null 我正在尝试对使用 bean 动态构建 sftp 端点的路由进行单元测试。当我在正常上下
我正在尝试编写简单的 Storm + Camel 项目。我的 Storm 拓扑分析推文,一个 bolt 应该将推文文本发送到 apache camel 路由,而 apache camel 路由又使用
我是一名优秀的程序员,十分优秀!