我尝试将集成咖啡馆演示转换为Java8 DSL,在官方Spring集成示例中有一些现有的示例。
我想把这些例子中所有好的部分结合起来。
代码(不是预期的工作,一些问题)在这里。
在官方的XML示例中,很容易在Amqp网关中设置请求/回复通道。但是转到Java8DSL,选项缺失。
并且在应用时,会抱怨“需要回复通道或输出通道”。
顺便问一下,有没有更好的选项来调试/单元测试Spring集成应用程序?
更新1:当我写coldDrinks流时感到困惑。
XML来自原始的caf-amqp项目。
<!-- To receive an AMQP Message from a Queue, and respond to its reply-to address, configure an inbound-gateway. -->
<int-amqp:inbound-gateway
id="coldDrinksBarista"
request-channel="coldJsonDrinks"
queue-names="cold-drinks"
connection-factory="rabbitConnectionFactory" />
<int:chain input-channel="coldJsonDrinks">
<int:json-to-object-transformer type="org.springframework.integration.samples.cafe.OrderItem"/>
<int:service-activator method="prepareColdDrink">
<bean class="org.springframework.integration.samples.cafe.xml.Barista"/>
</int:service-activator>
<int:object-to-json-transformer content-type="text/x-json"/>
</int:chain>
如何有效地将其转换为JavaDSL。我把我的想法添加到内联
@Bean
public IntegrationFlow coldDrinksFlow(AmqpTemplate amqpTemplate) {
return IntegrationFlows
.from("coldDrinks")
.handle(
Amqp.outboundGateway(amqpTemplate)
.exchangeName(TOPIC_EXCHANGE_CAFE_DRINKS)
.routingKey(ROUTING_KEY_COLD_DRINKS)
)
.log("coldDrinksFlow")
.channel(preparedDrinksChannel())
.get();
}
@Bean
public IntegrationFlow coldDrinksBaristaFlow(ConnectionFactory connectionFactory, Barista barista) {
return IntegrationFlows
.from(Amqp.inboundGateway(connectionFactory, QUEUE_COLD_DRINKS)
.configureContainer(
c -> c.receiveTimeout(10000)
)// If setup replyChannel the below `handle` is not worked as expected.
)
.handle(OrderItem.class, (payload, headers) -> (Drink) barista.prepareColdDrink(payload))
//If adding a channel here, the flow will NOT return back the `coldDrinksFlow` will cause another exception, "its requiresReply is set to true..."
.get();
}
根据我之前的经验,我希望通过协议(HTTP、FTP等)打破整个流程,作为小流程中的边缘(开始时入站,结束时出站)。入站/出站网关很容易将其设置为工作状态,而无需设置回复通道等。默认情况下,它应该使用其内置协议而不是通道通过原始路由进行回复。在我的inboundGateway RSocket示例中,我没有在那里设置回复通道,但消息返回到roscket路由,并由客户端(OutboundGateway)接收。
更新:终于工作了,请检查这里。当我试图使用Amqp发送和接收对象消息时,我在这里遇到了一个问题,抛出了一些类强制转换异常,当使用<代码>句柄etcMessageHandler
时,标题中的TypeId没有改变,必须像基于xml的caf-amqp那样转换bwteenjson/对象才能使其最终工作。这里缺少什么?
该回购中已经有一个官方JavaDSL样本:https://github.com/spring-projects/spring-integration-samples/tree/master/dsl/cafe-dsl.
是的,不存在AMQP变体,但是如果您遵循来自sping-整合-amqp
的Amqp
工厂,那么将该XML配置转换为JavaDSL应该不会太难。
不确定您在测试中使用的“坏选项”是什么,但在spring集成测试中
我们提供了足够的UTIL来简化流测试:https://docs.spring.io/spring-integration/docs/5.3.2.RELEASE/reference/html/testing.html#testing
更新
你的问题是:
<int-amqp:outbound-gateway
id="coldDrinksBarista"
request-channel="coldDrinks"
reply-channel="preparedJsonDrinks"
exchange-name="cafe-drinks"
routing-key="drink.cold"
amqp-template="amqpTemplate" />
您的配置:
@Bean
public IntegrationFlow coldDrinksFlow(AmqpTemplate amqpTemplate) {
return IntegrationFlows
.from("coldDrinks")
.handle(
Amqp.outboundGateway(amqpTemplate)
.exchangeName(TOPIC_EXCHANGE_CAFE_DRINKS)
.routingKey(ROUTING_KEY_COLD_DRINKS)
)
.get();
}
没有类似的回复频道
部分。这就是为什么需要回复通道或输出通道的原因,因为您从
路由发送,该路由不需要任何回复。也许你还没有完成整个逻辑的应用程序设计。。。
XML输入文件: XML输入文件转换为XML输出文件。将XML输入文件的firstName、middleName和lastName标签合并为XML Ouput文件的name标签,将XML输入文件的address1、address2、city、state和pincode标签合并为XML Ouput文件的address标签。 我几乎转换了代码,但我在这里与empId作斗争。我已经在XSLT文件中手动输
问题内容: 我有一些需要用XML迷惑的HTML文件。我们正在使用这些HTML为应用程序提供内容,但是现在我们必须以XML形式提供这些内容。 HTML文件包含,表格,div,图像,p,b或强标签等。 我用谷歌搜索并找到了一些应用程序,但是我还无法实现。 您能否建议一种将这些文件内容转换为XML的方法? 问题答案: 我成功使用了命令行实用程序。在Linux上,我使用迅速安装了它。然后命令: 给了一个x
问题内容: 我试图将JSON输出转换为XML。不幸的是我得到这个错误: JSON根对象具有多个属性。根对象必须具有单个属性才能创建有效的XML文档。考虑指定DeserializeRootElementName。 这就是我到目前为止所创建的。 这是我的JSON输出: 我怎么解决这个问题? 问题答案: 尽管问题中提供的JSON并不完整,但您在顶层具有多个属性,如异常所示。您必须为其定义根以获取有效的X
我是log4j的新手。我正在将一个应用程序从log4j1.2转换为log4j2。在log4j中。我发现的属性文件有以下配置。 如何将此配置转换为log4j2配置? 谢谢
问题内容: 我尝试不使用任何xml。 像这样一个:转换为@Bean 问题在这里。 尝试将“ com.cloudlb.domain.User”转换为Class []无效。 错误:投放问题。 先感谢您。 问题答案:
问题内容: 输入XML 输出Json 如何编写通用的xslt样式表,它将输入的xml转换为json 输入可能在根目录下有太多结果,在结果下可能有系统和名称,在系统下还有ID名称和值。 问题答案: 我从此处复制并粘贴的以下XSLT 应该可以帮助您将XML转换为JSON。谢谢 :)