我有一个JmsConfig
配置类,它通过以下方式处理来自主题的JMS事件:
@Bean ConnectionFactory
,其中包含一个ActiveMQ实现@Bean JmsListenerContainerFactory
实例化一个DefaultJmsListenerContainerFactory
,并通过Boot的DefaultJmsListenerContainerFactoryConfigurer
- 它定义了一个
@Bean MessageConverter
,其中包含一个映射Jackson2MessageConverter
,并设置一个自定义对象映射器
- 我在我的服务方法上使用了指向myfactory的
@JmsListener
注释。这是我对这个主题的唯一用途,仅限订阅
现在我想转到Spring集成。在阅读了大量内容之后,如果我不需要双向使用(丢弃网关)或轮询机制(丢弃
@InboundChannelAdapter
),我将使用传统的XML配置措辞,选择一个消息驱动的通道适配器。我发现Java习语应该通过新的Spring Integration DSL库来实现,因此,我寻找合适的代码片段。
似乎
JmsMessageDrivenChannelAdapter
是正确的等价物,我找到了一种方法:
IntegrationFlows。来自(Jms.messageDriverChannelAdapter(…))
但问题是,它只接受ActiveMQ连接工厂或
AbstractMessageListenerContainer
,而不接受my boot预配置的JmsListenerContainerFactory
!
如何最终实现这一点?
甚至还有一个更好的方法。我很惊讶Gary没有评论它。有一个开箱即用的构建器叫做Jms.container(...)
。
@Bean
public IntegrationFlow jmsMyServiceMsgInboundFlow(ConnectionFactory connectionFactory, MessageConverter jmsMessageConverter, MyService myService, JmsProperties jmsProperties, @Value("${mycompany.jms.destination.my-topic}") String topicDestination){
JmsProperties.Listener jmsInProps = jmsProperties.getListener();
return IntegrationFlows.from(
Jms.messageDrivenChannelAdapter( Jms.container(connectionFactory, topicDestination)
.pubSubDomain(false)
.sessionAcknowledgeMode(jmsInProps .getAcknowledgeMode().getMode())
.maxMessagesPerTask(1)
.errorHandler(e -> e.printStackTrace())
.cacheLevel(0)
.concurrency(jmsInProps.formatConcurrency())
.taskExecutor(Executors.newCachedThreadPool())
.get()))
)
.extractPayload(true)
.jmsMessageConverter(jmsMessageConverter)
.destination(topicDestination)
.autoStartup(true)
//.errorChannel("NOPE")
)
.log(LoggingHandler.Level.DEBUG)
.log()
.handle(myService, "myMethod", e -> e.async(true).advice(retryAdvice()))
.get();
JmsListenerContainerFactory
是特定于@JmsListener
的,它是用于配置DefaultMessageListenerContainer
的更高级别抽象。Boot不为原始DefaultMessageListenerContainer
提供自动配置选项;你得自己接线。但你仍然可以使用启动属性。。。
@Bean
public IntegrationFlow flow(ConnectionFactory connectionFactory,
JmsProperties properties) {
return IntegrationFlows.from(Jms.messageDrivenChannelAdapter(container(connectionFactory, properties)))
...
.get();
}
private DefaultMessageListenerContainer container(ConnectionFactory connectionFactory,
JmsProperties properties) {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConcurrentConsumers(properties.getListener().getConcurrency());
container.setMaxConcurrentConsumers(properties.getListener().getMaxConcurrency());
...
return container;
}
ap.offPagePause(CALLBACK) 移除 pagePause 事件的监听。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <button class="btn btn-default">打开新页面</but
ap.offPageResume(CALLBACK) 移除 pageResume 事件的监听。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <button class="btn btn-default">打开新页面</b
ap.offResume(CALLBACK) 移除 resume 事件的监听。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <button class="btn btn-default">打开新页面</button> <
ap.offPause(CALLBACK) 移除 pause 事件的监听。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <button class="btn btn-default">打开新页面</button> <sc
本文向大家介绍vue监听滚动事件的方法,包括了vue监听滚动事件的方法的使用技巧和注意事项,需要的朋友参考一下 vue中监听滚动事件,然后对其进行事件处理,一般有:1. 滚动到顶部吸附; 2. 根据滚动的位置激活对应的tab键(锚链接tab键) 这两种方式的处理都是可通过监听scroll来实现 处理方法 1. 滚动到顶部吸附 html元素 methods方法 2. 根据滚动的位置激活对应的tab键
我试图弄清楚如何以及何时从部署在Docker群中的Docker容器运行mybatis模式迁移。我的意思是:我需要最正确的方法来做到这一点。 目前,我们从Dockerfile构建Docker容器 然后开始。sh脚本包含 但是通过这种方式,我们必须从Ubuntu构建一个映像,安装Maven,并在迁移开始时使用“硬编码”环境。sh文件,因此我们需要来自不同环境的不同文件。 您认为在构建/部署过程中运行这