天道酬勤,学无止境

如何停止/启动/暂停@JmsListener(干净的方法)(How can I Stop/start/Pause a @JmsListener (the clean way))

问题

我在项目上使用Spring(boot),并使用以下命令访问JMS队列(ActiveMQ):

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

它运行完美,但是我需要能够以编程方式停止/暂停/启动此Bean(REST调用或类似的东西)

当我停止或暂停该bean时,我想确保已完全处理了当前消息。

有什么想法吗?

谢谢

回答1

这是我找到的解决方案

@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";
}

}
回答2

有一个类型为JmsListenerEndpointRegistry的bean(名称为org.springframework.jms.config.internalJmsListenerEndpointRegistry )。

您可以从注册表(全部或按名称)访问JMS侦听器容器,并在所需的容器上调用stop() 。 在任何处理中的消息完成处理后,容器将停止。

回答3
   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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何使用python-daemon设置守护程序?(How do I set up a daemon with python-daemon?)
    问题 我是守护程序的新手,所以很抱歉,如果这是一个新手问题。 在其他几个答案(例如,这个问题)中,人们建议使用python-daemon软件包,因为它完全实现了PEP 3143标准。 不幸的是,python-daemon对文档有点了解(或更可能我对知识/经验有点了解...;)),而且我认为我可能缺少了一些非常基本的东西。 这是我在做什么: 我有以下几点: import daemon logfile = open('daemon.log', 'w') context = daemon.DaemonContext(stdout = logfile, stderr = logfile) context.open() with context: do_something_1() do_something_2() 问题:如何使用python-daemon设置守护程序,如何启动和停止它? 旁注: 我基本上对.open()方法应该在这里/是否应该使用方面.open()了疯狂的猜测-在这一点上,文档还不是很清楚。 无论是否包含它,似乎都会发生相同的事情。 那么,现在我该怎么办? 当我尝试运行此文件时,例如: python startConsumerDaemons.py 它似乎运行do_something_1() ,但没有运行第二个。 而且,它似乎离开附着在终端窗口的程序。 IE
  • Media Player启动停止启动(Media Player start stop start)
    问题 我正在制作一个新的android声音应用程序。 我单击了一个可单击的按钮来播放声音。 但是我也希望它第二次单击时停止播放声音。 现在该部分工作正常,这就是问题所在,当我再次单击按钮再次播放声音时,它没有播放,媒体播放器完全停止了。 我在论坛上看过,但似乎找不到可以帮助我的答案。 这是我的活动: MediaPlayer mpButtonClick1; MediaPlayer mpButtonClick2; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.prvi); final MediaPlayer mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm); final MediaPlayer mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs); Button dugme = (Button) findViewById(R.id.dugme); dugme.setOnClickListener
  • 重新启动.NET中的线程(使用C#)(Restarting a thread in .NET (using C#))
    问题 我正在寻找一种重新启动已被Abort()停止的线程的方法。 public partial class MyProgram : Form { private Thread MyThread = new Thread(MyFunction); private System.Windows.Forms.Button startStopBtn = new System.Windows.Forms.Button(); public MyProgram() { MyThread.Start(); startStopBtn += new EventHandler(doStop); startStopBtn.Text = "Stop"; } private static void MyFunction() { // do something } private void doStop(object sender, EventArgs e) { MyThread.Abort(); startStopBtn -= new EventHandler(doStop); startStopBtn += new EventHandler(doStart); startStopBtn.Text = "Start"; } private void doStart(object sender
  • 如何定期使用asyncio执行功能?(How can I periodically execute a function with asyncio?)
    问题 我正在从tornado迁移到asyncio ,我找不到与tornado的PeriodicCallback等效的asyncio 。 ( PeriodicCallback有两个参数:要运行的函数和两次调用之间的毫秒数。) asyncio有这样的等效asyncio吗? 如果不是这样,这将是实现这个不运行得到一个风险的干净的方式RecursionError经过一段时间? 回答1 对于3.5以下的Python版本: import asyncio @asyncio.coroutine def periodic(): while True: print('periodic') yield from asyncio.sleep(1) def stop(): task.cancel() loop = asyncio.get_event_loop() loop.call_later(5, stop) task = loop.create_task(periodic()) try: loop.run_until_complete(task) except asyncio.CancelledError: pass 对于Python 3.5及更高版本: import asyncio async def periodic(): while True: print('periodic') await
  • 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
  • 如何阻止C ++控制台应用程序立即退出?(How to stop C++ console application from exiting immediately?)
    问题 最近,我一直在尝试从该网站学习C ++。 不幸的是,每当我尝试运行其中一个代码示例时,我都会看到该程序打开大约半秒钟,然后立即关闭。 有没有一种方法可以阻止程序立即关闭,以便我可以看到自己的努力成果? 回答1 编辑:正如查尔斯·贝利(Charles Bailey)在下面的评论中正确指出的那样,如果在stdin缓冲了字符,则此方法将无效,并且实际上没有解决此问题的好方法。 如果您运行的是带有调试器的设备,则John Dibling提出的建议解决方案可能是解决问题的最干净的解决方案。 就是说,我将其留在这里,也许其他人会发现它很有用。 在开发过程中编写测试时,我经常使用它作为各种技巧。 在main函数的最后,您可以调用std :: getchar();。 这将从stdin获得一个字符,从而使您具有“按任意键继续”的行为(如果您实际上想要“按任意键”消息,则必须自己打印一个)。 您需要#include <cstdio>以获得getchar 。 回答2 如果您使用的是Visual Studio,并且正在从IDE中启动控制台应用程序,则: 按CTRL-F5 (无需调试即可启动)将启动应用程序,并使控制台窗口保持打开状态,直到您按任意键。 回答3 James的解决方案适用于所有平台。 或者,在Windows您也可以在从main功能返回之前添加以下内容: system("pause")
  • 如何在一个命令中停止mongo DB(How to stop mongo DB in one command)
    问题 我需要能够在cli上启动/停止MongoDB。 开始非常简单: ./mongod 但是要停止mongo DB,我需要先运行open mongo shell,然后键入两个命令: $ ./蒙古使用管理员 db.shutdownServer() 所以我不知道如何在一行中停止mongo DB。 有什么帮助吗? 回答1 MongoDB手册中介绍了启动和停止MongoDB。 它说明了通过外壳,cli,驱动程序等停止MongoDB的各种选项。还详细介绍了错误地停止MongoDB的风险(例如数据损坏),并讨论了不同的终止信号。 此外,如果您已使用Ubuntu或Debian的软件包管理器安装了MongoDB,则可以按以下方式停止mongodb(当前在ubuntu中为mongod): 新贵: sudo service mongod stop Sysvinit: sudo /etc/init.d/mongod stop 或在Mac OS X上 使用$ top查找mongod进程的PID 通过$ kill <PID>终止进程(Mongo文档对此有更多信息) 或在基于Red Hat的系统上: service mongod stop 或在Windows上(如果已安装为名为MongoDB的服务): net stop MongoDB 如果未安装为服务(从Windows 7+开始),则可以运行:
  • 如何使用onResume()?(How to use onResume()?)
    问题 谁能给我一个在Android中使用onResume()的示例吗? 另外,如果我想在另一个执行结束时重新启动活动,则执行哪个方法— onCreate()或onResume() ? 如果要更新数据,如何将其放入onResume()? 回答1 任何重新启动的Activity都会先执行其onResume()方法。 要使用此方法,请执行以下操作: @Override public void onResume(){ super.onResume(); // put your code here... } 回答2 重新启动应用程序将调用OnCreate() 。 暂停时继续运行该应用程序将调用OnResume() 。 根据https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle上的官方文档,这是活动生命周期的图表。 回答3 最好的理解方法是在您的活动中覆盖所有LifeCycle方法,并在其中的每个位置放置一个断点(如果在模拟器中签入)或一个日志。 您将了解何时呼叫哪个人。 就像破坏者一样,首先会调用onCreate() ,然后如果您通过进入主屏幕或启动另一个活动来暂停活动,则会调用onPause() 。 如果OS同时破坏了活动, onDestroy()调用onDestroy() 。
  • WebView线程永不停止(WebViewCoreThread,CookieSyncManager,http [0-3])(WebView threads never stop (WebViewCoreThread, CookieSyncManager, http[0-3]))
    问题 我使用WebView在我们的应用程序的“活动”中显示一些Internet内容。 问题是,当用户退出该活动时,WebView的线程将继续运行! 有问题的线程是: Thread [<17> WebViewCoreThread] (Running) Thread [<25> CookieSyncManager] (Running) Thread [<19> http0] (Running) Thread [<29> http1] (Running) Thread [<31> http2] (Running) Thread [<33> http3] (Running) 暂停以下每个线程,并检查其正在做什么: Thread [<17> WebViewCoreThread] (Suspended) Object.wait(long, int) line: not available [native method] MessageQueue(Object).wait() line: 288 MessageQueue.next() line: 148 Looper.loop() line: 110 WebViewCore$WebCoreThread.run() line: 471 Thread.run() line: 1060 Thread [<25> CookieSyncManager]
  • 如何在Java中启动/停止/重新启动线程?(How to start/stop/restart a thread in Java?)
    问题 我很难找到一种方法来启动,停止和重新启动Java中的线程。 具体来说,我在Task.java文件中有一个Task类(当前实现Runnable )。 我的主应用程序需要能够在线程上启动此任务,在需要时停止(杀死)该线程,有时还可以杀死并重新启动该线程... 我的第一次尝试是使用ExecutorService但似乎找不到办法重新启动任务。 当我使用.shutdownnow()将来对.execute()调用.execute()失败,因为ExecutorService是“ shutdown”的... 那么,我该怎么做呢? 回答1 一旦线程停止,您将无法重新启动它。 但是,没有什么可以阻止您创建和启动新线程。 选项1:创建一个新线程,而不是尝试重新启动。 选项2:与其让线程停止,不如让它等待,然后当它收到通知时,可以允许它再次工作。 这样,线程永远不会停止,也永远不需要重新启动。 根据评论进行编辑: 要“杀死”线程,您可以执行以下操作。 yourThread.setIsTerminating(true); // tell the thread to stop yourThread.join(); // wait for the thread to stop 回答2 除非在该线程中运行的代码进行检查并允许终止,否则无法终止线程。 您说:“遗憾的是,我必须杀死/重新启动它
  • 如何以编程方式在远程机器上停止/启动Windows服务?(How can I programmatically stop/start a windows service on a remote box?)
    问题 我想编写一个控制台或单击一次WinForms应用程序,以编程方式在远程框中停止和/或启动Windows服务。 这两个盒子都运行.NET 3.5-可以使用哪些.NET API来完成此操作? 回答1 在C#中: var sc = new System.ServiceProcess.ServiceController("MyService", "MyRemoteMachine"); sc.Start(); sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running); sc.Stop(); sc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped); 回答2 您也可以使用sc命令从命令控制台执行此操作: sc <server> start [service name] sc <server> stop [service name] 用 sc <server> query | find "SERVICE_NAME" 获取服务名称列表。 选项<server>的格式为\\ServerName 例子 sc \\MyServer stop schedule将停止计划程序服务。 回答3 ServiceController。
  • 在Google Chrome浏览器中进行调试时,如何终止脚本执行?(How to terminate script execution when debugging in Google Chrome?)
    问题 在Google Chrome调试器中逐步浏览JavaScript代码时,如果我不想继续,如何终止脚本执行? 我发现的唯一方法是关闭浏览器窗口。 按“重新加载此页面”将运行其余代码,甚至就像按F8“继续”一样提交表单。 更新: 在脚本暂停时按F5(刷新)时: Google Chrome(v22)运行脚本。 如果脚本提交了HTTP请求,则显示该请求的HTTP响应。 原始页面未刷新。 IE 9只是冻结。 但是IE有一个选项“ Stop Debugging”(停止调试),如果按下该按钮(前提是您之前没有按F5键),它将继续在调试器之外运行脚本。 Firebug的行为与Chrome相同。 关闭浏览器窗口然后再次打开并不是总是最简单的方法,因为它会终止浏览器会话状态,这可能很重要。 您所有的断点也会丢失。 更新(2014年1月) : 调试时刷新: Chrome v31:允许脚本运行并在进一步的断点处停止(但不提交ajax请求),然后刷新。 IE 11:刷新没有任何作用,但是您可以按F5继续。 Firefox v26:允许脚本运行,但不会在进一步的断点处停止,提交ajax请求,然后刷新。 有点进步! 调试时导航至同一页面: Chrome v31:与“刷新”相同。 IE 11:脚本已终止,新的浏览器会话已启动(与关闭并再次打开相同)。 Firefox v26:什么也没发生。 此外,
  • 如何暂停/播放NSTimer?(How to Pause/Play NSTimer?)
    问题 我需要在执行的0:0:0之前启动NSTimer,单击时有一个暂停按钮,如果用户单击播放,计时器必须在一段时间后暂停,它必须从暂停的时间值开始运行。 如何在NSTimer中暂停播放? 有什么帮助吗? 提前致谢。 回答1 试试这个闪闪发光...对我来说很棒 编辑 老实说,我的实际代码是这样的: -(IBAction)clicked:(id)sender { if ([startStop.titleLabel.text isEqualToString:@"Start"]) { [startStop setTitle:@"Pause" forState:UIControlStateNormal]; [startStop setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countUp) userInfo:nil repeats:YES]; timerDown = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countDown)
  • 停止/启动远程Windows服务并等待其打开/关闭(Stopping/Starting a remote Windows service and waiting for it to open/close)
    问题 这个问题的最高答案告诉我如何停止/启动远程服务。 伟大的。 现在,我需要等待实际的停止/启动完成。 所以,我要寻找的是一个dos命令来: 启动服务,应仅在服务启动后(或在超时后提高错误级别)返回停止服务,仅在服务停止后返回 回答1 我创建了一组使用sc.exe来执行此操作的批处理脚本。 它们附在下面。 要运行这些脚本,您应该是在目标计算机上具有管理权限的用户,并应从属于同一域的成员的计算机上运行该脚本。 可以将其设置为可以从域外部运行(例如从VPN),但是要涉及防火墙,DCOM和安全凭证,需要进行很多层安全工作。 这些天之一,我要弄清楚PowerShell的等效项,这应该容易得多。 safeServiceStart.bat @echo off :: This script originally authored by Eric Falsken IF [%1]==[] GOTO usage IF [%2]==[] GOTO usage ping -n 1 %1 | FIND "TTL=" >NUL IF errorlevel 1 GOTO SystemOffline SC \\%1 query %2 | FIND "STATE" >NUL IF errorlevel 1 GOTO SystemOffline :ResolveInitialState SC \\%1 query
  • 如何在GCD队列上停止/取消/暂停/恢复任务(How to stop/cancel/suspend/resume tasks on GCD queue)
    问题 如何在GCD队列上停止/取消/暂停/恢复任务 如何停止后台队列操作? 我想停止我们应用程序中的某些屏幕。 在某些屏幕上,它应该是自动恢复的。 那么,如何在iOS中传递队列? 我的意思是,当用户浏览应用程序时,我们在dispatch_queue_t中运行后台线程。 但是它永远不会停止并在代码中恢复。 那么如何暂停和恢复队列 回答1 要挂起调度队列,在Objective-C或Swift 2.3中只是dispatch_suspend(queue) ,在Swift 3中queue.suspend() ,这不会影响当前正在运行的任何任务,而只是阻止新任务在该队列上启动。 另外,显然,您仅挂起您创建的队列(不是全局队列,不是主队列)。 要恢复调度队列,在Objective-C或Swift 2.3中为dispatch_resume(queue) ,在Swift 3中为queue.resume() 。没有“自动恢复”的概念,因此您只需要在适当的时候手动恢复它即可。 。 各地要通过调度队列,您只需通过dispatch_queue_t对象,您创建时你叫dispatch_queue_create()在Objective-C或雨燕2.3,或在斯威夫特3, DispatchQueue你DispatchQueue(标签创建对象:)。 在取消排队在调度队列中的任务方面,这是iOS 8的一项新功能
  • 如何在Android中单击按钮时停止Runnable?(How to stop Runnable on button click in Android?)
    问题 我必须在“开始”按钮单击时开始运行,然后在“暂停”按钮单击时停止运行。 我的启动按钮单击时可运行的启动代码是 // TODO Auto-generated method stub //while (running) { mUpdateTime = new Runnable() { public void run() { sec += 1; if(sec >= 60) { sec = 0; min += 1; if (min >= 60) { min = 0; hour += 1; } } Min_txtvw.setText(String.format(mTimeFormat, hour, min, sec)); mHandler.postDelayed(mUpdateTime, 1000); } }; mHandler.postDelayed(mUpdateTime, 1000); //} 现在我想在单击暂停按钮时停止运行 pause_btn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub play_btn.setVisibility(View.VISIBLE); pause_btn
  • 如何创建Tkinter GUI停止按钮以打破无限循环?(How do you create a Tkinter GUI stop button to break an infinite loop?)
    问题 因此,我有一个Tkinter GUI,其中有两个简单的选项,即开始和停止按钮。 我已经定义了GUI布局: from Tkinter import * def scanning(): while True: print "hello" root = Tk() root.title("Title") root.geometry("500x500") app = Frame(root) app.grid() 此处的“开始”按钮运行无限循环扫描,而“停止”按钮在按下时应会中断: start = Button(app, text="Start Scan",command=scanning) stop = Button(app, text="Stop",command="break") start.grid() stop.grid() 但是,当我按下“开始”按钮时,它总是被按下(假设由于无限循环)。 但是,我无法单击“停止”按钮来退出while循环。 回答1 您无法在Tkinter事件循环所处的同一线程中启动while True:循环。这样做会阻塞Tkinter的循环并导致程序冻结。 对于一个简单的解决方案,您可以使用Tk.after每秒钟左右在后台运行一个进程。 下面是一个脚本来演示: from Tkinter import * running = True # Global flag
  • 如何以编程方式暂停NSTimer?(How can I programmatically pause an NSTimer?)
    问题 我正在使用NSTimer在基于OpenGL的iPhone应用程序中进行一些渲染。 我有一个弹出对话框,要求用户输入。 当用户提供输入时,我想“暂停”,例如: [myNSTimer pause]; 我使用这种语法是因为我一直在做以下事情: [myNSTimer invalidate]; 当我希望它停止时。 如何以编程方式暂停NSTimer? 回答1 从这里: http://discussions.apple.com/thread.jspa?threadID=1811475&tstart=75 “您可以存储自计时器启动以来已过去的时间...计时器启动时,将日期存储在NSDate变量中。然后,当用户切换时...在NSDate类中使用timeIntervalSinceNow方法存储多少时间时间已过去...请注意,这将给timeIntervalSinceNow赋予负值,当用户返回时,使用该值来设置适当的计时器。 我认为没有办法暂停和重新启动计时器。 我也遇到过类似的情况。 ” 回答2 刚想到要更新对kapesoftware答案的次要修补程序: NSDate *pauseStart, *previousFireDate; -(void) pauseTimer:(NSTimer *)timer { pauseStart = [[NSDate
  • 持续暂停/停止和启动/恢复Java TimerTask吗?(Pausing/stopping and starting/resuming Java TimerTask continuously?)
    问题 我有一个关于Java TimerTask的简单问题。 如何根据特定条件暂停/恢复两个TimerTask任务? 例如,我有两个相互之间运行的计时器。 当在第一计时器的任务内满足某个条件时,第一计时器停止并启动第二计时器,当在第二计时器的任务内满足某个条件时,也会发生相同的事情。 以下课程准确地说明了我的意思: public class TimerTest { Timer timer1; Timer timer2; volatile boolean a = false; public TimerTest() { timer1 = new Timer(); timer2 = new Timer(); } public void runStart() { timer1.scheduleAtFixedRate(new Task1(), 0, 1000); } class Task1 extends TimerTask { public void run() { System.out.println("Checking a"); a = SomeClass.getSomeStaticValue(); if (a) { // Pause/stop timer1, start/resume timer2 for 5 seconds timer2.schedule(new Task2()
  • 编辑并继续:“在以下情况下不允许更改”(Edit and Continue: “Changes are not allowed when…”)
    问题 即使我创建了一个干净的WinForms项目,“编辑并继续”也不起作用,并给了我错误: 当调试器已附加到已经在运行的进程中,或者在构建或运行时对要调试的代码进行了优化时,则不允许进行更改。 在“工具”→“选项”→“调试”中选中“编辑并继续”选项。 未启用优化。 似乎没有任何托管的事件探查器设置。 我在调试模式下运行我在x64 CPU和32位Windows XP上运行,但是将平台目标设置为x86而不是AnyCpu并没有帮助。 修复Visual Studio安装无济于事。 我也在MSDN网站上找到了这篇文章: 不支持的方案在以下调试方案中,“编辑并继续”不可用: 在Windows 98上进行调试。 混合模式(本机/托管)调试。 SQL调试。 调试Dr.Watson转储。 未选中“在未处理的异常上展开调用堆栈”选项时,未处理的异常之后将编辑代码。 调试嵌入式运行时应用程序。 使用“附加到”来调试应用程序,而不是使用“调试”菜单中的“启动”来运行应用程序。 调试优化的代码。 当目标是64位应用程序时调试托管代码。 如果要使用“编辑并继续”,则必须将目标设置为x86。 (项目属性,“编译”选项卡,“高级编译器”设置。)。 由于构建错误而导致新版本构建失败后,调试旧版本的代码。 但是我可以对列表中的每个项目回答“否”。 它曾经工作过,但是几天前它停止工作了,我不知道可能是什么原因。 回答1