- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 Apache Camel 时遇到了一个我无法理解的问题。我在使用 JBoss Fuse 6.3.0 时遇到了这个问题,它捆绑了 Apache Camel 2.17.0.redhat-630224。
我有一个简单的路线:它从 FTP 服务器下载文件,将它们转换为 POJO(这部分有效),然后将它们聚合到单个 POJO 中,该 POJO 被编码并保存到文件中。
在 JBoss Developer Studio 中,我通过执行“Run as...> local Camel context”来测试这一点。在幕后,这只是运行mvn clean package org.apache.camel:camel-maven-plugin:run
。无论我是从 IDE 执行此操作,还是在终端中手动执行此操作,该路线都可以正常工作。
但是,当我构建 OSGi bundle (使用 mvn clean install
)并将其部署到 JBoss Fuse (Apache Karaf) 中时,应用程序部署成功并且下载/转换部分工作正常,但是那么聚合失败。
聚合由实现 org.apache.camel.processor.aggregate.AggregationStrategy 的自定义类处理(记录为 here )。我遇到的问题是我收到的 newExchange 参数始终具有空主体。现在,oldExchange
第一次为 null 是正常的,但是 newExchange
的主体呢? (编辑:相关表达式是一个简单的常量,因为所有 POJO 都聚合在一起)
更奇怪的是:如果我修改路由以在聚合器之前编码 POJO,我会收到一个包含预期数据的字符串。这证明(我认为!)转换按预期进行。此外,Fuse 的日志没有显示任何错误消息(无论是在部署时还是在运行时)。这看起来很像配置或依赖问题,但在我的一生中,我找不到任何地方报告的任何类似问题。
有人见过类似的东西吗?或者至少,您对问题的根源有什么建议吗?
编辑:这是路线的相关部分:
<choice>
// one <when> per file which produces a POJO
<when id="_when_some_xml">
<simple>${file:onlyname} == 'something.xml'</simple>
<to id="_to2" uri="ref:transform_something_xml"/>
</when>
</choice>
// if I add a marshalling here, I receive non-null exchanges in the aggregator... but they're strings and not the POJOs I want.
<aggregate completionSize="12" id="_aggregate_things"
strategyMethodAllowNull="true" strategyRef="MyAggregator">
<correlationExpression>
<constant trim="false">true</constant>
</correlationExpression>
<log id="_log_things_aggregated" message="Data aggregated."/>
<convertBodyTo id="_convertBodyTo_anotherClass" type="net.j11e.mypackage.MyClass"/>
// [...] next: marshal and save to file
注意:我尝试使用strategyMethodAllowNull="false",但没有改变任何事情。
这是聚合器:
public class EpgAggregator implements AggregationStrategy {
@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
// first message being aggregated: no oldExchange, simply keep the message
if (oldExchange == null) {
System.out.println("Old exchange is null");
return newExchange;
}
if (newExchange.getIn().getBody(MyClass.class) == null) {
System.out.println("newExchange body is null");
}
// ...
如果我删除第一个 if
中的 return
,第二个 if
每次都会触发,即使是第一次聚合也是如此。
编辑好的,感谢下面 noMad17n 的评论,我有了突破:问题与类加载有关。
当我在未指定类的情况下获取 newExchanges
的正文时 (Object newBody = newExchange.getIn().getBody();
),结果不为 null ,但我无法将其转换为 MyClass
:我收到 java.lang.ClassCastException: net.j11e.MyClass 无法转换为 net.j11e.MyClass
。
阅读有关 OSGi 如何导致多个类加载器加载同一个类的信息后,我将 MyClass
重命名为 MyOtherClass
,并在重新启动后(??),一切正常。但是,卸载我的 bundle 并重新安装后,问题又回来了。
osgi:find-class MyClass
返回两个包:mine 和 dozer-osgi,(我猜)这是合乎逻辑的,因为 MyClass 实例是由 dozer 转换生成的。
好吧,也许我不应该经常卸载和重新安装 bundle ,而应该使用 osgi:update 、 osgi:refresh 或其他。但是,仍然应该有办法让这项工作发挥作用吗?除了卸载我的 bundle 、刷新/更新推土机、停止/重新启动 Fuse 以及重新安装我的 bundle 之外,还希望上述操作之一能够以某种方式加载正确的类吗?
最佳答案
对于那些将来可能遇到此问题的人,这里有一个回顾:
getBody
返回 null(getMandatoryBody
将返回异常等)osgi:find-class MyClass
。这将返回您的 bundle ...以及另一个 bundle 。osgi:list | grep thebundle
) 并刷新它 (osgi:refresh 123
) 来刷新该 bundle 。您还可以从 Fuse 的 Web UI (hawtio) 刷新 bundle :OSGi > bundle > 您的 bundle > 页面顶部的刷新按钮(位于启动、停止、更新和卸载按钮旁边)。对于这个问题来说,这更像是一种缓解措施,而不是适当的解决方案。真正的解决方案可能涉及修复包导入/导出规则或其他内容,但这超出了我目前的技能范围。
也是公平的警告:有时,刷新 dozer-osgi 显然是不够的。 MyClass 不再被它导入(osgi:find-class MyClass 不会返回 dozer-osgi),但我仍然遇到 NullPointerException 问题。在这些罕见的情况下,我不得不重新启动 Fuse。我不知道为什么会发生这几个案例。
关于java - Apache Camel 聚合在 IDE 中和在 JBoss Fuse 中部署时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43184357/
我有一个 Cassandra 集群,里面有 4 个表和数据。 我想使用聚合函数(sum,max ...)发出请求,但我在这里读到这是不可能的: http://www.datastax.com/docu
我有以下两张表 Table: items ID | TITLE 249 | One 250 | Two 251 | Three 我投票给这些: Table: votes VID | IID | u
这个问题在这里已经有了答案: Update MongoDB field using value of another field (12 个答案) 关闭 3 年前。 我想根据另一个“源”集合的文档中
我的收藏包含以下文件。我想使用聚合来计算里面有多少客户,但我遇到了一些问题。我可以获得总行数,但不能获得总(唯一)客户。 [{ _id: "n001", channel: "Kalip
我有下表 Id Letter 1001 A 1001 H 1001 H 1001 H 1001 B 1001 H 1001 H 1001
得到一列的表 ABC。 “创建”的日期列。所以样本值就像; created 2009-06-18 13:56:00 2009-06-18 12:56:00 2009-06-17 14:02:0
我有一个带有数组字段的集合: {[ name:String buyPrice:Int sellPrice:Int ]} 我试图找到最低和最高买入/卖出价格。在某些条目中,买入或卖出价格为零
我有以下问题: 在我的 mongo db 中,我有以下结构: { "instanceId": "12", "eventId": "0-1b", "activityType":
下面给出的是我要在其上触发聚合查询的 Elasticsearch 文档。 { "id": 1, "attributes": [ { "fieldId": 1,
我正在使用 Django 的 aggregate query expression总计一些值。最终值是一个除法表达式,有时可能以零作为分母。如果是这种情况,我需要一种方法来逃避,以便它只返回 0。 我
我正在学习核心数据,特别是聚合。 当前我想要做的事情:计算表中在某些条件上具有逆关系的多对关系的记录数。 目前我正在这样做: NSExpression *ex = [NSExpression expr
我需要有关 Delphi 中的 ClientDatasets 的一些帮助。 我想要实现的是一个显示客户的网格,其中一列显示每个客户的订单数量。我将 ClientDataset 放在表单上并从 Delp
我的集合有 10M 个文档,并且有一个名为 movieId 的字段;该文档具有以下结构: { "_id" : ObjectId("589bed43e3d78e89bfd9b779"), "us
这个问题已经有答案了: What is the difference between association, aggregation and composition? (21 个回答) 已关闭 9
我在 elasticsearch 中有一些类似于这些示例的文档: { "id": ">", "list": [ "a", "b", "c" ] } { "id"
我正在做一些聚合。但是结果完全不是我所期望的,似乎它们没有聚合索引中与我的查询匹配的所有文档,在这种情况下 - 它有什么好处? 例如,首先我做这个查询: {"index":"datalayer","t
假设我在 ES 中有这些数据。 | KEY | value | |:-----------|------------:| | A |
可能在我的文档中,我有一个被分析的文本字段。我只是在ElasticSearch AggregationAPI中迷路了。我需要2种不同情况的支持: 情况A)结果是带有计数标记(条款)的篮子下降。 情况B
我正在为网上商店构建多面过滤功能,如下所示: Filter on Brand: [ ] LG (10) [ ] Apple (5) [ ] HTC (3) Filter on OS: [ ] Andr
我有一个父/子关系并且正在搜索 child 。 是否可以在父属性上创建聚合? 例如parent 是 POST,children 是 COMMENT。如果父项具有“类别”属性,是否可以搜索 COMMEN
我是一名优秀的程序员,十分优秀!