ActiveMQ 使用總結

2021-08-29 13:02:17 字數 2971 閱讀 1844

activemq faq(使用中遇到的問題,大多在這裡可以找到):

紅眼web觀察:

activemq中的訊息永續性:

結合spring使用activemq進行非同步訊息呼叫:

activemq中的安全機制:

結合spring2.0和activemq進行非同步訊息呼叫:

activemq(ver 3.2.1)的jndi支援:

liferay 使用activemq時,每次啟動都會重新生成derby,無法重發因為服務停止時,滯留在訊息佇列的訊息。首先就要配置activemq每次從同乙個資料庫訪問,增加乙個broker(詳見《紅眼web觀察》)

但此時仍然無法保證因為網路問題、伺服器繁忙、郵件伺服器問題等引起的無法正確投遞的問題。

因為session沒有使用事務,在出錯丟擲異常時沒有回滾。

queuesession session = con.createqueuesession(false,session.auto_acknowledge);

即使使用事務,並且出錯回滾的話仍然有問題。假如是因網路問題無法連線到郵件伺服器等大問題時,

回滾後會繼續傳送本條訊息,此時因網路問題不可能一時解決,jms就持續不斷的傳送該訊息,會導致cpu 100%。

這樣看來事務回滾也不是好的方法,只有在出錯時記錄到自己的db中,然後寫乙個job或是task,每隔一段時間對因錯沒有傳送的訊息重新傳送,也就是將其放置重新到佇列當中。

同樣的問題也存在將訊息放置到佇列中的情況,無法保證放置時出錯後訊息的重發,也要在出錯時將訊息儲存到自己的db中。

activemq derby的指令碼:

alter table activemq_txs drop constraint sql070117092033990;

alter table activemq_msgs drop constraint sql070117092033260;

alter table activemq_acks drop constraint sql070117092034180;

drop index sql070117092033260;

drop index sql070117092033990;

drop index sql070117092034180;

drop index activemq_msgs_cidx;

drop index activemq_acks_cidx;

drop index activemq_msgs_midx;

drop table activemq_msgs;

drop table activemq_acks;

drop table activemq_txs;

create table activemq_msgs (

id integer not null,

container varchar(250),

msgid varchar(250),

msg blob(1048576),

expiration bigint,

sent_to_deadletter char(1)

);create table activemq_acks (

sub varchar(250) not null,

container varchar(250) not null,

last_acked_id integer,

se_id integer,

se_client_id varchar(250),

se_consumer_name varchar(250),

se_selector varchar(250)

);create table activemq_txs (

xid varchar(250) not null

);create unique index sql070117092033260 on activemq_msgs (id asc);

create unique index sql070117092033990 on activemq_txs (xid asc);

create unique index sql070117092034180 on activemq_acks (sub asc, container asc);

create index activemq_msgs_cidx on activemq_msgs (container asc);

create index activemq_acks_cidx on activemq_acks (container asc);

create index activemq_msgs_midx on activemq_msgs (msgid asc);

alter table activemq_txs add constraint sql070117092033990 primary key (xid);

alter table activemq_msgs add constraint sql070117092033260 primary key (id);

alter table activemq_acks add constraint sql070117092034180 primary key (sub, container);

注:用mysql 的話,表activemq_txs的字段sub和container 長度改為150.詳見《activemq中的訊息永續性》

自己資料庫訪問訊息的pojo:

public class mailmessage implements serializable

public void setserialiablemsg(serializable serialiablemsg)

public long getid()

public void setid(long id)

protected blob getmessage()

protected void setmessage(blob message)

ActiveMQ使用總結

1 activemq支援訊息過濾設定規則和用法 selector支援下列幾種方式 1 string literals color blue 2 byte strings mybytes 0x0afc23 3 numeric values noltemsinstock 20 4 boolean lit...

activemq 使用總結

2 錯誤 channel was inactive for too long 伺服器訊息較長時間沒有訊息傳送時,客戶端會報這個錯誤 解決方法 在建立連線的uri中加入 wireformat.maxinactivityduration 0 3 採用failover方式連線導致卡死 解決方法 不採用fa...

ActiveMQ使用總結

1 activemq支援訊息過濾設定規則和用法 selector支援下列幾種方式 1 string literals color blue 2 byte strings mybytes 0x0afc23 3 numeric values noltemsinstock 20 4 boolean lit...