问题描述
在以下情况下,我正在寻找您的最佳实践建议和技巧:
在分布式(主要是基于Java)的系统中,
- 许多(不同的)客户端应用程序(Web-App,命令行工具,REST API)
- 中央JMS消息经纪(目前支持使用ActiveMq)
- 多个独立处理节点(在多个远程计算机上运行,计算JMS消息有效负载指定的不同类型的昂贵操作)
如何最好地应用 spring Integration提供的JMS支持框架来解除客户来自工人节点?当阅读参考文档和一些最初的实验时,看起来像是JMS入站适配器的配置本质上需要使用订户,在脱钩的情况下不存在.
小侧注意:通信应通过JMS文本消息进行(使用JSON数据结构以实现未来的可扩展性).
推荐答案
这并没有真正回答您的问题,但请确保您查看 apache骆驼连接不同的组件.我发现它对于将JMS队列连接到现有的Web服务非常有用,并计划将其用于其他组件.
一个示例,用于监视消息的ActiveMQ队列,转换它们并将其发布到Web服务:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring-2.3.0.xsd"> <bean id="callbackProcessor" class="com.package.CallbackProcessor"/> <bean id="activemq" class="org.apache.camel.component.jms.JmsComponent"> <property name="connectionFactory" ref="jmsFactory" /> </bean> <camel:camelContext id="camel"> <!-- Must put this in camel:endpoint because camel:from doesn't support property substitution --> <camel:endpoint id="callbackQueue" uri="activemq:queue:${jms.callback-queue-name}"/> <camel:route> <camel:from ref="callbackQueue"/> <camel:process ref="callbackProcessor"/> <camel:to uri="http://dummy"/><!-- This will be replaced by the callbackProcessor with the callback URL in the message --> </camel:route> </camel:camelContext> </beans>
这就是我们的春季申请中所必需的,以发射骆驼并开始处理消息.
其他推荐答案
这是我今天想出的春季整合,如果您发现可以改进的东西,请跟进.
在客户端可以通过SimpleMessagingGateway发送和接收消息:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:integration="http://www.springframework.org/schema/integration" xmlns:jms="http://www.springframework.org/schema/integration/jms" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd"> <import resource="integration-common.xml"/> <!-- Communication Gateway for the Client (send/receive) --> <bean id="gateway" class="org.springframework.integration.gateway.SimpleMessagingGateway"> <property name="requestChannel" ref="SenderChannel"/> <property name="replyChannel" ref="InboundChannel"/> <property name="replyTimeout" value="1000"/> </bean><!-- TODO: could use integration:gateway --> <!-- Sending out message to JMS request queue --> <integration:channel id="SenderChannel"/> <jms:outbound-channel-adapter channel="SenderChannel" destination="requestQueue" /> <!-- Listen to incoming messages on JMS reply queue --> <integration:channel id="InboundChannel"> <integration:queue/> </integration:channel> <jms:message-driven-channel-adapter destination="replyQueue" channel="InboundChannel" /> </beans>
和处理节点端上的配置看起来像(请参阅Impline Inline,以获取有关Spring集成元素的更多说明):
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:integration="http://www.springframework.org/schema/integration" xmlns:jms="http://www.springframework.org/schema/integration/jms" xmlns:stream="http://www.springframework.org/schema/integration/stream" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd"> <import resource="integration-common.xml"/> <!-- Read in Message Endpoint Service Activator classes --> <context:component-scan base-package="sample.integration.jmsbasic"/> <!-- Listen to incoming messages on the JMS request queue --> <integration:channel id="jmsinToProcChannel"/> <jms:message-driven-channel-adapter destination="requestQueue" channel="jmsinToProcChannel"/> <!-- Delegate message to service implementation and take care of answer --> <integration:service-activator input-channel="jmsinToProcChannel" ref="procService" output-channel="jmsBackChannel" /> <!-- Send answer back to JMS reply queue --> <integration:channel id="jmsBackChannel"/> <jms:outbound-channel-adapter channel="jmsBackChannel" destination="replyQueue" /> </beans>
其他推荐答案
您是否在询问是否可以使用Spring Integration来实现协议桥?然后答案是肯定的,而且这样做很简单.
问题描述
For the following scenario I am looking for your advices and tips on best practices:
In a distributed (mainly Java-based) system with:
- many (different) client applications (web-app, command-line tools, REST API)
- a central JMS message broker (currently in favor of using ActiveMQ)
- multiple stand-alone processing nodes (running on multiple remote machines, computing expensive operations of different types as specified by the JMS message payload)
How would one best apply the JMS support provided by the Spring Integration framework to decouple the clients from the worker nodes? When reading through the reference documentation and some very first experiments it looks like the configuration of an JMS inbound adapter inherently require to use a subscriber, which in a decoupled scenario does not exist.
Small side note: communication should happen via JMS text messages (using a JSON data structure for future extensibility).
推荐答案
This doesn't really answer your question, but make sure you look into Apache Camel for connecting your different components. I found it extremely useful for connecting a JMS queue up to an existing web service and plan to use it for other components also.
An example that monitors an ActiveMQ queue for messages, transforms them, and posts them to a web service:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring-2.3.0.xsd"> <bean id="callbackProcessor" class="com.package.CallbackProcessor"/> <bean id="activemq" class="org.apache.camel.component.jms.JmsComponent"> <property name="connectionFactory" ref="jmsFactory" /> </bean> <camel:camelContext id="camel"> <!-- Must put this in camel:endpoint because camel:from doesn't support property substitution --> <camel:endpoint id="callbackQueue" uri="activemq:queue:${jms.callback-queue-name}"/> <camel:route> <camel:from ref="callbackQueue"/> <camel:process ref="callbackProcessor"/> <camel:to uri="http://dummy"/><!-- This will be replaced by the callbackProcessor with the callback URL in the message --> </camel:route> </camel:camelContext> </beans>
That's all that's necessary in our Spring application to fire up Camel and start processing messages.
其他推荐答案
Here is the Spring Integration I was coming up with today, if you find things which could be improved please follow up.
On the client side the messages can be send out and received through a SimpleMessagingGateway:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:integration="http://www.springframework.org/schema/integration" xmlns:jms="http://www.springframework.org/schema/integration/jms" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd"> <import resource="integration-common.xml"/> <!-- Communication Gateway for the Client (send/receive) --> <bean id="gateway" class="org.springframework.integration.gateway.SimpleMessagingGateway"> <property name="requestChannel" ref="SenderChannel"/> <property name="replyChannel" ref="InboundChannel"/> <property name="replyTimeout" value="1000"/> </bean><!-- TODO: could use integration:gateway --> <!-- Sending out message to JMS request queue --> <integration:channel id="SenderChannel"/> <jms:outbound-channel-adapter channel="SenderChannel" destination="requestQueue" /> <!-- Listen to incoming messages on JMS reply queue --> <integration:channel id="InboundChannel"> <integration:queue/> </integration:channel> <jms:message-driven-channel-adapter destination="replyQueue" channel="InboundChannel" /> </beans>
And the configuration on the processing node side looks like (please see the comments inline for more explanation of the Spring Integration elements):
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:integration="http://www.springframework.org/schema/integration" xmlns:jms="http://www.springframework.org/schema/integration/jms" xmlns:stream="http://www.springframework.org/schema/integration/stream" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd"> <import resource="integration-common.xml"/> <!-- Read in Message Endpoint Service Activator classes --> <context:component-scan base-package="sample.integration.jmsbasic"/> <!-- Listen to incoming messages on the JMS request queue --> <integration:channel id="jmsinToProcChannel"/> <jms:message-driven-channel-adapter destination="requestQueue" channel="jmsinToProcChannel"/> <!-- Delegate message to service implementation and take care of answer --> <integration:service-activator input-channel="jmsinToProcChannel" ref="procService" output-channel="jmsBackChannel" /> <!-- Send answer back to JMS reply queue --> <integration:channel id="jmsBackChannel"/> <jms:outbound-channel-adapter channel="jmsBackChannel" destination="replyQueue" /> </beans>
其他推荐答案
Are you asking if Spring Integration can be used to implement a protocol bridge? Then the answer is yes, and does so quite simply.