Благодаря этому плану развертывания я могу использовать activemq в кластере Kubernetes, работающем в AWS. Тем не менее, я все еще пытаюсь выяснить, почему это не работает для MySQL таким же образом.
Просто запустить
kubectl create -f activemq.yaml
делает свое дело. Очереди являются постоянными и даже завершают работу модуля, а перезапуск вызывает очереди. Они остаются до тех пор, пока не будут удалены постоянный том и утверждение. С этим шаблоном мне даже не нужно явно создавать том.
apiVersion: apps/v1
kind: Deployment
metadata:
name: activemq-deployment
labels:
app: activemq
spec:
replicas: 1
selector:
matchLabels:
app: activemq
template:
metadata:
labels:
app: activemq
spec:
securityContext:
fsGroup: 2000
containers:
- name: activemq
image: activemq:1.0
ports:
- containerPort: 8161
volumeMounts:
- name: activemq-data
mountPath: /opt/apache-activemq-5.15.6/data
readOnly: false
volumes:
- name: activemq-data
persistentVolumeClaim:
claimName: amq-pv-claim
---
apiVersion: v1
kind: Service
metadata:
name: amq-nodeport-service
spec:
selector:
app: activemq
ports:
- port: 8161
targetPort: 8161
type: NodePort
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: amq-pv-claim
spec:
#storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
Необходимо проверить Систему. ComponentModel. BindingList, конкретно событие ListChanged.
BindingList вероятен Ваш наилучший вариант, поскольку он имеет встроенное отслеживание изменений и множество существующих событий, которые можно использовать. Ниже пример представления пользовательского события для, Добавляют который вперед к событию BindingList.
class Example
{
private BindingList<string> m_names = new BindingList<string>();
public IEnumerable<string> Names { get { return m_names; } }
public event AddingNewEventHandler NamesAdded
{
add { m_names.AddingNew += value; }
remove { m_names.AddingNew -= value; }
}
public void Add(string name)
{
m_names.Add(name);
}
}
Одной альтернативой BindingList является ObservableCollection - в этом случае Вы хотели бы подписать свой собственный обработчик событий на событие CollectionChanged и запустить Ваше событие в зависимости от действия.
David Mohundro показывает один подход; еще одна опция состоит в том, чтобы наследоваться Набору <T> и переопределить различные методы:
class Foo {}
class FooCollection : Collection<Foo>
{
protected override void InsertItem(int index, Foo item)
{
// your code...
base.InsertItem(index, item);
}
protected override void SetItem(int index, Foo item)
{
// your code...
base.SetItem(index, item);
}
// etc
}
Наконец, Вы могли создать свой собственный список (IList, IList <T>) от первых принципов - большая работа, мало преимущества.
Неправославный подход мог бы использовать платформу AOP, такую как PostSharp, чтобы "соткать" обработчик прежде чем/после того, как средство доступа называют, который запускает событие.
Вы создаете внешний класс, который содержит пред и/или сообщение, обрабатывающее код для того, когда к Вашему свойству получают доступ, проверьте, генерирует ли значение свойства, измененного между пред и сообщение, и, событие.
Примите во внимание, что при принятии значение для сравнения (в коде обработчика), Вы могли бы войти в бесконечный цикл (Вы называете средство доступа свойства, которое называет обработчик AOP, который называет средство доступа и так далее), таким образом, Вы, возможно, должны были бы отразиться в класс, содержащий это свойство для достижения отступающего поля.