骆驼路线发布者未发布到JMS出站队列失败,并出现java.util.concurrent.RejectedExecutionException

时间:2019-08-15 19:49:49

标签: java apache-camel jms

因此,我有一条路由消耗一个队列中的JMS消息,并且希望将其发送到同一代理上的另一个队列。蓝图xml非常简单:

class ViewController: UIViewController {

    private static let linesKey = "linesKey"

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let fileURL = self.dataFileUrl()
        if FileManager.default.fileExists(atPath: fileURL.path!) {

            let codedData = try! Data(contentsOf: fileURL as URL)
            print(codedData)
            let unarchiver = try! NSKeyedUnarchiver(forReadingFrom: codedData)
            if unarchiver.containsValue(forKey: ViewController.linesKey) {
                print("viewDidLoad contains value")
            } else {
                print("viewDidLoad doesn't conains value")
            }

            let fourLines = unarchiver.decodeObject(forKey: ViewController.linesKey) as! FourLines?
            print(fourLines?.lines?.count)

        }
        let app = UIApplication.shared
        NotificationCenter.default.addObserver(self, selector: #selector(self.applicationWillResignActive(notification:)), name: UIApplication.willResignActiveNotification, object: app)
    }

    @objc func applicationWillResignActive(notification: NSNotification) {
        print("applicationWillResignActive")
        let fileURL = self.dataFileUrl()
        print(fileURL)
        let fourLines = FourLines()
        let array = (self.lineFields as NSArray).value(forKey: "text") as! [String]
        fourLines.lines = array
        let archiver = NSKeyedArchiver(requiringSecureCoding: true)
        archiver.encode(fourLines, forKey: ViewController.linesKey)
        let data = archiver.encodedData
        do {
            try data.write(to: fileURL as URL)
        } catch {
            print("Error is \(error)")
        }

    }

    @IBOutlet var lineFields: [UITextField]!

    func dataFileUrl() -> NSURL {
        let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        var url: NSURL?
        url = URL(fileURLWithPath: "") as NSURL
        do {
            try url = urls.first!.appendingPathComponent("data.archive") as NSURL
        } catch {
            print("Error is \(error)")
        }
        return url!
    }
}

但这不起作用!它使用并记录消息(因此连接工厂没有问题),但是在尝试发布时失败,并显示<camel:route id="from-jms-consumer-to-jms" trace="false"> <from uri="jms:queue:test" /> <log message="Message consumed :: ${body}" /> <to uri="jms:queue:other_test" /> </camel:route>

为什么?我尝试了一切:

  • 独立的连接工厂
  • 分池/不分池
  • 交易/非交易

但是,即使是这样的简单路由,在发布者上也会失败。

这是Camel 3.0.0-M4,我在JDK 9的Karaf 4.2.1上运行。没有其他问题。所有其他组件都可以工作,并且已经过单独测试。

我什至在Camel源代码中查看了java.util.concurrent.RejectedExecutionException的代码。有一个JmsPublisher isRunAllowed()返回了boolean的{​​{1}}。我不知道我可能会错过什么?线程池?关于JMSHeader的消息?我很困惑!

错误堆栈跟踪:

false

1 个答案:

答案 0 :(得分:0)

我让发布商在路径(https://camel.apache.org/message-endpoint.html)上使用“ toD”而不是“ to”

现在,事务管理器仍然抛出无法记录事务的错误,这表示连接不是“ NamedXAResource” wtf,但这至少意味着发布者正在发布