Spring AMQP 集成 - 用户手册确认

2023-12-02

我正在测试Spring-AMQP with Spring-Integration支持,我有以下配置和测试:

<rabbit:connection-factory id="connectionFactory" />
<rabbit:queue name="durableQ"/>
<int:channel id="consumingChannel">
    <int:queue capacity="2"/> <!-- Message get Acked as-soon-as filled in Q -->
</int:channel>

<int-amqp:inbound-channel-adapter 
    channel="consumingChannel"
    queue-names="durableQ" 
    connection-factory="connectionFactory"
    concurrent-consumers="1"
    acknowledge-mode="AUTO"
    />


public static void main(String[] args) {
System.out.println("Starting consumer with integration..");
    AbstractApplicationContext context = new ClassPathXmlApplicationContext(
    "classpath:META-INF/spring/integration/spring-integration-context-consumer.xml");

    PollableChannel consumingChannel = context.getBean("consumingChannel",   
                                                          PollableChannel.class);           
        int count = 0;
        while (true) {
            Message<?> msg = consumingChannel.receive(1000);
            System.out.println((count++) + " \t -> " + msg);

            try { //sleep to check number of messages in queue
                Thread.sleep(50000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

在此配置中,很明显,一旦消息到达consumingChannel它们被确认并因此从队列中删除。我通过放置一个高值来验证这一点sleep after receive并检查queue-size。对此没有进一步的控制。

现在如果我设置acknowledge-mode=MANUAL,似乎没有办法手动操作ack通过弹簧集成。

我的需要是处理消息并在处理后执行manual-ack所以直到ack消息仍然保留在durableQ.

有什么办法可以处理吗MANUAL确认spring-amqp-integration?我想避免通过ChannelAwareMessageListener to inbound-channel-adapter因为我想控制消费者receive.

Update:

使用自己的时甚至似乎不可能listener-container with inbound-channel-adapter:

// Below creates a default direct-channel (spring-integration channel) named "adapter", to receive poll this channel which is same as above
<int-amqp:inbound-channel-adapter id="adapter" listener-container="amqpListenerContainer" /> 

<bean id="amqpListenerContainer" class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="queueNames" value="durableQ" />
    <property name="acknowledgeMode" value="MANUAL" />

// messageListener not allowed when using with adapter, so no way of having own ChannelAwareMessageListener, so no channel exposed onMessage, hence no way to ack
    <property name="messageListener" ref="listener"/>
</bean>
<bean id="listener" class="com.sd.springint.rmq.MsgListener"/>

上面的配置会引发错误messageListener不允许使用属性,请参阅标签上的内联注释。所以使用目的listner-container被击败(因为暴露channel via ChannelAwareMessageListener).

To me spring-integration不能用于manual-acknowledgement(我知道,这是一个很难说的说法!),任何人都可以帮助我验证这一点,或者是否有我所缺少的特定方法/配置?


问题是因为您正在使用异步切换QueueChannel。一般情况下控制容器内的并发比较好(concurrent-consumers="2")并且不要在流程中进行任何异步切换(使用DirectChannels)。这样,AUTO ack 就可以正常工作了。而不是从接收PollableChannel订阅一个new MessageHandler() to a SubscribableChannel.

Update:

您通常不需要在 SI 应用程序中处理消息,但使用 DirectChannel 进行的测试相当于......

    SubscribableChannel channel = context.getBean("fromRabbit", SubscribableChannel.class);

    channel.subscribe(new MessageHandler() {

        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            System.out.println("Got " + message);
        }
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring AMQP 集成 - 用户手册确认 的相关文章

随机推荐

  • 不支持的操作:不可写 python

    电子邮件验证 Email validator import re def is email email input Enter your email pattern w 1 w w file open ValidEmails txt r i
  • 如何为 Eclipse 编写插件? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我如何开始编写插件Eclipse 我找过文档 但不幸的是很少或者很差 那么有哪些文章可以推荐呢 Eclipse 和 IBM 的主站点上有一些非常好的资源和教程 最好的方法之一是选
  • mysql_insert_id线程安全吗?

    我正在使用 MySQL C API 构建数据库客户端应用程序 并且我需要获取 INSERT 语句中的最后一个自动增量值 因此 mysql insert id 可以做到 但是这个客户端是多线程的 并且是这样的一段代码 mysql query
  • 如何在Python中使列表只包含不同的元素? [复制]

    这个问题在这里已经有答案了 我有一个 Python 列表 如何使其值唯一 最简单的方法是转换为集合 然后再转换回列表 my list list set my list 这样做的一个缺点是它不会保留订单 您可能还想首先考虑使用集合 而不是列表
  • 保护正在访问的用户文件,以便只有所有者才能访问?

    我正在用 php 编写一个 Web 应用程序 用户可以在其中上传自己的文件或图像 但如何保护这些文件不被所有者以外的其他人访问 想想 dropbox 保护这些文件的机制是什么 我尝试过搜索 但没有得到任何关于此的信息 任何指向教程的指针或链
  • 使用进程名称获取另一个程序的窗口标题

    这个问题可能很基本 但我很难破解它 我假设我必须使用一些东西ctypes windll user32 请记住 我几乎没有使用这些库的经验 甚至没有ctypes作为一个整体 我已经使用此代码列出了所有窗口标题 但我不知道应该如何更改此代码以获
  • 使用html5(提醒应用程序)访问电话闹钟(原生资源)

    这些是我的技术 HTML5 Jquery 移动 Jquery Javascript Css Cordova 我们正在使用 HTML 5 开发应用程序 我们需要访问手机 Android iPhone Windows Phone 资源 例如闹钟
  • Swift 中的重命名问题

    我是第一次使用 Swift 进行编程 在此过程中我遵循this教程 不幸的是 该教程看起来有点过时 并且大多数代码都会引发构建时错误 最常出现的错误是NSURLSession has been renamed to URLSession 我
  • 如何使用 python 以“更智能”的方式下载文件?

    我需要在Python中通过http下载几个文件 最明显的方法就是使用 urllib2 import urllib2 u urllib2 urlopen http server com file html localFile open fil
  • 使用 SICStus Prolog 推广斐波那契数列

    我正在尝试寻找广义斐波那契序列 GFS 查询的解决方案 问题是 是否有第 12 个数字为 885 的 GFS 最初的 2 个数字可能限制在 1 到 10 之间 我已经找到了在从 1 1 开始的序列中查找第 N 个数字的解决方案 其中我明确定
  • 如何使用 Azure AD B2C 保护 Spring Boot REST API 的安全?

    我正在使用 Spring Boot 2 2 0azure active directory b2c spring boot starter2 2 0 我设法用它来保护 Thymeleaf 网页 按照他们的教程 现在 我想要一个以相同方式保护
  • SpringBeanAutowiringSupport不在jUnit测试中注入bean

    I use SpringBean自动装配支持用于某些对象中的 bean 注入 问题是 bean 注入在 jUnit 测试中不起作用 使用 SpringJUnit4ClassRunner 进行测试 public class DossierRe
  • 字节数组的 HashSet [重复]

    这个问题在这里已经有答案了 我需要一个字节数组的 HashSet 来检查集合中是否存在给定的字节数组 但这似乎不适用于字节数组 或可能任何数组 这是我的测试代码 void test byte b1 new byte 1 2 3 byte b
  • PHP函数/过程动态绑定问号

    我对 PHP 还很陌生 我需要通过编写自定义函数来绑定 PDO 中的参数 假设这些是我有的 2 个 sql sample sql 1 select f name age address from table1 where l name an
  • 在 IntelliJ IDEA 中单步调试 JDK 源代码

    如何在 IntelliJ IDEA 7 中单步执行 JDK 源代码并查看调试信息 我当前可以命中断点并单步执行代码 但调试信息不 可用 这意味着我看不到局部变量的值 我只想单步执行一个类的源代码 如果这很重要的话 对于它的价值来说 它是ja
  • Spring 4 与 thymeleaf 国际化无法识别资源属性文件中的消息

    使用 Spring 4 thymeleaf 开发我的 web 应用程序以支持国际化 我尝试了很多方法来更改位置文件和基本名称的配置 但仍然收到 label greeting 在模板结果上 下面是我的代码 Configuration Enab
  • IPv6 应用商店拒绝

    我们的更新今天因 IPv6 网络连接问题两次被拒绝 我们的网络代码在先前版本和当前版本之间没有更改 该应用程序仅向 api metooapp io 发出 https 网络请求 该请求已正确配置为 ipv6 0 并在 AWS 上的route5
  • 如何在zend框架中使用子查询执行查询

    你好 我需要用 Zend Db Select 编写这个 sql 但我不知道如何编写子查询 我将不胜感激任何帮助 谢谢 SELECT FROM advert WHERE categoryId IN SELECT id FROM tree WH
  • 获取正在运行的进程分配的内存区域

    谁能告诉我如何使用 WinAPI 函数获取某个进程的内存分配内存区域 我想知道每个区域 起始地址 大小和其他一些信息 例如保护类型等 我找不到任何 WinAPI 函数来执行此操作 谁能帮我 有代码可以使用暴力破解VirtualQueryEx
  • Spring AMQP 集成 - 用户手册确认

    我正在测试Spring AMQP with Spring Integration支持 我有以下配置和测试