天道酬勤,学无止境

How can I Stop/start/Pause a @JmsListener (the clean way)

I am using Spring(boot) on my project and I access a JMS Queue (ActiveMQ) using :

@JmsListener(destination = "mydestinationQueue")
public void processMessage(String content) {
    //do something
}

And it works perfectly but I need to be able to stop/pause/start this bean programatically (a REST call or something like that)

When I stop or pause this bean I want to be sure to have fully processed the current message.

any idea about that ?

thanks

评论

Here is the solution I've found

@RestController
@RequestMapping("/jms")
public class JmsController {

     @Autowired
     ApplicationContext context;

@RequestMapping(value="/halt", method= RequestMethod.GET)
public @ResponseBody
String haltJmsListener() {
    JmsListenerEndpointRegistry customRegistry =
            context.getBean("jmsRegistry", JmsListenerEndpointRegistry.class);
    customRegistry.stop();
    return "Jms Listener Stopped";
}

@RequestMapping(value="/restart", method=RequestMethod.GET)
public @ResponseBody
String reStartJmsListener() {
    JmsListenerEndpointRegistry customRegistry =
            context.getBean("jmsRegistry", JmsListenerEndpointRegistry.class);
    customRegistry.start();
    return "Jms Listener restarted";
}

@RequestMapping(value="/stopApp", method=RequestMethod.GET)
public @ResponseBody
String stopApp() {
    String[] args={};
    SpringApplication.run(FacturationApplicationFrontDaemon.class, args).close();
    return "stopped";
}

}

There's a bean of type JmsListenerEndpointRegistry (name org.springframework.jms.config.internalJmsListenerEndpointRegistry).

You can access the JMS listener containers from the registry (all or by name) and call stop() on the one(s) you want; the container will stop after any in-process messages complete their processing.

   private void stopJMSListener() {
       if(null == customRegistry){
           customRegistry = context.getBean(JmsListenerEndpointRegistry.class);
       }
        customRegistry.stop();
    }

   private void startJMSListener() {
       if(null == customRegistry){
        JmsListenerEndpointRegistry customRegistry = context.getBean(JmsListenerEndpointRegistry.class);
       }
        customRegistry.start();
    }

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • stop / start / pause in python matplotlib animation
    I'm using FuncAnimation in matplotlib's animation module for some basic animation. This function perpetually loops through the animation. Is there a way by which I can pause and restart the animation by, say, mouse clicks?
  • Springboot整合ActiveMQ发送和接收topic消息的问题
    转载: https://www.cnblogs.com/sjq0928/p/11371620.html 环境搭建 1.创建maven项目(jar) 2.pom.xml添加依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> <
  • SpringBoot ActiveMQ 整合使用
    介绍 ActiveMQ它是 Apache 出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持 JMS1.1 和 J2EE 1.4 规范的 JMS Provider 实现,尽管 JMS 规范出台已经是很久的事情了,但是 JMS 在当今的J2EE应用中间仍然扮演着特殊的地位。—— 摘自百度百科,偷了个懒。相关文章1、SpringBoot Kafka 整合使用2、SpringBoot RabbitMQ 整合使用安装 ActiveMQ同之前一样,直接在 Docker 里面玩吧。命令也是一行解决:(右移可看到全部代码)docker run -d -p 8161:8161 -p 61616:61616 -e ACTIVEMQ_ADMIN_LOGIN=admin -e ACTIVEMQ_ADMIN_PASSWORD=admin --name activemq webcenter/activemq简单解释下:8186: 表示 ActiveMQ 控制台端口号,它和 RabbitMQ 一样都是有控制台的,可以登陆控制台进行操作的61616 : 表示 ActiveMQ 所监听的 TCP 端口号,应用程序可通过该端口号与 ActiveMQ 建立 TCP 连接CTIVEMQADMINLOGIN :登陆控制台的用户名ACTIVEMQADMINPASSWORD :登陆控制台的密码执行后
  • SpringBoot整合Active MQ,实现队列消息的提供和消费
    1,pom.xml文件中添加active MQ的依赖,spring boot框架中已整合了Active MQ的jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> 2,application.yml文件中添加MQ配置 spring: activemq: user: admin password: admin broker-url: failover:(tcp://192.168.1.1:61616)?randomize=false 3,MQ配置文件ActiveMQConfig.java,负责连接MQ服务端,以及创建队列和主题的消息监听 import org.apache.activemq.ActiveMQConnectionFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration
  • How to abort a thread in a fast and clean way in java?
    Here is my problem: I've got a dialog with some parameters that the user can change (via a spinner for example). Each time one of these parameters is changed, I launch a thread to update a 3D view according to the new parameter value. If the user changes another value (or the same value again by clicking many times on the spinner arrow) while the first thread is working, I would like to abort the first thread (and the update of the 3D view) and launch a new one with the latest parameter value. How can I do something like that? PS: There is no loop in the run() method of my thread, so checking
  • 我可以恢复已删除的文件(撤消`git clean -fdx`)吗?(Can I restore deleted files (undo a `git clean -fdx`)?)
    问题 我正在按照制作github页面的说明进行操作,却忘记向下移动到我的git子目录中。 结果,我只是使用git clean -fdx了整个文档目录。 有什么办法可以消除这个可怕的错误? 回答1 否。这些文件不见了。 (仅在Linux上检查过:git clean调用unlink(),并且不预先备份任何内容。) 回答2 git clean -fdxn 将进行试运行,并显示如果运行将删除哪些文件 git clean -fdx (当然,这只有在您提前知道但下次才知道的情况下才有用) 回答3 IntelliJ / Android Studio允许从本地历史记录还原文件。 回答4 否。“ git clean -fdx”将从您的工作目录中删除git没有跟踪的所有文件和目录。 因为Git不会跟踪这些文件,所以它不会有这些文件的任何备份。 至少通常不是这样。 如果您最近在这些文件之一上执行了“ git add”操作(但中止了提交),则可以使用“ git fsck --lost-found”找到它。 值得一试,但是不要把希望寄予太大的希望。 将来,您应该考虑犯几次而不是很少几次。 这样,即使您最终没有将这些提交推送到远程,也将至少具有本地备份。 回答5 就像上面提到的@kusma一样,如果您很幸运(如果您曾经做过“ git add”的话),则可以使用以下内容提取整个对象: git fsck |
  • What is a clean, Pythonic way to have multiple constructors in Python?
    I can't find a definitive answer for this. As far as I know, you can't have multiple __init__ functions in a Python class. So how do I solve this problem? Suppose I have a class called Cheese with the number_of_holes property. How can I have two ways of creating cheese objects... One that takes a number of holes like this: parmesan = Cheese(num_holes = 15) And one that takes no arguments and just randomizes the number_of_holes property: gouda = Cheese() I can think of only one way to do this, but this seems clunky: class Cheese(): def __init__(self, num_holes = 0): if (num_holes == 0): #
  • How can I cleanly set the pageEncoding of all my JSPs?
    I need to encode all of my JSPs as UTF-8. I've looked around and found that I can use the following page directive to accomplish this: <%@page pageEncoding="UTF-8"%> This works perfectly, but I need a way to include that directive to all of my JSPs. I don't want to paste it at the top of each JSP file in my project. I have a header file that all my JSPs use to display the page header. I'd like to be able to set the page encoding in the included header file, and have it apply to the page that's including it. Unfortunately, from reading this, it looks like the <%@ page %> directive only carries
  • Various ways to remove local Git changes
    I just cloned a git repository and checked out a branch. I worked on it, and then decided to remove all my local changes, as I wanted the original copy. In short, I had to do the following two commands to remove my local changes git checkout . git clean -f My question is, (1) Is this the correct approach in getting rid of local changes, or else please let me know the correct approach. (2) when do we use git reset --hard as i am able to reset even without this command Thanks *Solution : Major Edit(s): 03/26 : * Replaced many of vague terms with git specific terminology [tracked/untracked/staged
  • 这是验证Django模型字段的方法吗?(Is this the way to validate Django model fields?)
    问题 据我了解,当创建一个Django应用程序时,数据会先通过表单进行验证,然后再将其插入模型实例中,然后再写入数据库中。 但是,如果我想在数据模型层上创建一个额外的保护层,那么在目前的“最佳实践”之下我做了什么? 我试图确保审稿人的姓名不会被遗漏或保留为空白。 我是否应该像在此所做的那样在“ clean”方法中放入任何自定义验证,然后将“ save”调用为“ clean”的“ full_clean”调用?如果不是,首选方法是什么? class Reviewer(models.Model): name = models.CharField(max_length=128, default=None) def clean(self, *args, **kwargs): if self.name == '': raise ValidationError('Reviewer name cannot be blank') super(Reviewer, self).clean(*args, **kwargs) def full_clean(self, *args, **kwargs): return self.clean(*args, **kwargs) def save(self, *args, **kwargs): self.full_clean() super(Reviewer
  • 如何通过Django中的contrib.auth使模型用户中的电子邮件字段唯一(How to make email field unique in model User from contrib.auth in Django)
    问题 我需要通过确保电子邮件字段条目唯一来修补contrib.auth的标准用户模型: User._meta.fields[4].unique = True 代码在哪里最好做到这一点? 我想避免使用数字字段[4] 。 最好使用用户fields ['email'] ,但字段不是字典,而是列表。 另一个想法可能是打开一个新票证,然后在settings.py上传带有新参数的补丁程序: AUTH_USER_EMAIL_UNIQUE = True 关于在Django用户模型中实现电子邮件地址唯一性的最正确方法有何建议? 回答1 警告:以下代码是为Django的较早版本编写的(在引入自定义用户模型之前)。 它包含竞争条件,并且仅应与SERIALIZABLE的事务隔离级别和请求范围的事务一起使用。 您的代码将无效,因为字段实例的属性是只读的。 我担心这可能比您想的要复杂一些。 如果仅使用表单创建User实例,则可以定义一个强制执行以下行为的自定义ModelForm: from django import forms from django.contrib.auth.models import User class UserForm(forms.ModelForm): class Meta: model = User def clean_email(self): email = self
  • 如何完全卸载Visual Studio 2010?(How to completely uninstall Visual Studio 2010?)
    问题 我一直在寻找一种CLEAN解决方案,以完全并最终从我的计算机中删除Visual Studio 2010。 安装Visual Studio时,它还会在“添加/删除程序”面板( appwiz.cpl )中安装一堆程序(约55个)。 我已经尝试过由Microsoft制造的小型实用程序,但是几乎没有任何作用。 我现在真的在寻找一种更好的方法来卸载任何版本的Microsoft Visual Studio。 因为我有很多计算机,所以我经常切换到一个版本或另一个版本,或者我只是决定不再需要在一台计算机上使用它来获取一些空间。 真的,什么是最佳解决方案? 如果没有,为什么微软没有开发出一种效果很好的产品呢? 回答1 2016年4月更新-适用于VS2013 + 微软从2015年底开始通过发布VisualStudioUninstaller解决此问题。 他们暂时放弃了解决方案。 但是,截至2016年4月,工作又重新开始了。 该卸载程序的官方版本最终于2016年4月发布,被描述为“旨在清理/修复Visual Studio 2013,Visual Studio 2015和Visual Studio vNext的所有Preview / RC / RTM版本”。 原始答案-适用于VS2010,VS2012 请注意,以下两个解决方案仍然会留下痕迹(例如注册表文件),并且不能真正视为“干净的”卸载
  • 您如何清除Apache Maven的缓存?(How do you clear Apache Maven's cache?)
    问题 最近,Apache Maven似乎存在缓存问题。 即使应该更新较新工件的文件,使用Windows Vista或Windows 7在我们的项目上执行全新安装有时也会产生与以前的版本具有相同数据的工件。 是否有任何方法可以清除此缓存,以强制Maven始终触发应构建的本地工件的干净构建? 特别是,我们在使用war插件构建Web应用程序时遇到了问题。 Maven版本是3.0.3。 战争插件的版本是2.1.1。 回答1 手动从c:\Users\<username>\.m2\repository删除工件(或完整的本地c:\Users\<username>\.m2\repository 。 回答2 要清理本地缓存,请尝试使用依赖项插件。 mvn dependency:purge-local-repository :这是一种尝试删除本地存储库文件的尝试,但是在删除所有内容后,它总是会继续并填充本地存储库。 mvn dependency:purge-local-repository -DreResolve=false :这避免了重新解析依赖项,但有时仍会进入网络。 mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false :这是PawełPrażak所添加的,并且似乎运行良好。
  • How can I effectively clean up styles in a large web site?
    Our web site has been under a constant development for a better part of the last five years. As it happens, pretty much all the styles for the site are in one big CSS file. With time this css file has grown to about 9,000 lines - and I'm sure some of those styles are not used any more and quite a few styles provide duplicate functionality. The site is written with PHP/Smarty; there are over 300 smarty templates and the whole site contains over 1000 different pages (read - unique URLs). I'm sure it will continue growing - as will the CSS file. What's the best way to clean up this file? Update
  • 离开深度嵌套的堆栈时,这是清理Fragment back堆栈的正确方法吗?(Is this the right way to clean-up Fragment back stack when leaving a deeply nested stack?)
    问题 我正在使用Android兼容性库来实现片段,并扩展了布局示例,以便一个片段包含一个可以触发另一个片段的按钮。 在左侧的选择窗格中,我有5个可选项目ABCDE 。 每个都在详细信息窗格中加载一个片段(通过FragmentTransaction:replace ) abcde 现在,我将片段e扩展为包含一个按钮,该按钮还在详细信息窗格中加载了另一个片段e1 。 我已经对片段e的onClick方法执行了以下操作: FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); ft.replace(R.id.details_frag, newFrag); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.addToBackStack(null); ft.commit(); 如果我进行以下选择: E - e - e1 - D - E 然后,片段e在详细信息窗格中。 这很好,我想要的。 但是,如果我此时单击“ back按钮,则无济于事。 我必须单击两次,因为e1仍在堆栈中。 此外,单击后,在onCreateView中出现了空指针异常: 为了“解决”这个问题,无论何时选择ABCDE我都会添加以下内容:
  • 使用VB.NET处理Excel com对象的正确方法?(The proper way to dispose Excel com object using VB.NET?)
    问题 我有以下代码(从在线教程中获得)。 该代码可以正常工作,但是我怀疑处理Excel com对象的方法有些不正确。 我们真的需要调用GC.Collect吗? 或处置此Excel com对象的最佳方法是什么? Public Sub t1() Dim oExcel As New Excel.Application Dim oBook As Excel.Workbook = oExcel.Workbooks.Open(TextBox2.Text) 'select WorkSheet based on name Dim oWS As Excel.Worksheet = CType(oBook.Sheets("Sheet1"), Excel.Worksheet) Try oExcel.Visible = False 'now showing the cell value MessageBox.Show(oWS.Range(TextBox6.Text).Text) oBook.Close() oExcel.Quit() releaseObject(oExcel) releaseObject(oBook) releaseObject(oWS) Catch ex As Exception MsgBox("Error: " & ex.ToString, MsgBoxStyle.Critical,
  • Clean-State:新的React状态管理姿势
    一、背景在目前以MVVM为核心的软件开发模式下,我们知道视图的本质就是对数据的表达,任何数据的突变都会带来视图上的反馈。当面临一个大型项目开发时,为了提高后续的维护迭代效率,我们首先要做的就是模块拆解,让每一个部分尽可能碎片化可复用,这也是微组件的初级概念。而在整个拆解的过程中,我们碎片化的其实是UI层。比如一个弹窗,在特定的业务上有会统一的设计标准,变化的只是文案;亦或是一个大列表,每次更新的是元数据,卡片的轮廓保持了统一。那么数据该如何处理,试想如果跟随组件走,那当一个项目越来越大时,散落在各个地方的数据和逻辑会急剧增大该软件的熵,造成后面的需求迭代、错误排查、调试维护等难度指数级增大。所以,对数据一定程度上的中心化成为了前端正确的开发理念。二、方案1. Redux在React里我们把与视图相对应的数据称之为状态,关乎状态管理的方案也经历了一个刀耕火种的时代。最出名的是Redux,它虽然在性能上被人诟病但是奈何思想正确被最大程度的使用。它将数据中心化为State存储在store中,通过dispatch来发布一个action触发reducer来更新。设计理念是很好,但是当真正用到项目中时我们就会发现几个问题:(1)架构层面如何组织?这里我们不得不引入很多第三方开发库,比如react-redux、redux-thunk、redux-saga等等,这无疑增加了很大的学习成本
  • How to clean up R memory (without the need to restart my PC)?
    I am running my code in R (under Windows) which involves a lot of in-memory data. I tried to use rm(list=ls()) to clean up memory, but seems the memory is still occupied and I cannot rerun my code. I tried to close the R and restart R again, but it is the same, seems memory is still occupied as when I run the codes it says it can't allocate memory (but it could at the first time). The memory seems only cleaned up after I restart my PC. Is there any way to clean up the memory so that I can rerun my code without restarting my PC every time?
  • 以Django形式获取请求数据(get request data in Django form)
    问题 是否可以在表单类中获取request.user数据? 我想清理一个电子邮件地址以确保它是唯一的,但是如果它是当前用户的电子邮件地址,则它应该通过。 这是我目前拥有的东西,非常适合创建新用户,但是如果我要编辑用户,则会遇到他们的电子邮件无法验证的问题,因为它已经被接受了。 如果我可以使用request.user.email检查这是他们的电子邮件,则可以解决我的问题,但是我不确定该怎么做。 class editUserForm(forms.Form): email_address = forms.EmailField(widget=forms.TextInput(attrs={'class':'required'})) def clean_email_address(self): this_email = self.cleaned_data['email_address'] test = UserProfiles.objects.filter(email = this_email) if len(test)>0: raise ValidationError("A user with that email already exists.") else: return this_email 回答1 正如ars和Diarmuid指出的那样,您可以将request.user传递到表单中
  • How to Delete Derived Data and Clean Project in Xcode 5 and later?
    Is there a procedure I can follow that includes running a script in the terminal, to delete all the files under the derived data folder and reliably clean a project? Sometimes, a project's assets don't always get updated to my simulator or device. It's mostly trial and error, and when I find that an old asset made its way into a test build, it's too late, not to mention embarrassing! I've looked at this question, but it seems a little outdated: How to Empty Caches and Clean All Targets Xcode 4 I also checked out this question, but I don't want to waste time in Organizer, if I don't absolutely