背景
我正在编写一个应用程序,其工作是“模糊”通过“服务总线”从一个“服务”发送到另一“服务”的消息。目的是评估服务总线和服务如何响应所发送的内容。服务总线在可以使用的传输和消息格式方面提供了一定的灵活性。服务总线实现是由其他方开发的,我无法访问该代码。
有一个标准化的XML模式,该模式定义了所有可能的消息类型。基本实现在ActiveMQ上使用XML,但其他选项也是可行的(例如TCP或UDP套接字,专有线路格式,DDS等)。
在这种情况下,模糊测试意味着我将用无效内容替换消息字段或属性的有效内容。该模式部分用于定义无效的内容。也可以使用其他更通用的无效值(例如,对于整数类型字段,值> Integer.MAX)。
我可以使用Apache Camel吗?
最近有人告诉我有关Apache Camel的信息,这可能会帮助我。我听说过骆驼,但从未使用过。我正在努力学习,但是很难找到可以为实际情况提供可理解的帮助的方案或示例。我已经使用Camel编写并测试了一些非常简单的程序,这些程序向我展示了如何轻松捕获信息。 顺便说一句,我没有使用Spring框架。
我需要执行以下操作:
read in a valid XML message instance
parse the XML
for each element/attribute
determine a set of test cases based on type and schema restrictions
for each test case
send the message via service bus implementation
intercept message sent from service bus [need to be able to handle different transports and wire formats]
replace the original field content with the test content
forward the message to the target test service
我认为骆驼可能在以下领域发挥作用:
我需要帮助的是了解Camel的哪些功能可以用来帮助我-以及使用方法的实际示例。我已经成功地从ActiveMQ捕获了一条消息(以XML格式),并且从UDP套接字上捕获了同一条消息的专有二进制数据格式。捕获数据非常容易。
ActiveMQ示例(我很困惑)
作为使用ActiveMQ的一个示例,我正在努力将修改后的消息转发到目标。我不希望目标收到原始消息。
我是否需要设置某种代理以从模糊器捕获AMQ消息,对其进行修改,然后将其路由到AMQ端点?我能想到的唯一方法是尝试从配置为使用代理端口的模糊器中捕获TCP流量,执行模糊处理,然后通过ActiveMQ端口61616将其转发给AMQ主题。
类似于from("mina:tcp:localhost:<proxy_port>").process(fuzzerProcessor).to("jms:topic:<topic>")
,其中为tcp://localhost:61616
配置了ActiveMQ连接工厂。那有意义吗?我怀疑我会遇到很多问题,包括接收到的消息没有被“解码”为我提供XML的事实。我认为这只是从TCP套接字读取的原始字节。
我希望能够捕获ActiveMQ消息,以便可以访问XML内容,即from("jms:topic:<topic>")
。但是,然后,如何将修改后的消息“放回AMQ流”中?
...
如果有人可以向我指出提示和技巧;完整且有据可查的文章,书籍或示例,甚至在我要尝试做的事情中,都非常有用。
更新 [美国东部时间2018年7月11日星期三17:11:06]
对于ActiveMQ用例,我已经通过执行以下操作成功实现了一定程度的成功:
ConnectionFactory amqCnxFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
context.addComponent("activemq", JmsComponent.jmsComponentAutoAcknowledge(amqCnxFactory));
...
context.addRoutes(new RouteBuilder() {
public void configure() {
interceptSendToEndpoint("activemq:topic:ServiceStatus").process(interceptor);
from("activemq:topic:ServiceStatus_SEND").to("activemq:topic:ServiceStatus");
}
});
服务总线配置允许指定其他主题名称,因此对于模糊器的服务总线配置,我将主题名称更改为ServiceStatus_SEND
,而目标服务的配置仅使用了{{1} }。 我非常想找到一种替代方法来进行这项工作,而不必建立一堆“虚拟”主题。
拦截器逻辑做了非常基本的操作,将消息中的字符串值从我一直知道的位置更改为明显不同的内容。
它起作用了,但是至少有一个警告:当我尝试更改我知道在架构中定义为枚举的字段的情况下,并且当我用其他值替换有效值时,消息为通过,但是具有模糊枚举值的元素在目标接收到的消息中未未表示。我不明白那里可能会发生什么。我不认为ActiveMQ对定义消息类型的XML模式有任何了解,但它忽略了无效的元素。这违背了我要去做的目的。
更新 [美国东部时间2018年7月11日星期三17:41:26]
在Wireshark中查看流量后,枚举值已设置为新的无效值。接收服务显然无效,因为它无效。再一次,Wireshark是我的朋友。 ;)