我有一个使用JMS op Oracle Oracle高级排队的应用程序.我想对队列表进行查询,该查询显示消息的内容(在我的例子中是XML).因此,当我从[queue_table]中选择'select user_data'时,我得到'AQ SYS.AQ $ _JMS_TEXT_MESSAGE'作为回复.
是否有一个功能,以便显示此消息的内容?像[queue_table]'中的'select FUNCTION(user_data)'之类的东西?
我用Google搜索,扫描了许多关于排队的Oracle文章,但我找不到这个东西.我怀疑有一种简单的方法可以做到这一点,但我找不到它.
有几种类似的Oracle技术 - Oracle Streams,Oracle Change Data Capture和Database Change Notification.
这些有什么区别?
它们与Oracle Advanced Queuing有关吗?
oracle cdc change-data-capture advanced-queuing oracle-streams
我正在研究Spring Boot和JMS的例子,是的,我对此很新
由于我们使用Oracle,因此我想将Spring Boot和JMS示例从ActiveMQ迁移到Oracle Advanced Queuing.但是我真的很少发现这方面的信息.
据我所知,我需要为Oracle版本替换下面的代码,但我没有设法找到方法.
@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
// This provides all boot's default to this factory, including the message converter
configurer.configure(factory, connectionFactory);
// You could still override some of Boot's default if necessary.
return factory;
Run Code Online (Sandbox Code Playgroud)
}
原始代码可以在Github找到
非常感谢帮助!
Oracle Streams AQ(高级队列)提供高度可扩展的数据库支持的排队功能.SQL Server(任何版本)中是否存在等效功能?
注意:我并不是简单地将表用作队列,而是使用特定的供应商提供的数据库平台增强功能.
我将Apache Camel与Oracle Advanced Queues和JMS结合使用时遇到了问题.
它是关于分发消息的应用程序.在Camel的帮助下,消息在Oracle Advanced Queues中接收并入队.然后将它们与Camel一起使用并转发到目标系统.对于消息传递失败的情况,高级队列中定义了重试计数,以便重复传递消息.
如果Camel现在将消息出列并将其发送到不可用的目标系统,则抛出HttpOperationFailedException或NoSuchEndpointException.这些被捕获并且执行了回滚.
此时,期望消息传递将按照重试计数中定义的频率重试,然后移动到异常队列.但是,发生的事情是队列中的下一条消息是发送的.
由于消息的内容部分地相互依赖,因此必须按顺序处理它们.
我认为JMS库的使用存在错误配置,但我不确定并且没有发现任何可以影响此行为的内容.
使用的JMS库是Oracle AqApi v 11.2.0.3.
以下是Camel路线的代码:
from("jms-camel-component:myComponent.AQ?jmsMessageType=Text").routeId("deliveryToTarget")
.transacted()
.setExchangePattern(ExchangePattern.InOut)
.setHeader(Exchange.HTTP_QUERY, constant("throwExceptionOnFailure=false"))
.setHeader(Exchange.CONTENT_TYPE, constant("application/xml; charset=UTF-8"))
.doTry()
.recipientList(header("endpointTarget"))
.endDoTry()
.process(ResponseProzessor.getInstance())
.log("Message was delivererd.")
.doCatch(HttpOperationFailedException.class, NoSuchEndpointException.class)
.process(ResponseProzessor.getInstance())
.log("Error occured.")
.rollback()
.end();
Run Code Online (Sandbox Code Playgroud)
这是JmsComponent配置:
JmsComponent jmsComponent = new JmsComponent(scc);
jmsComponent.setConnectionFactory(connectionFactory);
jmsComponent.setTransactionManager(tm);
jmsComponent.setMaxConcurrentConsumers(1);
jmsComponent.setMaxMessagesPerTask(1);
jmsComponent.setIncludeSentJMSMessageID(true);
Run Code Online (Sandbox Code Playgroud)
预先感谢您的帮助!
UPDATE
我想,我已经找到了描述行为的原因.高级队列上配置了延迟.只要延迟持续,队列中的下一条消息就会出列.消息不是随机出列的,它们根据优先级出列.
我真的认为这是必须在消费者身上配置的东西.是否有任何技巧可以配置camel-jms-component来消耗队列中的第一条消息,只要它没有被提交或移动到异常队列?我没有找到在camel上直接配置它的选项...
编辑:这似乎是将两个队列放在同一个模式中的事情。
我正在尝试使用队列传播进行实验,但在目标队列中没有看到记录。但这很容易是因为我没有准备好所有的部分。
有没有人可以发布测试用例?我将包括我在下面尝试的内容。我发现文档中的故障排除有点轻,传播是一个黑匣子,很难知道为什么它不动。
这是我所拥有的;没有笑。
CREATE OR REPLACE TYPE test_payload AS OBJECT(
test_id NUMBER,
test_dt DATE);
DECLARE
subscriber SYS.aq$_agent;
BEGIN
--- Create Originating Queue and start it
DBMS_AQADM.create_queue_table( queue_table => 'Test_MQT', queue_payload_type => 'Test_Payload',
multiple_consumers => TRUE ); --- multiple subscriber
DBMS_AQADM.create_queue( 'Test_Q', 'Test_MQT' );
DBMS_AQADM.start_queue( queue_name => 'Test_Q' );
--- Create Destination Queue and start it
DBMS_AQADM.create_queue_table( queue_table => 'Dest_MQT', queue_payload_type => 'Test_Payload',
multiple_consumers => TRUE );
DBMS_AQADM.create_queue( 'Dest_Q', 'Dest_MQT' );
DBMS_AQADM.start_queue( queue_name => 'Dest_Q' );
--- Add Subscriber and …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个有效的数据结构,这将允许我提示事件...也就是说,我将有一个应用程序,在任何时候执行,有可能,一个事件将被提出以便将来执行点...类似于:
所以我想拥有一个数据结构,我可以在任何时间在任何时间放入任何时间,我可以获得和(通过这样做)删除所有应有的事件...另外,如果加上将是,如果我能够从数据结构中删除一个事件(因为它已被取消)...虽然不太重要,因为我可以简单地将其标记为已取消...
我的第一个想法是,也许要做某种树,但我想删除 - 因事件部分需要大量的再平衡......
我正在考虑简单地使用int哈希,将时间戳映射到null或在那个时间点发生的事件堆栈...我认为在场景中,有很多事件(可能每秒多次 - 这就是我打算工作),毕竟这实际上并不是一个坏主意......
所以我渴望听到你的意见...... :)
编辑:
谢谢
back2dos
language-agnostic performance advanced-queuing data-structures
我正在实施 Oracle Advanced Queue,并且对它完全陌生。我对此有一些疑问。下面是我的代码:
package com;
/* Set up main class from which we will call subsequent examples and handle
exceptions: */
import java.sql.*;
import oracle.AQ.*;
public class test_aqjava
{
public static void main(String args[])
{
AQSession aq_sess = null;
try
{
aq_sess = createSession(args);
createAqTables(aq_sess);
enqueueMsg(aq_sess);
// dequeueMsg(aq_sess);
aq_sess.close();
/* now run the test: */
// runTest(aq_sess);
}
catch (Exception ex)
{
System.out.println("Exception-1: " + ex);
ex.printStackTrace();
}
}
public static AQSession createSession(String args[])
{
Connection db_conn;
AQSession aq_sess …
Run Code Online (Sandbox Code Playgroud) 我有Oracle 9.2和JMS的问题.我创建了PL/SQL例程来将XML文本(从文件或CLOB)发送到队列,但是这个例程不能编译.
我的代码看起来像(填充消息省略):
create or replace procedure jms_test(msg varchar2)
is
id pls_integer;
message sys.aq$_jms_stream_message;
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
msgid raw(16);
java_exp exception;
v_filehandle_input utl_file.file_type;
v_newline varchar2(32767);
pragma exception_init(java_exp, -24197);
begin
message := sys.aq$_jms_stream_message.construct;
message.set_string_property('FROM', 'TEST');
id := message.clear_body(-1);
end;
Run Code Online (Sandbox Code Playgroud)
甲骨文报告说:
Error(6,21): PLS-00201: identifier 'DBMS_AQ' must be declared
Run Code Online (Sandbox Code Playgroud)
我查看了一些新闻组并尝试了我发现的所有内容,但没有成功.
授予(成功)许多权利
desc dbms_aq显示了许多函数,如DEQUEUE,ENQUEUE,LISTEN …
我想查询具有包含特定值的字段的所有对象.例如,我有两个文件:
{"123": "apple", "217": "pear", "179": "orange"}
{"831": "pear", "189": "grapes"}
Run Code Online (Sandbox Code Playgroud)
并且想要获得具有值为"apple"的字段的所有对象,但我不知道该字段的名称.是否可以在MongoDB中指定查询来实现此目的?(对象中的数字键是子ID,对象中的值是长GUID)
advanced-queuing ×10
oracle ×7
java ×3
jms ×3
apache-camel ×1
cdc ×1
mongodb ×1
performance ×1
plsql ×1
queuing ×1
spring-boot ×1
spring-jms ×1
sql-server ×1